mirror of https://github.com/wb2osz/direwolf.git
Compare commits
517 Commits
Author | SHA1 | Date |
---|---|---|
|
390d4a8c27 | |
|
69407ccf84 | |
|
41e7851376 | |
|
c5c7d4a44d | |
|
e7b4650935 | |
|
21048d5d1a | |
|
3aa8097461 | |
|
3f3fed216b | |
|
9ae4edcabf | |
|
7935054ee3 | |
|
c499496bbc | |
|
0a1670f7c2 | |
|
7552105282 | |
|
de293a1f25 | |
|
2260df15a5 | |
|
6ed85d12b1 | |
|
62e4566cc9 | |
|
9807304d63 | |
|
091670a917 | |
|
7b9325ecb6 | |
|
fae30a6035 | |
|
786e43322f | |
|
34ba203532 | |
|
88e2222db6 | |
|
6b76e1d98d | |
|
6bd296bd7e | |
|
ab834f338b | |
|
3c73a6b2b2 | |
|
877d1c7707 | |
|
ba0313ca78 | |
|
a08d0939b5 | |
|
7a8e4320ac | |
|
a87b72e040 | |
|
2434e5f13b | |
|
dfc063f905 | |
|
80bbf5a553 | |
|
790c8ab723 | |
|
9d2ded2eec | |
|
c5ad945c3c | |
|
fed79a7978 | |
|
e84a622515 | |
|
f9cf42b291 | |
|
4008153334 | |
|
d6ae84daad | |
|
415a08da1e | |
|
a3d3143d21 | |
|
e53fa0c110 | |
|
0058145eff | |
|
b1b3e854be | |
|
577b2b3cf2 | |
|
f8b9cae461 | |
|
92a2097d30 | |
|
24a06aef9e | |
|
b1727345e0 | |
|
8e32286604 | |
|
8000e46c02 | |
|
5fb4081c86 | |
|
110b85a781 | |
|
4ac666df6a | |
|
4cd63df5be | |
|
75ccf181f9 | |
|
019ff3bda6 | |
|
11468f26f8 | |
|
eb813e5804 | |
|
7573f996c4 | |
|
dbb4777ba7 | |
|
cac83f2506 | |
|
b4b7b1388d | |
|
8a978876bd | |
|
8cb73d2507 | |
|
c25629a286 | |
|
8e289025d7 | |
|
04ecdbc6fc | |
|
0f92f463f4 | |
|
fedfef92cd | |
|
031c937cdb | |
|
ef573f2acf | |
|
399ffcccb3 | |
|
9553abc28e | |
|
1d452fe1ab | |
|
17d3d0a621 | |
|
07ea828c28 | |
|
397362787f | |
|
8913a852fd | |
|
d0fc24aa5d | |
|
acace8cd9a | |
|
429d095665 | |
|
30869c7afc | |
|
d11bd6f3f2 | |
|
59288b7c56 | |
|
c9ffbd71c3 | |
|
f97c024a90 | |
|
722fefbda6 | |
|
18c65f48a8 | |
|
368bc42337 | |
|
06d6cabb58 | |
|
3dd125e1e3 | |
|
a558348635 | |
|
7d3c1d100e | |
|
bb16c725b9 | |
|
0bd31ae16e | |
|
e108147655 | |
|
4f6ca0d389 | |
|
27019b4793 | |
|
26727bbace | |
|
89021dd50c | |
|
dcabb8f7a5 | |
|
0f2b241763 | |
|
366e0ab6e0 | |
|
42314b7219 | |
|
5dbe2ce136 | |
|
65869bc643 | |
|
eef35cf891 | |
|
45cd680b90 | |
|
9b9744ba15 | |
|
049614d16c | |
|
6442466a5d | |
|
9016fa5fe6 | |
|
53e9ff7908 | |
|
17b9336ce0 | |
|
8619b74c7b | |
|
023f675caa | |
|
3220931439 | |
|
1712fbcfb9 | |
|
b77762780f | |
|
257d2e3544 | |
|
1b3ed76584 | |
|
edc5707cfe | |
|
d10ccb6cc0 | |
|
6bfd22811c | |
|
b66c21d39b | |
|
6370b26d85 | |
|
0e68a7712a | |
|
73d5d139b4 | |
|
12de518fa9 | |
|
44df4a7612 | |
|
7fa91dd551 | |
|
09de2f6681 | |
|
e449e39d4d | |
|
0c285a0c6d | |
|
c18b562409 | |
|
677117bff0 | |
|
04b32c41c2 | |
|
a1afcbbafe | |
|
667e9caaf2 | |
|
7ac1262fdf | |
|
8683ddcbd6 | |
|
fe6cba2b0d | |
|
a30f90956b | |
|
81447ed49f | |
|
6513efd052 | |
|
5d02e0ba0e | |
|
14d6eed205 | |
|
6f95752cab | |
|
085e837a26 | |
|
1cad6edb42 | |
|
8bca4862b0 | |
|
52e3a5b3af | |
|
1d67b44669 | |
|
feb1034cca | |
|
042a0c44ed | |
|
07fdc7544f | |
|
c1e19601f5 | |
|
9922f176b2 | |
|
fdf660a7f1 | |
|
791982a5e4 | |
|
adebd06a05 | |
|
48b9bac872 | |
|
e272ff87c8 | |
|
714d03f1d8 | |
|
8ac14f86f5 | |
|
a20728762b | |
|
4a1aa2b148 | |
|
413855e791 | |
|
bfc708d014 | |
|
37f148ef25 | |
|
7cd027fcda | |
|
512e8f88a9 | |
|
fb888577fb | |
|
91bc2d9627 | |
|
e8f1133226 | |
|
79d80ccb8e | |
|
3960942488 | |
|
3a5f72acab | |
|
ff34d92776 | |
|
3a6a35785f | |
|
a10c2175fe | |
|
fda6f52437 | |
|
b12e56fef4 | |
|
3e4c28231a | |
|
c0fc5f052d | |
|
adae04b05f | |
|
7d4a49aecb | |
|
f0bd085a13 | |
|
0775e4b6a2 | |
|
0ed3cd2863 | |
|
96fdf71069 | |
|
909b703b7e | |
|
4b0395aeaf | |
|
d747620257 | |
|
74cf91cc98 | |
|
e2b32d1d2a | |
|
5fd8120de7 | |
|
e9482ca0b2 | |
|
45136a91eb | |
|
0edb44efc3 | |
|
6be428bea1 | |
|
dc40b461d0 | |
|
0661e23f21 | |
|
74a5c34a94 | |
|
b99f9f33c2 | |
|
3135bb570b | |
|
f293186403 | |
|
b41b4445fb | |
|
0dc7cba1c5 | |
|
65d8d265cd | |
|
c15903edb9 | |
|
e654ca46a6 | |
|
45cad0ff78 | |
|
cab47cfc48 | |
|
1484350465 | |
|
fde5bf6816 | |
|
e54b851633 | |
|
c2b231494a | |
|
7e44139eb3 | |
|
4e816f8f8d | |
|
033d509920 | |
|
63b78c9fae | |
|
1f2a5cfdb8 | |
|
f08ed518b3 | |
|
2d4a8f4907 | |
|
d5cec4dc84 | |
|
ff9eca682e | |
|
b382e5fb0f | |
|
249f5bd471 | |
|
747224ce57 | |
|
03939d25ba | |
|
6e92a4fa48 | |
|
362d19e073 | |
|
f73faec0b5 | |
|
690ed3e1d6 | |
|
c94628f547 | |
|
4444d3be5f | |
|
4de597a89e | |
|
1cf5a22333 | |
|
1ab26c66e2 | |
|
8fd4bebf45 | |
|
8cd1f87ef6 | |
|
184b2af329 | |
|
0e5049c08a | |
|
de98f26229 | |
|
6f8ac80afd | |
|
d06b644630 | |
|
df22522126 | |
|
a1c16a67ef | |
|
bc582cf24f | |
|
8c9741b3e4 | |
|
e35964ec98 | |
|
05828dc65f | |
|
edafba9fe6 | |
|
d9d6bb4257 | |
|
a7a84269fc | |
|
29c48ddcc8 | |
|
69fc783a17 | |
|
357f2e633c | |
|
316c8d8194 | |
|
3765f26554 | |
|
10ad90b3db | |
|
e6c721a58d | |
|
37cb5440a6 | |
|
c72d06c285 | |
|
e219426a37 | |
|
c59053536e | |
|
edaf661bb1 | |
|
e0c2c31181 | |
|
ca7db91da2 | |
|
e962246fd2 | |
|
342989b100 | |
|
ce6c617203 | |
|
742d046c40 | |
|
698ca1ea87 | |
|
4c5004b6a1 | |
|
90921b9376 | |
|
a32064571d | |
|
b37fda96fb | |
|
ad12fa86d6 | |
|
d6ea439f98 | |
|
a5f3de2222 | |
|
a4d87e4013 | |
|
7fc9f31fbc | |
|
d828a8abe3 | |
|
aea1eb7b41 | |
|
c559f0d443 | |
|
792569b991 | |
|
8a2138e16b | |
|
bfa7f4af93 | |
|
a1e2d1c3a8 | |
|
d0cad72955 | |
|
7b5fc163dc | |
|
f1b54df647 | |
|
71b3ca0047 | |
|
2d3a04d0f1 | |
|
ab3796905e | |
|
e3dc8bbf1b | |
|
c7dcfd141e | |
|
a46471bf36 | |
|
1a2de05e71 | |
|
07f2174be4 | |
|
08a691a02d | |
|
a5211f48fb | |
|
41a85d87a7 | |
|
e1a4716857 | |
|
ab40b1169e | |
|
ecf5fd1d59 | |
|
c13375a9ab | |
|
84efe8c59b | |
|
91d5b90e2a | |
|
a200f3da7e | |
|
b915842c9f | |
|
9eaf9e361c | |
|
20f9e15b8b | |
|
79df808d5d | |
|
c5526524b6 | |
|
4590e21934 | |
|
c0abb4b216 | |
|
da0a33ef2a | |
|
e0fcdb8835 | |
|
9a98aed96e | |
|
9665fa845b | |
|
331b5774f9 | |
|
11071bb06a | |
|
be705987e2 | |
|
f864874771 | |
|
220e7dd1c4 | |
|
4ecaf478cf | |
|
38ab57afa4 | |
|
22f645756d | |
|
e51002ac0c | |
|
6874a5d897 | |
|
8280971f55 | |
|
4814011498 | |
|
b40d3fa134 | |
|
49ea703af1 | |
|
09a984a790 | |
|
995fc89866 | |
|
182713f423 | |
|
4c6babebd0 | |
|
99d4d904b2 | |
|
2328ecdf55 | |
|
5e9d67834b | |
|
95c302566a | |
|
db4c07a2b1 | |
|
fa7d3bce47 | |
|
26599ec771 | |
|
c41841e859 | |
|
d8e9273403 | |
|
34aa3f84ea | |
|
2ac99a33dd | |
|
9febac9696 | |
|
78283e1991 | |
|
6ffef6ed52 | |
|
9cd305950f | |
|
3611971fe7 | |
|
37179479ca | |
|
50c5542f78 | |
|
5b00875549 | |
|
22c810e442 | |
|
f7742cf044 | |
|
2c11ac2476 | |
|
1740a04754 | |
|
656b1413db | |
|
590c82b040 | |
|
b81de60aec | |
|
5cb6e04c54 | |
|
9c2b8f9b1a | |
|
c9734c2bf7 | |
|
f6c0049e40 | |
|
59d6708698 | |
|
8047bebce3 | |
|
7efe0ab40b | |
|
33a34f3466 | |
|
c23ab04338 | |
|
cc84a610dd | |
|
753e619efa | |
|
c904b57d1d | |
|
6e34b5f472 | |
|
c0e135aa07 | |
|
30c52862a9 | |
|
00cdf7b18d | |
|
9d2c993f49 | |
|
678b09df3f | |
|
0dbb376129 | |
|
eb0da22067 | |
|
72470992aa | |
|
3a496aa566 | |
|
9e940b0b5a | |
|
ee2805a307 | |
|
a6f0ad5af7 | |
|
9cab65c8d7 | |
|
d8913f0dbe | |
|
b7ee6dc9c1 | |
|
facdfb9e19 | |
|
8c4c186730 | |
|
c7c60c4a35 | |
|
7fcee202ba | |
|
52927ce54a | |
|
647d698656 | |
|
ed67bdfd84 | |
|
4f4583dc37 | |
|
ebdc124a07 | |
|
c9f846becb | |
|
0da1a9176a | |
|
979fdf1767 | |
|
f358c621d0 | |
|
77f4eb4543 | |
|
4973ae8490 | |
|
1a0217ec19 | |
|
be7ee8211e | |
|
3ce981c196 | |
|
e2324f2e78 | |
|
e8f06d22a7 | |
|
7ef0b17687 | |
|
fa5627801b | |
|
cd564ae398 | |
|
cf55b774e6 | |
|
0da8a46add | |
|
a3e6f73cbb | |
|
bef8a97323 | |
|
23ea24641d | |
|
612c2dc928 | |
|
15b0f59e3a | |
|
607ae3be4d | |
|
c58b689433 | |
|
60fe31c6fc | |
|
9d2fbdd3f7 | |
|
433b283b0f | |
|
6b3c8a6a0d | |
|
aa28c9cadc | |
|
7f77b29e89 | |
|
2fec597581 | |
|
b6254da203 | |
|
785c8deffa | |
|
6be16ab3c8 | |
|
67b11d4922 | |
|
58c2707f7d | |
|
dc292ffcc9 | |
|
ded9a7842c | |
|
91839bcb1a | |
|
6207e2eb3e | |
|
02dbfcad2d | |
|
74ac4812d5 | |
|
3516de7f6a | |
|
40047e91d9 | |
|
01857c196e | |
|
200f669bbc | |
|
7a88785fad | |
|
d85abe214f | |
|
11e9e18e97 | |
|
2a08f33966 | |
|
b2548ec58f | |
|
6a3b1faf99 | |
|
3e9118ba17 | |
|
8509fe58ff | |
|
48aeb43829 | |
|
209a858a6a | |
|
4f1918c3af | |
|
ccae7529bf | |
|
8b9c6fcf4a | |
|
77a3b50eb8 | |
|
b35a674204 | |
|
8162648e57 | |
|
958f210843 | |
|
17e1166a7f | |
|
1f8b330185 | |
|
ce9eebf273 | |
|
5920ecda51 | |
|
35c3c29cc4 | |
|
283b768125 | |
|
28eda74485 | |
|
7125b5b22f | |
|
c6bff39a30 | |
|
7da6f7956b | |
|
f1f41b7ed1 | |
|
d491f51ce9 | |
|
12cb9108d7 | |
|
87d9fe00b8 | |
|
107a8125c7 | |
|
4406c1a5e3 | |
|
0c496541e5 | |
|
2424812883 | |
|
dc9bc8d90b | |
|
6d836c1faf | |
|
169bad18d1 | |
|
78b75e88fd | |
|
d6bf8102bf | |
|
d653a534c4 | |
|
b104f097e0 | |
|
b68039d2c6 | |
|
178375f3ba | |
|
95c22986ec | |
|
1053bc483f | |
|
d9ca8cdc52 | |
|
979385a78e | |
|
ebacfea517 | |
|
64f9313f77 | |
|
1376c0c2fb | |
|
80a1c182a2 | |
|
4c60979844 | |
|
565fa4c082 | |
|
b14f1d0ff2 | |
|
dd27f9960b | |
|
558315fe19 | |
|
569136e19c | |
|
a8114691b3 | |
|
a7391b4999 | |
|
01371079e2 | |
|
1646be7def |
|
@ -22,11 +22,20 @@
|
|||
*.cpp text
|
||||
*.h text
|
||||
*.pl text
|
||||
Makefile* text
|
||||
*.py text
|
||||
*.sh text
|
||||
*.txt text
|
||||
*.desktop text
|
||||
*.conf text
|
||||
*.rc text
|
||||
*.spec text
|
||||
*.bat text
|
||||
*.1 text
|
||||
*.md text
|
||||
COPYING text
|
||||
Makefile* text
|
||||
README* text
|
||||
|
||||
*.ico binary
|
||||
*.png binary
|
||||
|
||||
|
|
|
@ -0,0 +1,162 @@
|
|||
name: 'build direwolf'
|
||||
|
||||
on:
|
||||
# permit to manually trigger the CI
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
cmake_flags:
|
||||
description: 'Custom CMAKE flags'
|
||||
required: false
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.github/**'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.github/**'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.config.name }}
|
||||
runs-on: ${{ matrix.config.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- {
|
||||
name: 'Windows Latest MinGW 64bit',
|
||||
os: windows-latest,
|
||||
cc: 'x86_64-w64-mingw32-gcc',
|
||||
cxx: 'x86_64-w64-mingw32-g++',
|
||||
ar: 'x86_64-w64-mingw32-ar',
|
||||
windres: 'x86_64-w64-mingw32-windres',
|
||||
arch: 'x86_64',
|
||||
build_type: 'Release',
|
||||
cmake_extra_flags: '-G "MinGW Makefiles"'
|
||||
}
|
||||
- {
|
||||
name: 'Windows 2019 MinGW 32bit',
|
||||
os: windows-2019,
|
||||
cc: 'i686-w64-mingw32-gcc',
|
||||
cxx: 'i686-w64-mingw32-g++',
|
||||
ar: 'i686-w64-mingw32-ar',
|
||||
windres: 'i686-w64-mingw32-windres',
|
||||
arch: 'i686',
|
||||
build_type: 'Release',
|
||||
cmake_extra_flags: '-G "MinGW Makefiles"'
|
||||
}
|
||||
- {
|
||||
name: 'macOS latest',
|
||||
os: macos-latest,
|
||||
cc: 'clang',
|
||||
cxx: 'clang++',
|
||||
arch: 'x86_64',
|
||||
build_type: 'Release',
|
||||
cmake_extra_flags: ''
|
||||
}
|
||||
- {
|
||||
name: 'Ubuntu latest Debug',
|
||||
os: ubuntu-latest,
|
||||
cc: 'gcc',
|
||||
cxx: 'g++',
|
||||
arch: 'x86_64',
|
||||
build_type: 'Debug',
|
||||
cmake_extra_flags: ''
|
||||
}
|
||||
- {
|
||||
name: 'Ubuntu 22.04',
|
||||
os: ubuntu-22.04,
|
||||
cc: 'gcc',
|
||||
cxx: 'g++',
|
||||
arch: 'x86_64',
|
||||
build_type: 'Release',
|
||||
cmake_extra_flags: ''
|
||||
}
|
||||
- {
|
||||
name: 'Ubuntu 20.04',
|
||||
os: ubuntu-20.04,
|
||||
cc: 'gcc',
|
||||
cxx: 'g++',
|
||||
arch: 'x86_64',
|
||||
build_type: 'Release',
|
||||
cmake_extra_flags: ''
|
||||
}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 8
|
||||
- name: dependency
|
||||
shell: bash
|
||||
run: |
|
||||
# this is not perfect but enought for now
|
||||
if [ "$RUNNER_OS" == "Linux" ]; then
|
||||
sudo apt-get update
|
||||
sudo apt-get install libasound2-dev libudev-dev libhamlib-dev gpsd
|
||||
elif [ "$RUNNER_OS" == "macOS" ]; then
|
||||
# just to simplify I use homebrew but
|
||||
# we can use macports (latest direwolf is already available as port)
|
||||
brew install portaudio hamlib gpsd
|
||||
elif [ "$RUNNER_OS" == "Windows" ]; then
|
||||
# add the folder to PATH
|
||||
echo "C:\msys64\mingw32\bin" >> $GITHUB_PATH
|
||||
fi
|
||||
- name: create build environment
|
||||
run: |
|
||||
cmake -E make_directory ${{github.workspace}}/build
|
||||
- name: configure
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||
export CC=${{ matrix.config.cc }}
|
||||
export CXX=${{ matrix.config.cxx }}
|
||||
export AR=${{ matrix.config.ar }}
|
||||
export WINDRES=${{ matrix.config.windres }}
|
||||
fi
|
||||
cmake $GITHUB_WORKSPACE \
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config.build_type }} \
|
||||
-DCMAKE_C_COMPILER=${{ matrix.config.cc }} \
|
||||
-DCMAKE_CXX_COMPILER=${{ matrix.config.cxx }} \
|
||||
-DCMAKE_CXX_FLAGS="-Werror" -DUNITTEST=1 \
|
||||
${{ matrix.config.cmake_extra_flags }} \
|
||||
${{ github.event.inputs.cmake_flags }}
|
||||
- name: build
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||
export CC=${{ matrix.config.cc }}
|
||||
export CXX=${{ matrix.config.cxx }}
|
||||
export AR=${{ matrix.config.ar }}
|
||||
export WINDRES=${{ matrix.config.windres }}
|
||||
fi
|
||||
cmake --build . --config ${{ matrix.config.build_type }} \
|
||||
${{ github.event.inputs.cmake_flags }}
|
||||
- name: test
|
||||
continue-on-error: true
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: |
|
||||
ctest -C ${{ matrix.config.build_type }} \
|
||||
--parallel 2 --output-on-failure \
|
||||
${{ github.event.inputs.cmake_flags }}
|
||||
- name: package
|
||||
shell: bash
|
||||
working-directory: ${{github.workspace}}/build
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Windows" ] || [ "$RUNNER_OS" == "macOS" ]; then
|
||||
make package
|
||||
fi
|
||||
- name: archive binary
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: direwolf_${{ matrix.config.os }}_${{ matrix.config.arch }}_${{ github.sha }}
|
||||
path: |
|
||||
${{github.workspace}}/build/direwolf-*.zip
|
||||
${{github.workspace}}/build/direwolf.conf
|
||||
${{github.workspace}}/build/src/*
|
||||
${{github.workspace}}/build/CMakeCache.txt
|
||||
!${{github.workspace}}/build/src/cmake_install.cmake
|
||||
!${{github.workspace}}/build/src/CMakeFiles
|
||||
!${{github.workspace}}/build/src/Makefile
|
|
@ -0,0 +1,64 @@
|
|||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL - Python"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ dev ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ dev ]
|
||||
schedule:
|
||||
- cron: '25 8 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'python' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
setup-python-dependencies: true
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
|
@ -0,0 +1,74 @@
|
|||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL - CPP"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ dev ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ dev ]
|
||||
schedule:
|
||||
- cron: '25 8 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'cpp' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
setup-python-dependencies: true
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
- run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DUNITTEST=1 ..
|
||||
make
|
||||
make test
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
|
@ -6,6 +6,8 @@ z*
|
|||
*~
|
||||
*.xlsx
|
||||
*.stackdump
|
||||
*.wav
|
||||
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
|
@ -37,6 +39,26 @@ z*
|
|||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Binaries, other build results
|
||||
|
||||
aclients
|
||||
atest
|
||||
decode_aprs
|
||||
direwolf
|
||||
gen_fff
|
||||
gen_packets
|
||||
ll2utm
|
||||
log2gpx
|
||||
text2tt
|
||||
tt2text
|
||||
ttcalc
|
||||
utm2ll
|
||||
|
||||
direwolf.conf
|
||||
fsk_fast_filter.h
|
||||
direwolf.desktop
|
||||
|
||||
|
||||
# =========================
|
||||
# Operating System Files
|
||||
# =========================
|
||||
|
@ -83,3 +105,9 @@ $RECYCLE.BIN/
|
|||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
/use_this_sdk
|
||||
*.dSYM
|
||||
|
||||
# cmake
|
||||
build/
|
||||
tmp/
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,578 @@
|
|||
|
||||
# Revision History #
|
||||
|
||||
|
||||
## Version 1.7 -- October 2023 ##
|
||||
|
||||
|
||||
### New Documentation: ###
|
||||
|
||||
Additional documentation location to slow down growth of main repository. [https://github.com/wb2osz/direwolf-doc](https://github.com/wb2osz/direwolf-doc) . These are more oriented toward achieving a goal and understanding, as opposed to the User Guide which describes the functionality.
|
||||
|
||||
- ***APRS Digipeaters***
|
||||
|
||||
- ***Internal Packet Routing***
|
||||
|
||||
- ***Radio Interface Guide***
|
||||
|
||||
- ***Successful IGate Operation***
|
||||
|
||||
- ***Understanding APRS Packets***
|
||||
|
||||
|
||||
### New Features: ###
|
||||
|
||||
|
||||
|
||||
- New ICHANNEL configuration option to map a KISS client application channel to APRS-IS. Packets from APRS-IS will be presented to client applications as the specified channel. Packets sent, by client applications, to that channel will go to APRS-IS rather than a radio channel. Details in ***Internal-Packet-Routing.pdf***.
|
||||
|
||||
- New variable speed option for gen_packets. For example, "-v 5,0.1" would generate packets from 5% too slow to 5% too fast with increments of 0.1. Some implementations might have imprecise timing. Use this to test how well TNCs tolerate sloppy timing.
|
||||
|
||||
- Improved Layer 2 Protocol [(IL2P)](https://en.wikipedia.org/wiki/FX.25_Forward_Error_Correction). Compatible with Nino TNC for 1200 and 9600 bps. Use "-I 1" on command line to enable transmit for first channel. For more general case, add to config file (simplified version, see User Guide for more details):
|
||||
|
||||
> After: "CHANNEL 1" (or other channel)
|
||||
>
|
||||
> Add: "IL2PTX 1"
|
||||
|
||||
- Limited support for CM108/CM119 GPIO PTT on Windows.
|
||||
|
||||
- Dire Wolf now advertises itself using DNS Service Discovery. This allows suitable APRS / Packet Radio applications to find a network KISS TNC without knowing the IP address or TCP port. Thanks to Hessu for providing this. Currently available only for Linux and Mac OSX. [Read all about it here.](https://github.com/hessu/aprs-specs/blob/master/TCP-KISS-DNS-SD.md)
|
||||
|
||||
- The transmit calibration tone (-x) command line option now accepts a radio channel number and/or a single letter mode: a = alternate tones, m = mark tone, s = space tone, p = PTT only no sound.
|
||||
|
||||
- The BEACON configuration now recognizes the SOURCE= option. This replaces the AX.25 source address rather than using the MYCALL value for the channel. This is useful for sending more than 5 analog telemetry channels. Use two, or more, source addresses with up to 5 analog channels each.
|
||||
|
||||
- For more flexibility, the FX.25 transmit property can now be set individually by channel, rather than having a global setting for all channels. The -X on the command line applies only to channel 0. For other channels you need to add a new line to the configuration file. You can specify a specific number of parity bytes (16, 32, 64) or 1 to choose automatically based on packet size.
|
||||
|
||||
> After: "CHANNEL 1" (or other channel)
|
||||
>
|
||||
> Add: "FX25TX 1" (or 16 or 32 or 64)
|
||||
|
||||
|
||||
|
||||
### Bugs Fixed: ###
|
||||
|
||||
- The t/m packet filter incorrectly included bulletins. It now allows only "messages" to specific stations. Use of t/m is discouraged. i/180 is the preferred filter for messages to users recently heard locally.
|
||||
|
||||
- Packet filtering now skips over any third party header before classifying packet types.
|
||||
|
||||
- Fixed build for Alpine Linux.
|
||||
|
||||
### Notes: ###
|
||||
|
||||
The Windows binary distribution now uses gcc (MinGW) version 11.3.0.
|
||||
The Windows version is built for both 32 and 64 bit operating systems.
|
||||
Use the 64 bit version if possible; it runs considerably faster.
|
||||
|
||||
## Version 1.6 -- October 2020 ##
|
||||
|
||||
### New Build Procedure: ###
|
||||
|
||||
|
||||
- Rather than trying to keep a bunch of different platform specific Makefiles in sync, "cmake" is now used for greater portability and easier maintenance. This was contributed by Davide Gerhard.
|
||||
|
||||
- README.md has a quick summary of the process. More details in the ***User Guide***.
|
||||
|
||||
|
||||
### New Features: ###
|
||||
|
||||
|
||||
- "-X" option enables FX.25 transmission. FX.25 reception is always enabled so you don't need to do anything special. "What is FX.25?" you might ask. It is forward error correction (FEC) added in a way that is completely compatible with an ordinary AX.25 frame. See new document ***AX25\_plus\_FEC\_equals\_FX25.pdf*** for details.
|
||||
|
||||
- Receive AIS location data from ships. Enable by using "-B AIS" command line option or "MODEM AIS" in the configuration file. AIS NMEA sentences are encapsulated in APRS user-defined data with a "{DA" prefix. This uses 9600 bps so you need to use wide band audio, not what comes out of the speaker. There is also a "-A" option to generate APRS Object Reports.
|
||||
|
||||
- Receive Emergency Alert System (EAS) Specific Area Message Encoding (SAME). Enable by using "-B EAS" command line option or "MODEM EAS" in the configuration file. EAS SAME messages are encapsulated in APRS user-defined data with a "{DE" prefix. This uses low speed AFSK so speaker output is fine.
|
||||
|
||||
- "-t" option now accepts more values to accommodate inconsistent handling of text color control codes by different terminal emulators. The default, 1, should work with most modern terminal types. If the colors are not right, try "-t 9" to see the result of the different choices and pick the best one. If none of them look right, file a bug report and specify: operating system version (e.g. Raspbian Buster), terminal emulator type and version (e.g. LXTerminal 0.3.2). Include a screen capture.
|
||||
|
||||
|
||||
- "-g" option to force G3RUH mode for lower speeds where a different modem type may be the default.
|
||||
|
||||
- 2400 bps compatibility with MFJ-2400. See ***2400-4800-PSK-for-APRS-Packet-Radio.pdf*** for details
|
||||
|
||||
- "atest -h" will display the frame in hexadecimal for closer inspection.
|
||||
|
||||
- Add support for Multi-GNSS NMEA sentences.
|
||||
|
||||
|
||||
|
||||
### Bugs Fixed: ###
|
||||
|
||||
- Proper counting of frames in transmit queue for AGW protocol 'Y' command.
|
||||
|
||||
|
||||
|
||||
### New Documentation: ###
|
||||
|
||||
- ***AX.25 + FEC = FX.25***
|
||||
|
||||
- ***AIS Reception***
|
||||
|
||||
- ***AX.25 Throughput: Why is 9600 bps Packet Radio only twice as fast as 1200?***
|
||||
|
||||
- [***Ham Radio of Things (HRoT) - IoT over Ham Radio***](https://github.com/wb2osz/hrot)
|
||||
|
||||
- [***EAS SAME to APRS Message Converter***](https://github.com/wb2osz/eas2aprs)
|
||||
|
||||
- [***Dire Wolf PowerPoint Slide Show***](https://github.com/wb2osz/direwolf-presentation)
|
||||
|
||||
### Notes: ###
|
||||
|
||||
The Windows binary distribution now uses gcc (MinGW) version 7.4.0.
|
||||
The Windows version is built for both 32 and 64 bit operating systems.
|
||||
Use the 64 bit version if possible; it runs considerably faster.
|
||||
|
||||
|
||||
|
||||
## Version 1.5 -- September 2018 ##
|
||||
|
||||
|
||||
### New Features: ###
|
||||
|
||||
- PTT using GPIO pin of CM108/CM119 (e.g. DMK URI, RB-USB RIM), Linux only.
|
||||
|
||||
- More efficient error recovery for AX.25 connected mode. Better generation and processing of REJ and SREJ to reduce unnecessary duplicate "**I**" frames.
|
||||
|
||||
- New configuration option, "**V20**", for listing stations known to not understand AX.25 v2.2. This will speed up connection by going right to SABM and not trying SABME first and failing.
|
||||
|
||||
- New "**NOXID**" configuration file option to avoid sending XID command to listed station(s). If other end is a partial v2.2 implementation, which recognizes SABME, but not XID, we would waste a lot of time resending XID many times before giving up. This is less drastic than the "**V20**" option which doesn't even attempt to use v2.2 with listed station(s).
|
||||
|
||||
- New application "**kissutil**" for troubleshooting a KISS TNC or interfacing to an application via files.
|
||||
|
||||
- KISS "Set Hardware" command to report transmit queue length.
|
||||
|
||||
- TCP KISS can now handle multiple concurrent applications.
|
||||
|
||||
- Linux can use serial port for KISS in addition to a pseudo terminal.
|
||||
|
||||
- decode_aprs utility can now accept KISS frames and AX.25 frames as series of two digit hexadecimal numbers.
|
||||
|
||||
- Full Duplex operation. (Put "FULLDUP ON" in channel section of configuration file.)
|
||||
|
||||
- Time slots for beaconing.
|
||||
|
||||
- Allow single log file with fixed name rather than starting a new one each day.
|
||||
|
||||
|
||||
|
||||
### Bugs Fixed: ###
|
||||
|
||||
- Possible crash when CDIGIPEAT did not include the optional alias.
|
||||
|
||||
- PACLEN configuration item no longer restricts length of received frames.
|
||||
|
||||
- Strange failures when trying to use multiple KISS client applications over TCP. Only Linux was affected.
|
||||
|
||||
- Under certain conditions, outgoing connected mode data would get stuck in a queue and not be transmitted. This could happen if client application sends a burst of data larger than the "window" size (MAXFRAME or EMAXFRAME option).
|
||||
|
||||
|
||||
- Little typographical / spelling errors in messages.
|
||||
|
||||
|
||||
### Documentation: ###
|
||||
|
||||
|
||||
- New document ***Bluetooth-KISS-TNC.pdf*** explaining how to use KISS over Bluetooth.
|
||||
|
||||
- Updates describing cheap SDR frequency inaccuracy and how to compensate for it.
|
||||
|
||||
### Notes: ###
|
||||
|
||||
Windows binary distribution now uses gcc (MinGW) version 6.3.0.
|
||||
|
||||
----------
|
||||
|
||||
## Version 1.4 -- April 2017 ##
|
||||
|
||||
|
||||
### New Features: ###
|
||||
|
||||
- AX.25 v2.2 connected mode. See chapter 10 of User Guide for details.
|
||||
|
||||
- New client side packet filter to select "messages" only to stations that have been heard nearby recently. This is now the default if no IS to RF filter is specified.
|
||||
|
||||
- New beacon type, IBEACON, for sending IGate statistics.
|
||||
|
||||
- Expanded debug options so you can understand what is going on with packet filtering.
|
||||
|
||||
- Added new document ***Successful-APRS-IGate-Operation.pdf*** with IGate background, configuration, and troubleshooting tips.
|
||||
- 2400 & 4800 bps PSK modems. See ***2400-4800-PSK-for-APRS-Packet-Radio.pdf*** in the doc directory for discussion.
|
||||
|
||||
- The top speed of 9600 bps has been increased to 38400. You will need a sound card capable of 96k or 192k samples per second for the higher rates. Radios must also have adequate bandwidth. See ***Going-beyond-9600-baud.pdf*** in the doc directory for more details.
|
||||
|
||||
- Better decoder performance for 9600 and higher especially for low audio sample rate to baud ratios.
|
||||
|
||||
- Generate waypoint sentences for use by AvMap G5 / G6 or other mapping devices or applications. Formats include
|
||||
- $GPWPL - NMEA generic with only location and name.
|
||||
- $PGRMW - Garmin, adds altitude, symbol, and comment to previously named waypoint.
|
||||
- $PMGNWPL - Magellan, more complete for stationary objects.
|
||||
- $PKWDWPL - Kenwood with APRS style symbol but missing comment.
|
||||
|
||||
|
||||
- DTMF tones can be sent by putting "DTMF" in the destination address, similar to the way that Morse Code is sent.
|
||||
|
||||
- Take advantage of new 'gpio' group and new /sys/class/gpio ownership in Raspbian Jessie.
|
||||
|
||||
- Handle more complicated gpio naming for CubieBoard, etc.
|
||||
|
||||
- More flexible dw-start.sh start up script for both GUI and CLI environments.
|
||||
|
||||
|
||||
|
||||
### Bugs Fixed: ###
|
||||
|
||||
- The transmitter (PTT control) was being turned off too soon when sending Morse Code.
|
||||
|
||||
- The -qd (quiet decode) command line option now suppresses errors about improperly formed Telemetry packets.
|
||||
|
||||
- Longer tocall.txt files can now be handled.
|
||||
|
||||
- Sometimes kissattach would have an issue with the Dire Wolf pseudo terminal. This showed up most often on Raspbian but sometimes occurred with other versions of Linux.
|
||||
|
||||
*kissattach: Error setting line discipline: TIOCSETD: Device or resource busy
|
||||
Are you sure you have enabled MKISS support in the kernel
|
||||
or, if you made it a module, that the module is loaded?*
|
||||
|
||||
|
||||
- Sometimes writes to a pseudo terminal would block causing the received
|
||||
frame processing thread to hang. The first thing you will notice is that
|
||||
received frames are not being printed. After a while this message will appear:
|
||||
|
||||
*Received frame queue is out of control. Length=... Reader thread is probably
|
||||
frozen. This can be caused by using a pseudo terminal (direwolf -p) where
|
||||
another application is not reading the frames from the other side.*
|
||||
|
||||
- -p command line option caused segmentation fault with glibc >= 2.24.
|
||||
|
||||
|
||||
- The Windows version 1.3 would crash when starting to transmit on Windows XP. There have also been some other reports of erratic behavior on Windows. The crashing problem was fixed in in the 1.3.1 patch release. Linux version was not affected.
|
||||
|
||||
- IGate did not retain nul characters in the information part of a packet. This should never happen with a valid APRS packet but there are a couple cases where it has. If we encounter these malformed packets, pass them along as-is, rather than truncating.
|
||||
|
||||
- Don't digipeat packets when the source is my call.
|
||||
|
||||
|
||||
|
||||
----------
|
||||
|
||||
## Version 1.3 -- May 2016 ##
|
||||
|
||||
### New Features: ###
|
||||
|
||||
- Support for Mac OS X.
|
||||
|
||||
- Many APRStt enhancements including: Morse code and speech responses to to APRStt tone sequences, new 5 digit callsign suffix abbreviation,
|
||||
position ambiguity for latitude and longitude in object reports
|
||||
|
||||
- APRS Telemetry Toolkit.
|
||||
|
||||
- GPS Tracker beacons are now available for the Windows version. Previously this was only in the Linux version.
|
||||
|
||||
- SATgate mode for IGate. Packets heard directly are delayed before being sent
|
||||
to the Internet Server. This favors digipeated packets because the original
|
||||
arrives later and gets dropped if there are duplicates.
|
||||
|
||||
- Added support for hamlib. This provides more flexible options for PTT control.
|
||||
|
||||
- Implemented AGW network protocol 'M' message for sending UNPROTO information without digipeater path.
|
||||
|
||||
|
||||
- A list of all symbols available can be obtained with the -S
|
||||
command line option.
|
||||
|
||||
- Command line option "-a n" to print audio device statistics each n seconds. Previously this was always each 100 seconds on Linux and not available on Windows.
|
||||
|
||||
### Bugs Fixed: ###
|
||||
|
||||
|
||||
|
||||
- Fixed several cases where crashes were caused by unexpected packet contents:
|
||||
|
||||
- When receiving packet with unexpected form of GPS NMEA sentence.
|
||||
|
||||
- When receiving packet with comment of a few hundred characters.
|
||||
|
||||
- Address in path, from Internet server, more than 9 characters.
|
||||
|
||||
- "INTERNAL ERROR: dlq_append NULL packet pointer." when using PASSALL.
|
||||
|
||||
- In Mac OSX version: Assertion failed: (adev[a].inbuf_size_in_bytes >= 100 && adev[a].inbuf_size_in_bytes <= 32768), function audio_get, file audio_portaudio.c, line 917.
|
||||
|
||||
- Tracker beacons were not always updating the location properly.
|
||||
|
||||
- AGW network protocol now works properly for big-endian processors
|
||||
such as PowerPC or MIPS.
|
||||
|
||||
- Packet filtering treated telemetry metadata as messages rather than telemetry.
|
||||
|
||||
----------
|
||||
|
||||
## Version 1.2 -- June 2015 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Improved decoder performance.
|
||||
Over 1000 error-free frames decoded from WA8LMF TNC Test CD.
|
||||
See ***A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf*** for details.
|
||||
|
||||
- Up to 3 soundcards and 6 radio channels can be handled at the same time.
|
||||
|
||||
- New framework for applications which listen for Touch Tone commands
|
||||
and respond with voice. A sample calculator application is included
|
||||
as a starting point for building more interesting applications.
|
||||
For example, if it hears the DTMF sequence "2*3*4#" it will respond
|
||||
with the spoken words "Twenty Four."
|
||||
|
||||
- Reduced latency for transfers to/from soundcards.
|
||||
|
||||
- More accurate transmit PTT timing.
|
||||
|
||||
- Packet filtering for digipeater and IGate.
|
||||
|
||||
- New command line -q (quiet) option to suppress some types of output.
|
||||
|
||||
- Attempted fixing of corrupted bits now works for 9600 baud.
|
||||
|
||||
- Implemented AGW network protocol 'y' message so applications can
|
||||
throttle generation of packets when sending a large file.
|
||||
|
||||
- When using serial port RTS/DTR to activate transmitter, the two
|
||||
control lines can now be driven with opposite polarity as required
|
||||
by some interfaces.
|
||||
|
||||
- Data Carrier Detect (DCD) can be sent to an output line (just
|
||||
like PTT) to activate a carrier detect light.
|
||||
|
||||
- Linux "man" pages for on-line documentation.
|
||||
|
||||
- AGWPORT and KISSPORT can be set to 0 to disable the interfaces.
|
||||
|
||||
- APRStt gateway enhancements: MGRS/USNG coordinates, new APRStt3
|
||||
format call, satellite grid squares.
|
||||
|
||||
|
||||
### Bugs fixed ###
|
||||
|
||||
- Fixed "gen_packets" so it now handles user-specified messages correctly.
|
||||
|
||||
- Under some circumstances PTT would be held on long after the transmit
|
||||
audio was finished.
|
||||
|
||||
|
||||
|
||||
### Known problems ###
|
||||
|
||||
- Sometimes writes to a pseudo terminal will block causing the received
|
||||
frame processing thread to hang. The first thing you will notice is that
|
||||
received frames are not being printed. After a while this message will appear:
|
||||
|
||||
Received frame queue is out of control. Length=... Reader thread is probably
|
||||
frozen. This can be caused by using a pseudo terminal (direwolf -p) where
|
||||
another application is not reading the frames from the other side.
|
||||
|
||||
-----------
|
||||
|
||||
## Version 1.1 -- December 2014 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Logging of received packets and utility to convert log file
|
||||
into GPX format.
|
||||
|
||||
- AGW network port formerly allowed only one connection at a
|
||||
time. It can now accept 3 client applications at the same time.
|
||||
(Same has not yet been done for network KISS port.)
|
||||
|
||||
- Frequency / offset / tone standard formats are now recognized.
|
||||
Non-standard attempts, in the comment, are often detected and
|
||||
a message suggests the correct format.
|
||||
|
||||
- Telemetry is now recognized. Messages are printed for
|
||||
usage that does not adhere to the published standard.
|
||||
|
||||
- Tracker function transmits location from GPS position.
|
||||
New configuration file options: TBEACON and SMARTBEACONING.
|
||||
(For Linux only. Warning - has not been well tested.)
|
||||
|
||||
- Experimental packet regeneration feature for HF use.
|
||||
Will be documented later if proves to be useful...
|
||||
|
||||
- Several enhancements for trying to fix incorrect CRC:
|
||||
Additional types of attempts to fix a bad CRC.
|
||||
Optimized code to reduce execution time.
|
||||
Improved detection of duplicate packets from different fixup attempts.
|
||||
Set limit on number of packets in fix up later queue.
|
||||
|
||||
- Beacon positions can be specified in either latitude / longitude
|
||||
or UTM coordinates.
|
||||
|
||||
- It is still highly recommended, but no longer mandatory, that
|
||||
beaconing be enabled for digipeating to work.
|
||||
|
||||
* Bugs fixed:
|
||||
|
||||
- For Windows version, maximum serial port was COM9.
|
||||
It is now possible to use COM10 and higher.
|
||||
|
||||
- Fixed issue with KISS protocol decoder state that showed up
|
||||
only with "binary" data in packets (e.g. RMS Express).
|
||||
|
||||
- An extra 00 byte was being appended to packets from AGW
|
||||
network protocol 'K' messages.
|
||||
|
||||
- Invalid data from an AGW client application could cause an
|
||||
application crash.
|
||||
|
||||
- OSS (audio interface for non-Linux versions of Unix) should
|
||||
be better now.
|
||||
|
||||
### Known problems ###
|
||||
|
||||
- Sometimes kissattach fails to connect with "direwolf -p".
|
||||
The User Guide and Raspberry Pi APRS document have a couple work-arounds.
|
||||
|
||||
-----------
|
||||
|
||||
## Version 1.0a -- May 2014 ##
|
||||
|
||||
### Bug fixed ###
|
||||
|
||||
- Beacons sent directly to IGate server had incorrect source address.
|
||||
|
||||
-----------
|
||||
|
||||
## Version 1.0 -- May 2014 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Received audio can be obtained with a UDP socket or stdin.
|
||||
This can be used to take audio from software defined radios
|
||||
such as rtl_fm or gqrx.
|
||||
|
||||
- 9600 baud data rate.
|
||||
|
||||
- New PBEACON and OBEACON configuration options. Previously
|
||||
it was necessary to handcraft beacons.
|
||||
|
||||
- Less CPU power required for 300 baud. This is important
|
||||
if you want to run a bunch of decoders at the same time
|
||||
to tolerate off-frequency HF SSB signals.
|
||||
|
||||
- Improved support for UTF-8 character set.
|
||||
|
||||
- Improved troubleshooting display for APRStt macros.
|
||||
|
||||
- In earlier versions, the DTMF decoder was always active because it
|
||||
took a negligible amount of CPU time. Unfortunately this sometimes
|
||||
resulted in too many false positives from some other types of digital
|
||||
transmissions heard on HF. Starting in version 1.0, the DTMF decoder
|
||||
is enabled only when the APRStt gateway is configured.
|
||||
|
||||
|
||||
-----------
|
||||
|
||||
## Version 0.9 --November 2013 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Selection of non-default audio device for Linux ALSA.
|
||||
|
||||
- Simplified audio device set up for Raspberry Pi.
|
||||
|
||||
- GPIO lines can be used for PTT on suitable Linux systems.
|
||||
|
||||
- Improved 1200 baud decoder.
|
||||
|
||||
- Multiple decoders per channel to tolerate HF SSB signals off frequency.
|
||||
|
||||
- Command line option "-t 0" to disable text colors.
|
||||
|
||||
- APRStt macros which allow short numeric only touch tone
|
||||
sequences to be processed as much longer predefined sequences.
|
||||
|
||||
|
||||
### Bugs Fixed ###
|
||||
|
||||
- Now works on 64 bit target.
|
||||
|
||||
### New Restriction for Windows version ###
|
||||
|
||||
- Minimum processor is now Pentium 3 or equivalent or later.
|
||||
It's possible to run on something older but you will need
|
||||
to rebuild it from source.
|
||||
|
||||
|
||||
-----------
|
||||
|
||||
## Version 0.8 -- August 2013 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Internet Gateway (IGate) including IPv6 support.
|
||||
|
||||
- Compatibility with YAAC.
|
||||
|
||||
- Preemptive digipeating option.
|
||||
|
||||
- KISS TNC should now work with connected AX.25 protocols
|
||||
(e.g. AX25 for Linux), not just APRS.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
## Version 0.7 -- March 2013 ##
|
||||
|
||||
### New Features: ###
|
||||
|
||||
- Added APRStt gateway capability. For details, see ***APRStt-Implementation-Notes.pdf***
|
||||
|
||||
|
||||
-----------
|
||||
|
||||
## Version 0.6 -- February 2013 ##
|
||||
|
||||
### New Features ###
|
||||
|
||||
- Improved performance of AFSK demodulator.
|
||||
Now decodes 965 frames from Track 2 of WA8LMF's TNC Test CD.
|
||||
|
||||
- KISS protocol now available thru a TCP socket.
|
||||
Default port is 8001.
|
||||
Change it with KISSPORT option in configuration file.
|
||||
|
||||
- Ability to salvage frames with bad FCS.
|
||||
See section mentioning "bad apple" in the user guide.
|
||||
Default of fixing 1 bit works well.
|
||||
Fixing more bits not recommended because there is a high
|
||||
probability of occasional corrupted data getting thru.
|
||||
|
||||
- Added AGW "monitor" format messages.
|
||||
Now compatible with APRS-TW for telemetry.
|
||||
|
||||
|
||||
### Known Problem ###
|
||||
|
||||
- The Linux (but not Cygwin) version eventually hangs if nothing is
|
||||
reading from the KISS pseudo terminal. Some operating system
|
||||
queue fills up, the application write blocks, and decoding stops.
|
||||
|
||||
|
||||
### Workaround ###
|
||||
|
||||
- If another application is not using the serial KISS interface,
|
||||
run this in another window:
|
||||
|
||||
tail -f /tmp/kisstnc
|
||||
|
||||
-----------
|
||||
|
||||
## Version 0.5 -- March 2012 ##
|
||||
|
||||
- More error checking and messages for invalid APRS data.
|
||||
|
||||
-----------
|
||||
|
||||
## Version 0.4 -- September 2011 ##
|
||||
|
||||
- First general availability.
|
||||
|
314
CHANGES.txt
314
CHANGES.txt
|
@ -1,314 +0,0 @@
|
|||
----------------
|
||||
Revision history
|
||||
----------------
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 1.2 -- June 2015
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Improved decoder performance.
|
||||
Over 1000 error-free frames decoded from WA8LMF TNC Test CD.
|
||||
See "A-Better-APRS-Packet-Demodulator.pdf" for details.
|
||||
|
||||
Up to 3 soundcards and 6 radio channels can be handled at the same time.
|
||||
|
||||
New framework for applications which listen for Touch Tone commands
|
||||
and respond with voice. A sample calculator application is included
|
||||
as a starting point for building more interesting applications.
|
||||
For example, if it hears the DTMF sequence "2*3*4#" it will respond
|
||||
with the spoken words "Twenty Four."
|
||||
|
||||
Reduced latency for transfers to/from soundcards.
|
||||
|
||||
More accurate transmit PTT timing.
|
||||
|
||||
Packet filtering for digipeater and IGate.
|
||||
|
||||
New command line -q (quiet) option to suppress some types of output.
|
||||
|
||||
Attempted fixing of corrupted bits now works for 9600 baud.
|
||||
|
||||
Implemented AGW network protocol 'y' message so applications can
|
||||
throttle generation of packets when sending a large file.
|
||||
|
||||
When using serial port RTS/DTR to activate transmitter, the two
|
||||
control lines can now be driven with opposite polarity as required
|
||||
by some interfaces.
|
||||
|
||||
Data Carrier Detect (DCD) can be sent to an output line (just
|
||||
like PTT) to activate a carrier detect light.
|
||||
|
||||
Linux "man" pages for on-line documentation.
|
||||
|
||||
AGWPORT and KISSPORT can be set to 0 to disable the interfaces.
|
||||
|
||||
APRStt gateway enhancements: MGRS/USNG coordinates, new APRStt3
|
||||
format call, satellite grid squares.
|
||||
|
||||
|
||||
|
||||
* Bugs fixed:
|
||||
|
||||
Fixed "gen_packets" so it now handles user-specified messages correctly.
|
||||
|
||||
Under some circumstances PTT would be held on long after the transmit
|
||||
audio was finished.
|
||||
|
||||
|
||||
|
||||
* Known problems:
|
||||
|
||||
Sometimes writes to a pseudo terminal will block causing the received
|
||||
frame processing thread to hang. The first thing you will notice is that
|
||||
received frames are not being printed. After a while this message will appear:
|
||||
Received frame queue is out of control. Length=... Reader thread is probably
|
||||
frozen. This can be caused by using a pseudo terminal (direwolf -p) where
|
||||
another application is not reading the frames from the other side.
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 1.1 -- December 2014
|
||||
-----------
|
||||
|
||||
* Changes since beta test version.
|
||||
|
||||
It is still highly recommended, but no longer mandatory, that
|
||||
beaconing be enabled for digipeating to work.
|
||||
|
||||
|
||||
* Known problems.
|
||||
|
||||
Sometimes kissattach fails to connect with "direwolf -p".
|
||||
The User Guide and Raspberry Pi APRS document have a couple work-arounds.
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 1.1 -- Beta Test 1 -- November 2014
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Logging of received packets and utility to convert log file
|
||||
into GPX format.
|
||||
|
||||
AGW network port formerly allowed only one connection at a
|
||||
time. It can now accept 3 client applications at the same time.
|
||||
(Same has not yet been done for network KISS port.)
|
||||
|
||||
Frequency / offset / tone standard formats are now recognized.
|
||||
Non-standard attempts, in the comment, are often detected and
|
||||
a message suggests the correct format.
|
||||
|
||||
Telemetry is now recognized. Messages are printed for
|
||||
usage that does not adhere to the published standard.
|
||||
|
||||
Tracker function transmits location from GPS position.
|
||||
New configuration file options: TBEACON and SMARTBEACONING.
|
||||
(For Linux only. Warning - has not been well tested.)
|
||||
|
||||
Experimental packet regeneration feature for HF use.
|
||||
Will be documented later if proves to be useful...
|
||||
|
||||
Several enhancements for trying to fix incorrect CRC.
|
||||
- Additional types of attempts to fix a bad CRC.
|
||||
- Optimized code to reduce execution time.
|
||||
- Improved detection of duplicate packets from different fixup attempts.
|
||||
- Set limit on number of packets in fix up later queue.
|
||||
|
||||
Beacon positions can be specified in either latitude / longitude
|
||||
or UTM coordinates.
|
||||
|
||||
|
||||
* Bugs fixed:
|
||||
|
||||
For Windows version, maximum serial port was COM9.
|
||||
It is now possible to use COM10 and higher.
|
||||
|
||||
Fixed issue with KISS protocol decoder state that showed up
|
||||
only with "binary" data in packets (e.g. RMS Express).
|
||||
|
||||
An extra 00 byte was being appended to packets from AGW
|
||||
network protocol 'K' messages.
|
||||
|
||||
Invalid data from an AGW client application could cause an
|
||||
application crash.
|
||||
|
||||
OSS (audio interface for non-Linux versions of Unix) should
|
||||
be better now.
|
||||
|
||||
|
||||
-----------
|
||||
Version 1.0a May 2014
|
||||
-----------
|
||||
|
||||
* Bug fix:
|
||||
|
||||
Beacons sent directly to IGate server had incorrect source address.
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 1.0 May 2014
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Received audio can be obtained with a UDP socket or stdin.
|
||||
This can be used to take audio from software defined radios
|
||||
such as rtl_fm or gqrx.
|
||||
|
||||
9600 baud data rate.
|
||||
|
||||
New PBEACON and OBEACON configuration options. Previously
|
||||
it was necessary to handcraft beacons.
|
||||
|
||||
Less CPU power required for 300 baud. This is important
|
||||
if you want to run a bunch of decoders at the same time
|
||||
to tolerate off-frequency HF SSB signals.
|
||||
|
||||
Improved support for UTF-8 character set.
|
||||
|
||||
Improved troubleshooting display for APRStt macros.
|
||||
|
||||
In earlier versions, the DTMF decoder was always active because it
|
||||
took a negligible amount of CPU time. Unfortunately this sometimes
|
||||
resulted in too many false positives from some other types of digital
|
||||
transmissions heard on HF. Starting in version 1.0, the DTMF decoder
|
||||
is enabled only when the APRStt gateway is configured.
|
||||
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.9 November 2013
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Selection of non-default audio device for Linux ALSA.
|
||||
|
||||
Simplified audio device set up for Raspberry Pi.
|
||||
|
||||
GPIO lines can be used for PTT on suitable Linux systems.
|
||||
|
||||
Improved 1200 baud decoder.
|
||||
|
||||
Multiple decoders per channel to tolerate HF SSB signals off frequency.
|
||||
|
||||
Command line option "-t 0" to disable text colors.
|
||||
|
||||
APRStt macros which allow short numeric only touch tone
|
||||
sequences to be processed as much longer predefined sequences.
|
||||
|
||||
|
||||
|
||||
* Bugs Fixed:
|
||||
|
||||
Now works on 64 bit target.
|
||||
|
||||
|
||||
|
||||
* New Restriction for Windows version:
|
||||
|
||||
Minimum processor is now Pentium 3 or equivalent or later.
|
||||
It's possible to run on something older but you will need
|
||||
to rebuild it from source.
|
||||
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.8 August 2013
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Internet Gateway (IGate) including IPv6 support.
|
||||
|
||||
Compatibility with YAAC.
|
||||
|
||||
Preemptive digipeating option.
|
||||
|
||||
KISS TNC should now work with connected AX.25 protocols
|
||||
(e.g. AX25 for Linux), not just APRS.
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.7 March 2013
|
||||
-----------
|
||||
|
||||
* New Features:
|
||||
|
||||
Added APRStt gateway capability. For details, see:
|
||||
|
||||
APRStt-Implementation-Notes.pdf
|
||||
|
||||
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.6 February 2013
|
||||
-----------
|
||||
|
||||
|
||||
* New Features:
|
||||
|
||||
Improved performance of AFSK demodulator.
|
||||
Now decodes 965 frames from Track 2 of WA8LMF's TNC Test CD.
|
||||
|
||||
KISS protocol now available thru a TCP socket.
|
||||
Default port is 8001.
|
||||
Change it with KISSPORT option in configuration file.
|
||||
|
||||
Ability to salvage frames with bad FCS.
|
||||
See section mentioning "bad apple" in the user guide.
|
||||
Default of fixing 1 bit works well.
|
||||
Fixing more bits not recommended because there is a high
|
||||
probability of occasional corrupted data getting thru.
|
||||
|
||||
Added AGW "monitor" format messages.
|
||||
Now compatible with APRS-TW for telemetry.
|
||||
|
||||
|
||||
* Bugs Fixed:
|
||||
|
||||
None.
|
||||
|
||||
|
||||
|
||||
* Known Problem:
|
||||
|
||||
The Linux (but not Cygwin) version eventually hangs if nothing is
|
||||
reading from the KISS pseudo terminal. Some operating system
|
||||
queue fills up, the application write blocks, and decoding stops.
|
||||
|
||||
|
||||
* Workaround:
|
||||
|
||||
If another application is not using the serial KISS interface,
|
||||
run this in another window:
|
||||
|
||||
tail -f /tmp/kisstnc
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.5 March 2012
|
||||
-----------
|
||||
|
||||
|
||||
More error checking and messages for invalid APRS data.
|
||||
|
||||
|
||||
-----------
|
||||
Version 0.4 September 2011
|
||||
-----------
|
||||
|
||||
First general availability.
|
||||
|
|
@ -0,0 +1,414 @@
|
|||
cmake_minimum_required(VERSION 3.5.0)
|
||||
|
||||
project(direwolf)
|
||||
|
||||
# configure version
|
||||
set(direwolf_VERSION_MAJOR "1")
|
||||
set(direwolf_VERSION_MINOR "7")
|
||||
set(direwolf_VERSION_PATCH "0")
|
||||
set(direwolf_VERSION_SUFFIX "Development")
|
||||
|
||||
# options
|
||||
# See Issue 297.
|
||||
option(FORCE_SSE "Compile with SSE instruction only" ON)
|
||||
option(FORCE_SSSE3 "Compile with SSSE3 instruction only" OFF)
|
||||
option(FORCE_SSE41 "Compile with SSE4.1 instruction only" OFF)
|
||||
option(OPTIONAL_TEST "Compile optional test (might be broken)" OFF)
|
||||
# UNITTEST option must be after CMAKE_BUILT_TYPE
|
||||
|
||||
# where cmake find custom modules
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
|
||||
|
||||
# fix c standard used on the project
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
||||
# Set additional project information
|
||||
set(COMPANY "wb2osz")
|
||||
add_definitions("-DCOMPANY=\"${COMPANY}\"")
|
||||
set(APPLICATION_NAME "Dire Wolf")
|
||||
add_definitions("-DAPPLICATION_NAME=\"${APPLICATION_NAME}\"")
|
||||
set(APPLICATION_MAINTAINER="John Langner, WB2OSZ")
|
||||
set(COPYRIGHT "Copyright (c) 2019 John Langner, WB2OSZ. All rights reserved.")
|
||||
add_definitions("-DCOPYRIGHT=\"${COPYRIGHT}\"")
|
||||
set(IDENTIFIER "com.${COMPANY}.${APPLICATION_NAME}")
|
||||
add_definitions("-DIDENTIFIER=\"${IDENTIFIER}\"")
|
||||
# raspberry as only lxterminal not xterm
|
||||
if(NOT (WIN32 OR CYGWIN))
|
||||
find_program(BINARY_TERMINAL_BIN lxterminal)
|
||||
if(BINARY_TERMINAL_BIN)
|
||||
set(APPLICATION_DESKTOP_EXEC "${BINARY_TERMINAL_BIN} -e ${CMAKE_PROJECT_NAME}")
|
||||
else()
|
||||
set(APPLICATION_DESKTOP_EXEC "xterm -e ${CMAKE_PROJECT_NAME}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(Git)
|
||||
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git/")
|
||||
# we can also use `git describe --tags`
|
||||
execute_process(COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
RESULT_VARIABLE res
|
||||
OUTPUT_VARIABLE out
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if(NOT res)
|
||||
string(REGEX REPLACE "^v([0-9]+)\.([0-9]+)\.([0-9]+)-" "" git_commit ${out})
|
||||
set(direwolf_VERSION_SUFFIX "-${git_commit}")
|
||||
set(direwolf_VERSION_COMMIT "${git_commit}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# set variables
|
||||
set(direwolf_VERSION "${direwolf_VERSION_MAJOR}.${direwolf_VERSION_MINOR}.${direwolf_VERSION_PATCH}${direwolf_VERSION_SUFFIX}")
|
||||
message(STATUS "${APPLICATION_NAME} Version: ${direwolf_VERSION}")
|
||||
add_definitions("-DIREWOLF_VERSION=\"${direwolf_VERSION}\"")
|
||||
add_definitions("-DMAJOR_VERSION=${direwolf_VERSION_MAJOR}")
|
||||
add_definitions("-DMINOR_VERSION=${direwolf_VERSION_MINOR}")
|
||||
if(direwolf_VERSION_COMMIT)
|
||||
add_definitions("-DEXTRA_VERSION=${direwolf_VERSION_COMMIT}")
|
||||
endif()
|
||||
|
||||
set(CUSTOM_SRC_DIR "${CMAKE_SOURCE_DIR}/src")
|
||||
set(CUSTOM_EXTERNAL_DIR "${CMAKE_SOURCE_DIR}/external")
|
||||
set(CUSTOM_MISC_DIR "${CUSTOM_EXTERNAL_DIR}/misc")
|
||||
set(CUSTOM_REGEX_DIR "${CUSTOM_EXTERNAL_DIR}/regex")
|
||||
set(CUSTOM_HIDAPI_DIR "${CUSTOM_EXTERNAL_DIR}/hidapi")
|
||||
set(CUSTOM_GEOTRANZ_DIR "${CUSTOM_EXTERNAL_DIR}/geotranz")
|
||||
set(CUSTOM_DATA_DIR "${CMAKE_SOURCE_DIR}/data")
|
||||
set(CUSTOM_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/scripts")
|
||||
set(CUSTOM_TELEMETRY_DIR "${CUSTOM_SCRIPTS_DIR}/telemetry-toolkit")
|
||||
set(CUSTOM_CONF_DIR "${CMAKE_SOURCE_DIR}/conf")
|
||||
set(CUSTOM_DOC_DIR "${CMAKE_SOURCE_DIR}/doc")
|
||||
set(CUSTOM_MAN_DIR "${CMAKE_SOURCE_DIR}/man")
|
||||
set(CUSTOM_TEST_DIR "${CMAKE_SOURCE_DIR}/test")
|
||||
set(CUSTOM_TEST_SCRIPTS_DIR "${CUSTOM_TEST_DIR}/scripts")
|
||||
set(CUSTOM_SHELL_SHABANG "#!/bin/sh -e")
|
||||
|
||||
# cpack variables
|
||||
set(CPACK_GENERATOR "ZIP")
|
||||
set(CPACK_STRIP_FILES true)
|
||||
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
|
||||
# This has architecture of the build machine, not the target platform.
|
||||
# e.g. Comes out as x86_64 when building for i686 target platform.
|
||||
#set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${direwolf_VERSION}_${CMAKE_SYSTEM_PROCESSOR}")
|
||||
# We don't know the target yet so this is set after FindCPUflags.
|
||||
set(CPACK_PACKAGE_CONTACT "https://github.com/wb2osz/direwolf")
|
||||
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Dire Wolf is an AX.25 soundcard TNC, digipeater, APRS IGate, GPS tracker, and APRStt gateway")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
|
||||
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_SOURCE_IGNORE_FILES "${PROJECT_BINARY_DIR};/.git/;.gitignore;menu.yml;.travis.yml;.appveyor.yml;default.nix;.envrc;TODOs.org;/.scripts/")
|
||||
SET(CPACK_PACKAGE_VERSION "${direwolf_VERSION}")
|
||||
SET(CPACK_PACKAGE_VERSION_MAJOR "${direwolf_VERSION_MAJOR}")
|
||||
SET(CPACK_PACKAGE_VERSION_MINOR "${direwolf_VERSION_MINOR}")
|
||||
SET(CPACK_PACKAGE_VERSION_PATCH "${direwolf_VERSION_PATCH}")
|
||||
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libasound2,libgps23")
|
||||
|
||||
# if we don't set build_type
|
||||
if(NOT DEFINED CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
||||
endif()
|
||||
message(STATUS "Build type set to: ${CMAKE_BUILD_TYPE}")
|
||||
message("CMake system: ${CMAKE_SYSTEM_NAME}")
|
||||
|
||||
# Unittest should be on for dev builds and off for releases.
|
||||
if(CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
option(UNITTEST "Build unittest binaries." OFF)
|
||||
else()
|
||||
option(UNITTEST "Build unittest binaries." ON)
|
||||
endif()
|
||||
|
||||
# set compiler
|
||||
include(FindCompiler)
|
||||
|
||||
# find cpu flags (and set compiler)
|
||||
include(FindCPUflags)
|
||||
|
||||
if(${ARCHITECTURE} MATCHES "x86")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${direwolf_VERSION}_i686")
|
||||
else()
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${direwolf_VERSION}_${ARCHITECTURE}")
|
||||
endif()
|
||||
|
||||
# auto include current directory
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
# set OS dependent variables
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||
set(LINUX TRUE)
|
||||
|
||||
configure_file("${CMAKE_SOURCE_DIR}/cmake/cpack/${CMAKE_PROJECT_NAME}.desktop.in"
|
||||
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.desktop" @ONLY)
|
||||
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
||||
set(FREEBSD TRUE)
|
||||
configure_file("${CMAKE_SOURCE_DIR}/cmake/cpack/${CMAKE_PROJECT_NAME}.desktop.in"
|
||||
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.desktop" @ONLY)
|
||||
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
|
||||
set(OPENBSD TRUE)
|
||||
set(HAVE_SNDIO TRUE)
|
||||
|
||||
elseif(APPLE)
|
||||
if("${CMAKE_OSX_DEPLOYMENT_TARGET}" STREQUAL "")
|
||||
message(STATUS "Build for macOS target: local version")
|
||||
else()
|
||||
message(STATUS "Build for macOS target: ${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||
endif()
|
||||
|
||||
# prepend path to find_*()
|
||||
set(CMAKE_FIND_ROOT_PATH "/opt/local")
|
||||
|
||||
set(CMAKE_MACOSX_RPATH ON)
|
||||
message(STATUS "RPATH support: ${CMAKE_MACOSX_RPATH}")
|
||||
|
||||
# just blindly enable dns-sd
|
||||
set(USE_MACOS_DNSSD ON)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_MACOS_DNSSD")
|
||||
|
||||
elseif (WIN32)
|
||||
if(C_MSVC)
|
||||
if (NOT VS2015 AND NOT VS2017 AND NOT VS2019)
|
||||
message(FATAL_ERROR "You must use Microsoft Visual Studio 2015, 2017 or 2019 as compiler")
|
||||
else()
|
||||
# compile with full multicore
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||
set(CUSTOM_SHELL_BIN "")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (C_CLANG OR C_GCC)
|
||||
# _BSD_SOURCE is deprecated we need to use _DEFAULT_SOURCE.
|
||||
#
|
||||
# That works find for more modern compilers but we have issues with:
|
||||
# Centos 7, gcc 4.8.5, glibc 2.17
|
||||
# Centos 6, gcc 4.4.7, glibc 2.12
|
||||
#
|
||||
# CentOS 6 & 7: Without -D_BSD_SOURCE, we get Warning: Implicit declaration of
|
||||
# functions alloca, cfmakeraw, scandir, setlinebuf, strcasecmp, strncasecmp, and strsep.
|
||||
# When a function (like strsep) returns a pointer, the compiler instead assumes a 32 bit
|
||||
# int and sign extends it out to be a 64 bit pointer. Use the pointer and Kaboom!
|
||||
#
|
||||
# CentOS 6: We have additional problem. Without -D_POSIX_C_SOURCE=199309L, we get
|
||||
# implicit declaration of function clock_gettime and the linker can't find it.
|
||||
#
|
||||
# It turns out that -D_GNU_SOURCE can be used instead of both of those. For more information,
|
||||
# see https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
|
||||
#
|
||||
# Why was this not an issue before? If gcc is used without the -std=c99 option,
|
||||
# it is perfectly happy with clock_gettime, strsep, etc. but with the c99 option, it no longer
|
||||
# recognizes a bunch of commonly used functions. Using _GNU_SOURCE, rather than _DEFAULT_SOURCE
|
||||
# solves the problem for CentOS 6 & 7. This also makes -D_XOPEN_SOURCE= unnecessary.
|
||||
# I hope it doesn't break with newer versions of glibc.
|
||||
#
|
||||
# I also took out -Wextra because it spews out so much noise a serious problem was not noticed.
|
||||
# It might go back in someday when I have more patience to clean up all the warnings.
|
||||
#
|
||||
|
||||
# TODO:
|
||||
# Try error checking -fsanitize=bounds-strict -fsanitize=leak
|
||||
# Requires libubsan and liblsan, respectively.
|
||||
|
||||
###set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wvla -ffast-math -ftree-vectorize -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE ${EXTRA_FLAGS}")
|
||||
if(FREEBSD)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wvla -ffast-math -ftree-vectorize -D_DEFAULT_SOURCE ${EXTRA_FLAGS}")
|
||||
else()
|
||||
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wvla -ffast-math -ftree-vectorize -D_GNU_SOURCE -fsanitize=bounds-strict ${EXTRA_FLAGS}")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wvla -ffast-math -ftree-vectorize -D_GNU_SOURCE ${EXTRA_FLAGS}")
|
||||
endif()
|
||||
#
|
||||
#
|
||||
# -lm is needed for functions in math.h
|
||||
if (LINUX)
|
||||
# We have another problem with CentOS 6. clock_gettime() is in librt so we need -lrt.
|
||||
# The clock_* functions were moved into gnu libc for version 2.17.
|
||||
# https://sourceware.org/ml/libc-announce/2012/msg00001.html
|
||||
# If using gnu libc 2.17, or later, the -lrt is no longer needed but doesn't hurt.
|
||||
# I'm making this conditional on LINUX because it is not needed for BSD and MacOSX.
|
||||
link_libraries("-lrt -lm")
|
||||
else()
|
||||
link_libraries("-lm")
|
||||
endif()
|
||||
elseif (C_MSVC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W3 -MP ${EXTRA_FLAGS}")
|
||||
endif()
|
||||
|
||||
if (C_CLANG)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ferror-limit=1")
|
||||
elseif (C_GCC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmax-errors=1")
|
||||
endif()
|
||||
|
||||
# set installation directories
|
||||
if (WIN32 OR CYGWIN)
|
||||
set(INSTALL_BIN_DIR ".")
|
||||
set(INSTALL_DOC_DIR "doc")
|
||||
set(INSTALL_CONF_DIR ".")
|
||||
set(INSTALL_SCRIPTS_DIR "scripts")
|
||||
set(INSTALL_MAN_DIR "man")
|
||||
set(INSTALL_DATA_DIR "data")
|
||||
else()
|
||||
set(INSTALL_BIN_DIR "bin")
|
||||
set(INSTALL_DOC_DIR "share/doc/${CMAKE_PROJECT_NAME}")
|
||||
set(INSTALL_CONF_DIR "${INSTALL_DOC_DIR}/conf")
|
||||
set(INSTALL_SCRIPTS_DIR "${INSTALL_DOC_DIR}/scripts")
|
||||
if(FREEBSD)
|
||||
set(INSTALL_MAN_DIR "man/man1")
|
||||
else()
|
||||
set(INSTALL_MAN_DIR "share/man/man1")
|
||||
endif()
|
||||
set(INSTALL_DATA_DIR "share/${PROJECT_NAME}")
|
||||
endif(WIN32 OR CYGWIN)
|
||||
|
||||
# requirements
|
||||
|
||||
include(CheckSymbolExists)
|
||||
|
||||
# Some platforms provide their own strlcpy & strlcat. (BSD, MacOSX)
|
||||
# Others don't so we provide our own. (Windows, most, but not all Linux)
|
||||
# Here we detect whether these are provided by the OS and set a symbol
|
||||
# so that:
|
||||
# (1) libgps does not supply its own version.
|
||||
# (2) we know whether we need to supply our own copy.
|
||||
#
|
||||
# This was all working fine until these were added to the gnu c library 2.38.
|
||||
# References:
|
||||
# - https://www.gnu.org/software/libc/sources.html
|
||||
# - https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS;hb=HEAD
|
||||
#
|
||||
# This test is not detecting them for glibc 2.38 resulting in a conflict.
|
||||
# Why? Are they declared in a different file or in some strange way?
|
||||
#
|
||||
# This is how they are declared in include/string.h:
|
||||
#
|
||||
# extern __typeof (strlcpy) __strlcpy;
|
||||
# libc_hidden_proto (__strlcpy)
|
||||
# extern __typeof (strlcat) __strlcat;
|
||||
# libc_hidden_proto (__strlcat)
|
||||
#
|
||||
# Apparently cmake does not recognize this style.
|
||||
# Keep this here for BSD type systems where it behaves as expected.
|
||||
# We will need to add a hack in direwolf.h to define these if glibc version >= 2.38.
|
||||
|
||||
check_symbol_exists(strlcpy string.h HAVE_STRLCPY)
|
||||
if(HAVE_STRLCPY)
|
||||
add_compile_options(-DHAVE_STRLCPY)
|
||||
endif()
|
||||
check_symbol_exists(strlcat string.h HAVE_STRLCAT)
|
||||
if(HAVE_STRLCAT)
|
||||
add_compile_options(-DHAVE_STRLCAT)
|
||||
endif()
|
||||
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
find_package(GPSD)
|
||||
if(GPSD_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_GPSD")
|
||||
else()
|
||||
set(GPSD_INCLUDE_DIRS "")
|
||||
set(GPSD_LIBRARIES "")
|
||||
endif()
|
||||
|
||||
find_package(hamlib)
|
||||
if(HAMLIB_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_HAMLIB")
|
||||
else()
|
||||
set(HAMLIB_INCLUDE_DIRS "")
|
||||
set(HAMLIB_LIBRARIES "")
|
||||
endif()
|
||||
|
||||
if(LINUX)
|
||||
find_package(ALSA REQUIRED)
|
||||
if(ALSA_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_ALSA")
|
||||
endif()
|
||||
|
||||
find_package(udev)
|
||||
if(UDEV_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_CM108")
|
||||
endif()
|
||||
|
||||
find_package(Avahi)
|
||||
if(AVAHI_CLIENT_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_AVAHI_CLIENT")
|
||||
endif()
|
||||
|
||||
elseif (HAVE_SNDIO)
|
||||
find_package(sndio REQUIRED)
|
||||
if(SNDIO_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_SNDIO")
|
||||
endif()
|
||||
|
||||
elseif (NOT WIN32 AND NOT CYGWIN)
|
||||
find_package(Portaudio REQUIRED)
|
||||
if(PORTAUDIO_FOUND)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_PORTAUDIO")
|
||||
endif()
|
||||
|
||||
else()
|
||||
set(ALSA_INCLUDE_DIRS "")
|
||||
set(ALSA_LIBRARIES "")
|
||||
set(UDEV_INCLUDE_DIRS "")
|
||||
set(UDEV_LIBRARIES "")
|
||||
# Version 1.7 supports CM108/CM119 GPIO PTT for Windows.
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_CM108")
|
||||
set(PORTAUDIO_INCLUDE_DIRS "")
|
||||
set(PORTAUDIO_LIBRARIES "")
|
||||
set(SNDIO_INCLUDE_DIRS "")
|
||||
set(SNDIO_LIBRARIES "")
|
||||
endif()
|
||||
|
||||
# manage and fetch new data
|
||||
add_subdirectory(data)
|
||||
|
||||
# external libraries
|
||||
add_subdirectory(${CUSTOM_GEOTRANZ_DIR})
|
||||
add_subdirectory(${CUSTOM_REGEX_DIR})
|
||||
add_subdirectory(${CUSTOM_HIDAPI_DIR})
|
||||
add_subdirectory(${CUSTOM_MISC_DIR})
|
||||
|
||||
# direwolf source code and utilities
|
||||
add_subdirectory(src)
|
||||
|
||||
# ctest
|
||||
if(UNITTEST)
|
||||
message(STATUS "Build unit test binaries")
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif(UNITTEST)
|
||||
|
||||
# manage scripts
|
||||
add_subdirectory(scripts)
|
||||
|
||||
# manage config
|
||||
add_subdirectory(conf)
|
||||
|
||||
# install basic docs
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/CHANGES.md DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/external/LICENSE DESTINATION ${INSTALL_DOC_DIR}/external)
|
||||
add_subdirectory(doc)
|
||||
add_subdirectory(man)
|
||||
|
||||
# install desktop link
|
||||
if (LINUX OR FREEBSD)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.desktop DESTINATION share/applications)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/cmake/cpack/${CMAKE_PROJECT_NAME}_icon.png DESTINATION share/pixmaps)
|
||||
endif()
|
||||
|
||||
############ uninstall target ################
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/include/uninstall.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake"
|
||||
IMMEDIATE @ONLY)
|
||||
|
||||
add_custom_target(uninstall
|
||||
COMMAND ${CMAKE_COMMAND} -P
|
||||
${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake)
|
||||
|
||||
############ packaging ################
|
||||
add_subdirectory(cmake/cpack)
|
43
Makefile
43
Makefile
|
@ -1,9 +1,36 @@
|
|||
# Select proper Makefile for operating system.
|
||||
# The Windows version is built with the help of Cygwin.
|
||||
|
||||
win := $(shell uname | grep CYGWIN)
|
||||
ifneq ($(win),)
|
||||
include Makefile.win
|
||||
else
|
||||
include Makefile.linux
|
||||
endif
|
||||
all:
|
||||
@echo "The build procedure has changed in version 1.6."
|
||||
@echo "In general, it now looks like this:"
|
||||
@echo " "
|
||||
@echo "Download the source code:"
|
||||
@echo " "
|
||||
@echo " cd ~"
|
||||
@echo " git clone https://www.github.com/wb2osz/direwolf"
|
||||
@echo " cd direwolf"
|
||||
@echo " "
|
||||
@echo "Optional - Do this to get the latest development version"
|
||||
@echo "rather than the latest stable release."
|
||||
@echo " "
|
||||
@echo " git checkout dev"
|
||||
@echo " "
|
||||
@echo "Build it. There are two new steps not used for earlier releases."
|
||||
@echo " "
|
||||
@echo " mkdir build && cd build"
|
||||
@echo " cmake .."
|
||||
@echo " make -j4"
|
||||
@echo " "
|
||||
@echo "Install:"
|
||||
@echo " "
|
||||
@echo " sudo make install"
|
||||
@echo " make install-conf"
|
||||
@echo " "
|
||||
@echo "You will probably need to install additional applications and"
|
||||
@echo "libraries depending on your operating system."
|
||||
@echo "More details are in the README.md file."
|
||||
@echo " "
|
||||
@echo "Questions?"
|
||||
@echo " "
|
||||
@echo " - Extensive documentation can be found in the 'doc' directory."
|
||||
@echo " - Join the discussion forum here: https://groups.io/g/direwolf"
|
||||
@echo " "
|
||||
|
|
572
Makefile.linux
572
Makefile.linux
|
@ -1,572 +0,0 @@
|
|||
#
|
||||
# Makefile for Linux version of Dire Wolf.
|
||||
#
|
||||
|
||||
all : direwolf decode_aprs text2tt tt2text ll2utm utm2ll aclients atest log2gpx gen_packets ttcalc direwolf.desktop
|
||||
@echo " "
|
||||
@echo "Next step - install with:"
|
||||
@echo " "
|
||||
@echo " sudo make install"
|
||||
@echo " "
|
||||
|
||||
CC := gcc
|
||||
CFLAGS := -O3 -pthread -Igeotranz
|
||||
|
||||
|
||||
#
|
||||
# The DSP filters spend a lot of time spinning around in little
|
||||
# loops multiplying and adding arrays of numbers. The Intel "SSE"
|
||||
# instructions, introduced in 1999 with the Pentium III series,
|
||||
# can speed this up considerably.
|
||||
#
|
||||
# SSE2 instructions, added in 2000, don't seem to offer any advantage.
|
||||
#
|
||||
#
|
||||
# Let's take a look at the effect of the compile options.
|
||||
#
|
||||
#
|
||||
# Times are elapsed time to process Track 2 of the TNC test CD.
|
||||
#
|
||||
# i.e. "./atest 02_Track_2.wav"
|
||||
# Default demodulator type is new "E" added for version 1.2.
|
||||
#
|
||||
|
||||
#
|
||||
# ---------- x86 (32 bit) ----------
|
||||
#
|
||||
|
||||
#
|
||||
# gcc 4.6.3 running on Ubuntu 12.04.05.
|
||||
# Intel(R) Celeron(R) CPU 2.53GHz. Appears to have only 32 bit instructions.
|
||||
# Probably from around 2004 or 2005.
|
||||
#
|
||||
# When gcc is generating code for a 32 bit x86 target, it assumes the ancient
|
||||
# i386 processor. This is good for portability but bad for performance.
|
||||
#
|
||||
# The code can run considerably faster by taking advantage of the SSE instructions
|
||||
# available in the Pentium 3 or later.
|
||||
#
|
||||
# seconds options comments
|
||||
# ------ ------- --------
|
||||
# 524
|
||||
# 183 -O2
|
||||
# 182 -O3
|
||||
# 183 -O3 -ffast-math (should be same as -Ofast)
|
||||
# 184 -Ofast
|
||||
# 189 -O3 -ffast-math -march=pentium
|
||||
# 122 -O3 -ffast-math -msse
|
||||
# 122 -O3 -ffast-math -march=pentium -msse
|
||||
# 121 -O3 -ffast-math -march=pentium3 (this implies -msse)
|
||||
# 120 -O3 -ffast-math -march=native
|
||||
#
|
||||
# Note that "-march=native" is essentially the same as "-march=pentium3."
|
||||
#
|
||||
|
||||
# If the compiler is generating code for the i386 target, we can
|
||||
# get much better results by telling it we have at least a Pentium 3.
|
||||
|
||||
arch := $(shell echo | gcc -E -dM - | grep __i386__)
|
||||
ifneq ($(arch),)
|
||||
CFLAGS += -march=pentium3
|
||||
endif
|
||||
|
||||
|
||||
#
|
||||
# ---------- x86_64 ----------
|
||||
#
|
||||
|
||||
#
|
||||
# gcc 4.8.2 running on Ubuntu 14.04.1.
|
||||
# Intel Core 2 Duo from around 2007 or 2008.
|
||||
#
|
||||
# 64 bit target implies that we have SSE and probably even better vector instructions.
|
||||
#
|
||||
# seconds options comments
|
||||
# ------ ------- --------
|
||||
# 245
|
||||
# 75 -01
|
||||
# 72 -02
|
||||
# 71 -03
|
||||
# 73 -O3 -march=native
|
||||
# 42 -O3 -ffast-math
|
||||
# 42 -Ofast (note below)
|
||||
# 40 -O3 -ffast-math -march=native
|
||||
#
|
||||
#
|
||||
# Note that "-Ofast" is a newer option roughly equivalent to "-O3 -ffast-math".
|
||||
# I use the longer form because it is compatible with older compilers.
|
||||
#
|
||||
# Why don't I don't have "-march=native?"
|
||||
# Older compilers don't recognize "native" as one of the valid options.
|
||||
# One article said it was added with gcc 4.2 but I haven't verified that.
|
||||
#
|
||||
|
||||
# Add -ffastmath in only if compiler version recognizes it.
|
||||
|
||||
useffast := $(shell gcc --help -v 2>/dev/null | grep ffast-math)
|
||||
ifneq ($(useffast),)
|
||||
CFLAGS += -ffast-math
|
||||
endif
|
||||
|
||||
|
||||
#
|
||||
# ---------- ARM - Raspberry Pi 1 models ----------
|
||||
#
|
||||
# Raspberry Pi (before RPi model 2), ARM11 (ARMv6 + VFP2)
|
||||
# gcc (Debian 4.6.3-14+rpi1) 4.6.3
|
||||
#
|
||||
#
|
||||
# seconds options comments
|
||||
# ------ ------- ---------
|
||||
# 892 -O3
|
||||
# 887 -O3 -ffast-math
|
||||
# x -O3 -ffast-math -march=native (error: bad value for -march switch)
|
||||
# 887 -O3 -ffast-math -mfpu=vfp
|
||||
# 890 -O3 -ffast-math -march=armv6zk -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp
|
||||
#
|
||||
#
|
||||
# The compiler, supplied with Raspbian, is configured with these options which are
|
||||
# good for the pre version 2 models.
|
||||
# --with-arch=armv6 --with-fpu=vfp --with-float=hard
|
||||
#
|
||||
# Run "gcc --help -v 2" and look near the end.
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# ---------- ARM - Raspberry Pi 2 ----------
|
||||
#
|
||||
# Besides the higher clock speed, the Raspberry Pi 2 has the NEON instruction set
|
||||
# which which should make things considerably faster.
|
||||
#
|
||||
#
|
||||
# seconds options comments
|
||||
# ------ ------- ---------
|
||||
# 426 -O3 -ffast-math (already more than twice as fast)
|
||||
# 429 -O3 -mfpu=neon
|
||||
# 419 -O3 -mfpu=neon -funsafe-math-optimizations
|
||||
# 412 -O3 -ffast-math -mfpu=neon
|
||||
# 413 -O3 -ffast-math -mfpu=neon-vfpv4
|
||||
# 430 -O3 -ffast-math -mfpu=neon-vfpv4 -march=armv7-a
|
||||
# 412 -O3 -ffast-math -mfpu=neon-vfpv4 -mtune=arm7
|
||||
# 410 -O3 -ffast-math -mfpu=neon-vfpv4 -funsafe-math-optimizations
|
||||
|
||||
#
|
||||
# gcc -march=armv7-a -mfpu=neon-vfpv4
|
||||
#
|
||||
# I expected the -mfpu=neon option to have a much larger impact.
|
||||
# Adding -march=armv7-a makes it slower!
|
||||
|
||||
#
|
||||
# If you compile with the RPi 2 specific options above and try to run it on the RPi
|
||||
# model B (pre version 2), it will die with "illegal instruction."
|
||||
#
|
||||
# Dire Wolf is known to work on the BeagleBone, CubieBoard2, etc.
|
||||
# The best compiler options will depend on the specific type of processor
|
||||
# and the compiler target defaults.
|
||||
#
|
||||
|
||||
neon := $(shell cat /proc/cpuinfo | grep neon)
|
||||
ifneq ($(neon),)
|
||||
CFLAGS += -mfpu=neon
|
||||
endif
|
||||
|
||||
|
||||
#
|
||||
# You would expect "-march=native" to produce the fastest code.
|
||||
# Why don't I use it here?
|
||||
#
|
||||
# 1. In my benchmarks, above, it has a negligible impact if any at all.
|
||||
# 2. Some older versions of gcc don't recognize "native" as a valid choice.
|
||||
# 3. Results are less portable. Not a consideration if you are
|
||||
# building only for your own use but very important for anyone
|
||||
# redistributing a "binary" version.
|
||||
#
|
||||
# If you are planning to distribute the binary version to other
|
||||
# people (in some ham radio software collection, RPM, or DEB package),
|
||||
# avoid # fine tuning it for your particular computer. It could
|
||||
# cause compatibility issues for those with older computers.
|
||||
#
|
||||
|
||||
|
||||
#CFLAGS += -D_FORTIFY_SOURCE
|
||||
|
||||
# If you want to use OSS (for FreeBSD, OpenBSD) instead of
|
||||
# ALSA (for Linux), comment out (or remove) the two lines below.
|
||||
|
||||
CFLAGS += -DUSE_ALSA
|
||||
LDLIBS += -lasound
|
||||
|
||||
|
||||
# Uncomment following lines to enable GPS interface & tracker function.
|
||||
|
||||
#CFLAGS += -DENABLE_GPS
|
||||
#LDLIBS += -lgps
|
||||
|
||||
|
||||
# Name of current directory.
|
||||
# Used to generate zip file name for distribution.
|
||||
|
||||
z := $(notdir ${CURDIR})
|
||||
|
||||
|
||||
# Main application.
|
||||
|
||||
direwolf : direwolf.o config.o recv.o demod.o dsp.o demod_afsk.o demod_9600.o hdlc_rec.o \
|
||||
hdlc_rec2.o multi_modem.o redecode.o rdq.o rrbb.o dlq.o \
|
||||
fcs_calc.o ax25_pad.o \
|
||||
decode_aprs.o symbols.o server.o kiss.o kissnet.o kiss_frame.o hdlc_send.o fcs_calc.o \
|
||||
gen_tone.o audio.o digipeater.o pfilter.o dedupe.o tq.o xmit.o \
|
||||
ptt.o beacon.o dwgps.o encode_aprs.o latlong.o encode_aprs.o latlong.o textcolor.o \
|
||||
dtmf.o aprs_tt.o tt_user.o tt_text.o igate.o nmea.o log.o telemetry.o dtime_now.o \
|
||||
geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lpthread -lrt $(LDLIBS) -lm
|
||||
|
||||
|
||||
# Optimization for slow processors.
|
||||
|
||||
demod.o : fsk_fast_filter.h
|
||||
|
||||
demod_afsk.o : fsk_fast_filter.h
|
||||
|
||||
|
||||
fsk_fast_filter.h : demod_afsk.c
|
||||
$(CC) $(CFLAGS) -o gen_fff -DGEN_FFF demod_afsk.c dsp.c textcolor.c -lm
|
||||
./gen_fff > fsk_fast_filter.h
|
||||
|
||||
|
||||
|
||||
# UTM, USNG, MGRS conversions.
|
||||
|
||||
geotranz.a : error_string.o mgrs.o polarst.o tranmerc.o ups.o usng.o utm.o
|
||||
ar -cr $@ $^
|
||||
|
||||
error_string.o : geotranz/error_string.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
mgrs.o : geotranz/mgrs.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
polarst.o : geotranz/polarst.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
tranmerc.o : geotranz/tranmerc.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
ups.o : geotranz/ups.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
usng.o : geotranz/usng.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
utm.o : geotranz/utm.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
|
||||
|
||||
# Where should we install it?
|
||||
|
||||
# My understanding, of the convention, is that something you compile
|
||||
# from source, that is not a standard part of the operating system,
|
||||
# should go in /usr/local/bin.
|
||||
|
||||
# However, if you are preparing a "binary" RPM or DEB package, the
|
||||
# installation location should be /usr/bin.
|
||||
|
||||
# This is a step in the right direction but not sufficient to use /usr instead.
|
||||
|
||||
INSTALLDIR := /usr/local
|
||||
|
||||
|
||||
# direwolf.desktop was previously handcrafted for the Raspberry Pi.
|
||||
# It was hardcoded with lxterminal, /home/pi, and so on.
|
||||
# In version 1.2, try to customize this to match other situations better.
|
||||
|
||||
# TODO1.2: Test this better.
|
||||
|
||||
|
||||
direwolf.desktop :
|
||||
@echo "Generating customized direwolf.desktop ..."
|
||||
@echo '[Desktop Entry]' > $@
|
||||
@echo 'Type=Application' >> $@
|
||||
ifneq ($(wildcard /usr/bin/lxterminal),)
|
||||
@echo "Exec=lxterminal -t \"Dire Wolf\" -e \"$(INSTALLDIR)/bin/direwolf\"" >> $@
|
||||
else ifneq ($(wildcard /usr/bin/lxterm),)
|
||||
@echo "Exec=lxterm -hold -title \"Dire Wolf\" -bg white -e \"$(INSTALLDIR)/bin/direwolf\"" >> $@
|
||||
else
|
||||
@echo "Exec=xterm -hold -title \"Dire Wolf\" -bg white -e \"$(INSTALLDIR)/bin/direwolf\"" >> $@
|
||||
endif
|
||||
@echo 'Name=Dire Wolf' >> $@
|
||||
@echo 'Comment=APRS Soundcard TNC' >> $@
|
||||
@echo 'Icon=/usr/share/direwolf/dw-icon.png' >> $@
|
||||
@echo "Path=$(HOME)" >> $@
|
||||
@echo '#Terminal=true' >> $@
|
||||
@echo 'Categories=HamRadio' >> $@
|
||||
@echo 'Keywords=Ham Radio;APRS;Soundcard TNC;KISS;AGWPE;AX.25' >> $@
|
||||
|
||||
|
||||
# Optional installation into /usr/local/...
|
||||
# Needs to be run as root or with sudo.
|
||||
# TODO: Review file locations.
|
||||
|
||||
install : direwolf decode_aprs text2tt tt2text ll2utm utm2ll aclients log2gpx gen_packets \
|
||||
tocalls.txt symbols-new.txt symbolsX.txt dw-icon.png direwolf.desktop
|
||||
install direwolf $(INSTALLDIR)/bin
|
||||
install decode_aprs $(INSTALLDIR)/bin
|
||||
install text2tt $(INSTALLDIR)/bin
|
||||
install tt2text $(INSTALLDIR)/bin
|
||||
install ll2utm $(INSTALLDIR)/bin
|
||||
install utm2ll $(INSTALLDIR)/bin
|
||||
install aclients $(INSTALLDIR)/bin
|
||||
install log2gpx $(INSTALLDIR)/bin
|
||||
install gen_packets $(INSTALLDIR)/bin
|
||||
install atest $(INSTALLDIR)/bin
|
||||
install ttcalc $(INSTALLDIR)/bin
|
||||
install dwespeak.sh $(INSTALLDIR)/bin
|
||||
install -D --mode=644 tocalls.txt /usr/share/direwolf/tocalls.txt
|
||||
install -D --mode=644 symbols-new.txt /usr/share/direwolf/symbols-new.txt
|
||||
install -D --mode=644 symbolsX.txt /usr/share/direwolf/symbolsX.txt
|
||||
install -D --mode=644 dw-icon.png /usr/share/direwolf/dw-icon.png
|
||||
install -D --mode=644 direwolf.desktop /usr/share/applications/direwolf.desktop
|
||||
install -D --mode=644 CHANGES.txt $(INSTALLDIR)/share/doc/direwolf/CHANGES.txt
|
||||
install -D --mode=644 LICENSE-dire-wolf.txt $(INSTALLDIR)/share/doc/direwolf/LICENSE-dire-wolf.txt
|
||||
install -D --mode=644 LICENSE-other.txt $(INSTALLDIR)/share/doc/direwolf/LICENSE-other.txt
|
||||
install -D --mode=644 User-Guide.pdf $(INSTALLDIR)/share/doc/direwolf/User-Guide.pdf
|
||||
install -D --mode=644 Raspberry-Pi-APRS.pdf $(INSTALLDIR)/share/doc/direwolf/Raspberry-Pi-APRS.pdf
|
||||
install -D --mode=644 Raspberry-Pi-APRS-Tracker.pdf $(INSTALLDIR)/share/doc/direwolf/Raspberry-Pi-APRS-Tracker.pdf
|
||||
install -D --mode=644 APRStt-Implementation-Notes.pdf $(INSTALLDIR)/share/doc/direwolf/APRStt-Implementation-Notes.pdf
|
||||
install -D --mode=644 A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf $(INSTALLDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf
|
||||
install -D --mode=644 A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf $(INSTALLDIR)/share/doc/direwolf/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf
|
||||
install -D --mode=644 man1/aclients.1 $(INSTALLDIR)/man/man1/aclients.1
|
||||
install -D --mode=644 man1/atest.1 $(INSTALLDIR)/man/man1/atest.1
|
||||
install -D --mode=644 man1/decode_aprs.1 $(INSTALLDIR)/man/man1/decode_aprs.1
|
||||
install -D --mode=644 man1/direwolf.1 $(INSTALLDIR)/man/man1/direwolf.1
|
||||
install -D --mode=644 man1/gen_packets.1 $(INSTALLDIR)/man/man1/gen_packets.1
|
||||
install -D --mode=644 man1/ll2utm.1 $(INSTALLDIR)/man/man1/ll2utm.1
|
||||
install -D --mode=644 man1/log2gpx.1 $(INSTALLDIR)/man/man1/log2gpx.1
|
||||
install -D --mode=644 man1/text2tt.1 $(INSTALLDIR)/man/man1/text2tt.1
|
||||
install -D --mode=644 man1/tt2text.1 $(INSTALLDIR)/man/man1/tt2text.1
|
||||
install -D --mode=644 man1/utm2ll.1 $(INSTALLDIR)/man/man1/utm2ll.1
|
||||
@echo " "
|
||||
@echo "If this is your first install, not an upgrade, type this"
|
||||
@echo "to put a copy of the sample configuration file in your home directory:"
|
||||
@echo " "
|
||||
@echo " make install-conf"
|
||||
@echo " "
|
||||
|
||||
|
||||
# TODO: Should we put the sample direwolf.conf file somewhere like
|
||||
# /usr/share/doc/direwolf/examples or /etc/ax25 and add that to the
|
||||
# end of the search path list?
|
||||
# That would make it easy to see user customizations compared to the
|
||||
# latest sample.
|
||||
|
||||
# These would be done as ordinary user.
|
||||
|
||||
# The Raspberry Pi has ~/Desktop but Ubuntu does not.
|
||||
|
||||
# TODO: Handle Linux variations correctly.
|
||||
|
||||
|
||||
.PHONY: install-conf
|
||||
install-conf : direwolf.conf
|
||||
cp direwolf.conf ~
|
||||
ifneq ($(wildcard $(HOME)/Desktop),)
|
||||
@echo " "
|
||||
@echo "This will add a desktop icon on some systems:"
|
||||
@echo " "
|
||||
@echo " make install-rpi"
|
||||
@echo " "
|
||||
endif
|
||||
|
||||
|
||||
.PHONY: install-rpi
|
||||
install-rpi : dw-start.sh
|
||||
cp dw-start.sh ~
|
||||
ln -f -s /usr/share/applications/direwolf.desktop ~/Desktop/direwolf.desktop
|
||||
|
||||
|
||||
|
||||
# Separate application to decode raw data.
|
||||
|
||||
decode_aprs : decode_aprs.c symbols.c ax25_pad.c textcolor.c fcs_calc.c latlong.c log.c telemetry.o
|
||||
$(CC) $(CFLAGS) -o decode_aprs -DTEST $^ -lm
|
||||
|
||||
|
||||
|
||||
# Convert between text and touch tone representation.
|
||||
|
||||
text2tt : tt_text.c
|
||||
$(CC) $(CFLAGS) -DENC_MAIN -o text2tt tt_text.c
|
||||
|
||||
tt2text : tt_text.c
|
||||
$(CC) $(CFLAGS) -DDEC_MAIN -o tt2text tt_text.c
|
||||
|
||||
|
||||
# Convert between Latitude/Longitude and UTM coordinates.
|
||||
|
||||
ll2utm : ll2utm.c geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm
|
||||
|
||||
utm2ll : utm2ll.c geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm
|
||||
|
||||
|
||||
# Convert from log file to GPX.
|
||||
|
||||
log2gpx : log2gpx.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm
|
||||
|
||||
|
||||
# Test application to generate sound.
|
||||
|
||||
gen_packets : gen_packets.c ax25_pad.c hdlc_send.c fcs_calc.c gen_tone.c textcolor.c dsp.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS) -lm
|
||||
|
||||
demod.o : tune.h
|
||||
demod_afsk.o : tune.h
|
||||
demod_9600.o : tune.h
|
||||
|
||||
testagc : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.o multi_modem.o rrbb.o \
|
||||
fcs_calc.c ax25_pad.c decode_aprs.c telemetry.c latlong.c symbols.c tune.h textcolor.c
|
||||
$(CC) $(CFLAGS) -o atest $^ -lm
|
||||
./atest 02_Track_2.wav | grep "packets decoded in" > atest.out
|
||||
|
||||
|
||||
# Unit test for AFSK demodulator
|
||||
|
||||
|
||||
atest : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.o multi_modem.o rrbb.o \
|
||||
fcs_calc.c ax25_pad.c decode_aprs.c telemetry.c latlong.c symbols.c textcolor.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm -lrt
|
||||
|
||||
# Unit test for inner digipeater algorithm
|
||||
|
||||
|
||||
dtest : digipeater.c pfilter.c ax25_pad.c dedupe.c fcs_calc.c tq.c textcolor.c
|
||||
$(CC) $(CFLAGS) -DTEST -o $@ $^
|
||||
./dtest
|
||||
|
||||
|
||||
# Unit test for APRStt.
|
||||
|
||||
ttest : aprs_tt.c tt_text.c latlong.c misc.a geotranz.a
|
||||
$(CC) $(CFLAGS) -DTT_MAIN -o $@ $^
|
||||
|
||||
|
||||
# Unit test for IGate
|
||||
|
||||
|
||||
itest : igate.c textcolor.c ax25_pad.c fcs_calc.c
|
||||
$(CC) $(CFLAGS) -DITEST -o $@ $^
|
||||
./itest
|
||||
|
||||
|
||||
# Unit test for UDP reception with AFSK demodulator
|
||||
|
||||
udptest : udp_test.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.c multi_modem.c rrbb.c fcs_calc.c ax25_pad.c decode_aprs.c symbols.c textcolor.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm -lrt
|
||||
./udptest
|
||||
|
||||
|
||||
# Unit test for telemetry decoding.
|
||||
|
||||
|
||||
etest : telemetry.c ax25_pad.c fcs_calc.c textcolor.c misc.a regex.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lm -lrt
|
||||
./etest
|
||||
|
||||
|
||||
# Multiple AGWPE network or serial port clients to test TNCs side by side.
|
||||
|
||||
aclients : aclients.c ax25_pad.c fcs_calc.c textcolor.c
|
||||
$(CC) $(CFLAGS) -g -o $@ $^
|
||||
|
||||
|
||||
# Touch Tone to Speech sample application.
|
||||
|
||||
ttcalc : ttcalc.o ax25_pad.o fcs_calc.o textcolor.o
|
||||
$(CC) $(CFLAGS) -g -o $@ $^
|
||||
|
||||
|
||||
depend : $(wildcard *.c)
|
||||
makedepend -f $(lastword $(MAKEFILE_LIST)) -- $(CFLAGS) -- $^
|
||||
|
||||
|
||||
.PHONY: clean
|
||||
clean :
|
||||
rm -f direwolf decode_aprs text2tt tt2text ll2utm utm2ll aclients atest log2gpx gen_packets ttcalc \
|
||||
fsk_fast_filter.h *.o *.a direwolf.desktop
|
||||
echo " " > tune.h
|
||||
|
||||
|
||||
# Package it up for distribution.
|
||||
|
||||
.PHONY: dist-src
|
||||
dist-src : CHANGES.txt User-Guide.pdf Raspberry-Pi-APRS.pdf \
|
||||
Raspberry-Pi-APRS-Tracker.pdf APRStt-Implementation-Notes.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf \
|
||||
dw-start.sh dwespeak.bat dwespeak.sh \
|
||||
tocalls.txt symbols-new.txt symbolsX.txt direwolf.spec
|
||||
rm -f fsk_fast_filter.h
|
||||
echo " " > tune.h
|
||||
rm -f ../$z-src.zip
|
||||
egrep '^C|^L' direwolf.txt | cut -c2-999 > direwolf.conf
|
||||
(cd .. ; zip $z-src.zip \
|
||||
$z/CHANGES.txt \
|
||||
$z/LICENSE* \
|
||||
$z/User-Guide.pdf \
|
||||
$z/Raspberry-Pi-APRS.pdf \
|
||||
$z/Raspberry-Pi-APRS-Tracker.pdf \
|
||||
$z/APRStt-Implementation-Notes.pdf \
|
||||
$z/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf \
|
||||
$z/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf \
|
||||
$z/Makefile* \
|
||||
$z/*.c $z/*.h \
|
||||
$z/regex/* $z/misc/* $z/geotranz/* \
|
||||
$z/man1/* \
|
||||
$z/direwolf.conf $z/direwolf.txt \
|
||||
$z/tocalls.txt $z/symbols-new.txt $z/symbolsX.txt \
|
||||
$z/dw-icon.png $z/dw-icon.rc $z/dw-icon.ico \
|
||||
$z/dw-start.sh $z/direwolf.spec \
|
||||
$z/dwespeak.bat $z/dwespeak.sh )
|
||||
|
||||
|
||||
|
||||
#User-Guide.pdf : User-Guide.docx
|
||||
# echo "***** User-Guide.pdf is out of date *****"
|
||||
|
||||
#Raspberry-Pi-APRS.pdf : Raspberry-Pi-APRS.docx
|
||||
# echo "***** Raspberry-Pi-APRS.pdf is out of date *****"
|
||||
|
||||
#Raspberry-Pi-APRS-Tracker.pdf : Raspberry-Pi-APRS-Tracker.docx
|
||||
# echo "***** Raspberry-Pi-APRS-Tracker.pdf is out of date *****"
|
||||
|
||||
#A-Better-APRS-Packet-Demodulator.pdf : A-Better-APRS-Packet-Demodulator.docx
|
||||
# echo "***** A-Better-APRS-Packet-Demodulator.pdf is out of date *****"
|
||||
|
||||
|
||||
#
|
||||
# The locations below appear to be the most recent.
|
||||
# The copy at http://www.aprs.org/tocalls.txt is out of date.
|
||||
#
|
||||
|
||||
.PHONY: tocalls-symbols
|
||||
tocalls-symbols :
|
||||
cp tocalls.txt tocalls.txt~
|
||||
wget http://www.aprs.org/aprs11/tocalls.txt -O tocalls.txt
|
||||
diff tocalls.txt~ tocalls.txt
|
||||
cp symbols-new.txt symbols-new.txt~
|
||||
wget http://www.aprs.org/symbols/symbols-new.txt -O symbols-new.txt
|
||||
diff symbols-new.txt~ symbols-new.txt
|
||||
cp symbolsX.txt symbolsX.txt~
|
||||
wget http://www.aprs.org/symbols/symbolsX.txt -O symbolsX.txt
|
||||
diff symbolsX.txt~ symbolsX.txt
|
||||
|
||||
|
||||
#
|
||||
# The following is updated by "make depend"
|
||||
#
|
||||
# DO NOT DELETE
|
||||
|
||||
|
427
Makefile.win
427
Makefile.win
|
@ -1,427 +0,0 @@
|
|||
#
|
||||
# Makefile for native Windows version of Dire Wolf.
|
||||
#
|
||||
#
|
||||
# This is built in the Cygwin environment but with the
|
||||
# compiler from http://www.mingw.org/ so there is no
|
||||
# dependency on extra DLLs.
|
||||
#
|
||||
# The MinGW/bin directory must be in the PATH for the
|
||||
# compiler. e.g. export PATH=/cygdrive/c/MinGW/bin:$PATH
|
||||
#
|
||||
# Failure to have the path set correctly will result in the
|
||||
# obscure message: Makefile.win:... recipe for target ... failed.
|
||||
#
|
||||
# Type "which gcc" to make sure you are getting the right one!
|
||||
#
|
||||
|
||||
|
||||
all : direwolf decode_aprs text2tt tt2text ll2utm utm2ll aclients log2gpx gen_packets atest ttcalc
|
||||
|
||||
|
||||
# People say we need -mthreads option for threads to work properly.
|
||||
# They also say it creates a dependency on mingwm10.dll but I'm not seeing that.
|
||||
|
||||
CC := gcc
|
||||
CFLAGS := -Wall -Ofast -march=pentium3 -msse -Iregex -Iutm -Igeotranz -mthreads -DUSE_REGEX_STATIC
|
||||
AR := ar
|
||||
|
||||
#CFLAGS += -g
|
||||
|
||||
#
|
||||
# Let's see impact of various optimization levels.
|
||||
# Benchmark results with MinGW gcc version 4.6.2.
|
||||
#
|
||||
# seconds options, comments
|
||||
# ------ -----------------
|
||||
# 119.8 -O2 Used for version 0.8
|
||||
# 92.1 -O3
|
||||
# 88.7 -Ofast (should be same as -O3 -ffastmath)
|
||||
# 87.5 -Ofast -march=pentium
|
||||
# 74.1 -Ofast -msse
|
||||
# 72.2 -Ofast -march=pentium -msse
|
||||
# 62.0 -Ofast -march=pentium3 (this implies -msse)
|
||||
# 61.9 -Ofast -march=pentium3 -msse
|
||||
#
|
||||
# A minimum of Windows XP is required due to some of the system
|
||||
# features being used. XP requires a Pentium processor or later.
|
||||
# The DSP filters can be sped up considerably with the SSE instructions.
|
||||
# The SSE instructions were introduced in 1999 with the
|
||||
# Pentium III series.
|
||||
# SSE2 instructions, added in 2000, don't seem to offer any advantage.
|
||||
#
|
||||
# For version 0.9, a Pentium 3 or equivalent is now the minimum required
|
||||
# for the prebuilt Windows distribution.
|
||||
# If you insist on using a computer from the previous century,
|
||||
# you can compile this yourself with different options.
|
||||
#
|
||||
|
||||
# Name of zip file for distribution.
|
||||
|
||||
z := $(notdir ${CURDIR})
|
||||
|
||||
|
||||
|
||||
# Main application.
|
||||
|
||||
demod.o : fsk_demod_state.h
|
||||
demod_9600.o : fsk_demod_state.h
|
||||
demod_afsk.o : fsk_demod_state.h
|
||||
|
||||
|
||||
direwolf : direwolf.o config.o recv.o demod.o dsp.o demod_afsk.o demod_9600.o hdlc_rec.o \
|
||||
hdlc_rec2.o multi_modem.o redecode.o rdq.o rrbb.o dlq.o \
|
||||
fcs_calc.o ax25_pad.o \
|
||||
decode_aprs.o symbols.o server.o kiss.o kissnet.o kiss_frame.o hdlc_send.o fcs_calc.o \
|
||||
gen_tone.o audio_win.o digipeater.o pfilter.o dedupe.o tq.o xmit.o \
|
||||
ptt.o beacon.o dwgps.o encode_aprs.o latlong.o textcolor.o \
|
||||
dtmf.o aprs_tt.o tt_user.o tt_text.o igate.o nmea.o log.o telemetry.o dtime_now.o \
|
||||
dw-icon.o regex.a misc.a geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lwinmm -lws2_32
|
||||
|
||||
dw-icon.o : dw-icon.rc dw-icon.ico
|
||||
windres dw-icon.rc -o $@
|
||||
|
||||
|
||||
# Optimization for slow processors.
|
||||
|
||||
demod.o : fsk_fast_filter.h
|
||||
|
||||
demod_afsk.o : fsk_fast_filter.h
|
||||
|
||||
|
||||
fsk_fast_filter.h : demod_afsk.c
|
||||
$(CC) $(CFLAGS) -o gen_fff -DGEN_FFF demod_afsk.c dsp.c textcolor.c
|
||||
./gen_fff > fsk_fast_filter.h
|
||||
|
||||
|
||||
# UTM, USNG, MGRS conversions.
|
||||
|
||||
geotranz.a : error_string.o mgrs.o polarst.o tranmerc.o ups.o usng.o utm.o
|
||||
ar -cr $@ $^
|
||||
|
||||
error_string.o : geotranz/error_string.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
mgrs.o : geotranz/mgrs.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
polarst.o : geotranz/polarst.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
tranmerc.o : geotranz/tranmerc.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
ups.o : geotranz/ups.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
usng.o : geotranz/usng.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
utm.o : geotranz/utm.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
|
||||
#
|
||||
# When building for Linux, we use regular expression
|
||||
# functions supplied by the gnu C library.
|
||||
# For the native WIN32 version, we need to use our own copy.
|
||||
# These were copied from http://gnuwin32.sourceforge.net/packages/regex.htm
|
||||
#
|
||||
|
||||
regex.a : regex.o
|
||||
ar -cr $@ $^
|
||||
|
||||
regex.o : regex/regex.c
|
||||
$(CC) $(CFLAGS) -Dbool=int -Dtrue=1 -Dfalse=0 -c -o $@ $^
|
||||
|
||||
|
||||
# There are also a couple other functions in the misc
|
||||
# subdirectory that are missing on Windows.
|
||||
|
||||
misc.a : strsep.o strtok_r.o strcasestr.o
|
||||
ar -cr $@ $^
|
||||
|
||||
strsep.o : misc/strsep.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
strtok_r.o : misc/strtok_r.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
strcasestr.o : misc/strcasestr.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $^
|
||||
|
||||
|
||||
|
||||
# Separate application to decode raw data.
|
||||
|
||||
decode_aprs : decode_aprs.c symbols.c ax25_pad.c textcolor.c fcs_calc.c latlong.c log.o telemetry.o regex.a misc.a geotranz.a
|
||||
$(CC) $(CFLAGS) -o decode_aprs -DTEST $^
|
||||
|
||||
|
||||
# Convert between text and touch tone representation.
|
||||
|
||||
text2tt : tt_text.c
|
||||
$(CC) $(CFLAGS) -DENC_MAIN -o text2tt tt_text.c
|
||||
|
||||
tt2text : tt_text.c
|
||||
$(CC) $(CFLAGS) -DDEC_MAIN -o tt2text tt_text.c
|
||||
|
||||
|
||||
# Convert between Latitude/Longitude and UTM coordinates.
|
||||
|
||||
ll2utm : ll2utm.c geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
utm2ll : utm2ll.c geotranz.a
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
|
||||
# Convert from log file to GPX.
|
||||
|
||||
log2gpx : log2gpx.c misc/strsep.c misc/strtok_r.c
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
|
||||
# Test application to generate sound.
|
||||
|
||||
gen_packets : gen_packets.o ax25_pad.o hdlc_send.o fcs_calc.o gen_tone.o textcolor.o dsp.o misc.a regex.a
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
|
||||
# For tweaking the demodulator.
|
||||
|
||||
demod.o : tune.h
|
||||
demod_9600.o : tune.h
|
||||
demod_afsk.o : tune.h
|
||||
|
||||
|
||||
testagc : atest.c demod.c dsp.c demod_afsk.c demod_9600.c fsk_demod_agc.h \
|
||||
hdlc_rec.o hdlc_rec2.o multi_modem.o \
|
||||
rrbb.o fcs_calc.o ax25_pad.o decode_aprs.o latlong.o symbols.o textcolor.o telemetry.o \
|
||||
regex.a misc.a \
|
||||
|
||||
rm -f atest.exe
|
||||
$(CC) $(CFLAGS) -o atest $^
|
||||
./atest -P E ../02_Track_2.wav | grep "packets decoded in" >atest.out
|
||||
echo " " > tune.h
|
||||
|
||||
|
||||
noisy3.wav : gen_packets
|
||||
./gen_packets -B 300 -n 100 -o noisy3.wav
|
||||
|
||||
testagc3 : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.c multi_modem.c \
|
||||
rrbb.c fcs_calc.c ax25_pad.c decode_aprs.c latlong.c symbols.c textcolor.c telemetry.c regex.a misc.a \
|
||||
tune.h
|
||||
rm -f atest.exe
|
||||
$(CC) $(CFLAGS) -o atest $^
|
||||
./atest -B 300 -P D -D 3 noisy3.wav | grep "packets decoded in" >atest.out
|
||||
echo " " > tune.h
|
||||
|
||||
|
||||
noisy96.wav : gen_packets
|
||||
./gen_packets -B 9600 -n 100 -o noisy96.wav
|
||||
|
||||
testagc9 : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.c multi_modem.c \
|
||||
rrbb.c fcs_calc.c ax25_pad.c decode_aprs.c latlong.c symbols.c textcolor.c telemetry.c regex.a misc.a \
|
||||
tune.h
|
||||
rm -f atest.exe
|
||||
$(CC) $(CFLAGS) -o atest $^
|
||||
./atest -B 9600 ../walkabout9600.wav | grep "packets decoded in" >atest.out
|
||||
#./atest -B 9600 noisy96.wav | grep "packets decoded in" >atest.out
|
||||
echo " " > tune.h
|
||||
|
||||
|
||||
# Unit test for AFSK demodulator
|
||||
|
||||
atest : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.c multi_modem.c \
|
||||
rrbb.c fcs_calc.c ax25_pad.c decode_aprs.c latlong.c symbols.c textcolor.c telemetry.c misc.a regex.a \
|
||||
fsk_fast_filter.h
|
||||
echo " " > tune.h
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
#./atest ..\\direwolf-0.2\\02_Track_2.wav
|
||||
#atest -B 9600 z9.wav
|
||||
#atest za100.wav
|
||||
|
||||
atest9 : atest.c demod.c dsp.c demod_afsk.c demod_9600.c hdlc_rec.c hdlc_rec2.c multi_modem.c \
|
||||
rrbb.c fcs_calc.c ax25_pad.c decode_aprs.c latlong.c symbols.c textcolor.c telemetry.c misc.a regex.a \
|
||||
fsk_fast_filter.h
|
||||
echo " " > tune.h
|
||||
$(CC) $(CFLAGS) -o $@ $^
|
||||
./atest9 -B 9600 ../walkabout9600.wav | grep "packets decoded in" >atest.out
|
||||
#./atest9 -B 9600 noise96.wav
|
||||
|
||||
|
||||
# Unit test for inner digipeater algorithm
|
||||
|
||||
|
||||
dtest : digipeater.c pfilter.c ax25_pad.c dedupe.c fcs_calc.c tq.c textcolor.c misc.a regex.a
|
||||
$(CC) $(CFLAGS) -DTEST -o $@ $^
|
||||
./dtest
|
||||
rm dtest.exe
|
||||
|
||||
# Unit test for APRStt.
|
||||
|
||||
ttest : aprs_tt.c tt_text.c latlong.c misc.a geotranz.a
|
||||
$(CC) $(CFLAGS) -DTT_MAIN -o $@ $^
|
||||
|
||||
|
||||
# Unit test for IGate
|
||||
|
||||
itest : igate.c textcolor.c ax25_pad.c fcs_calc.c misc.a regex.a
|
||||
$(CC) $(CFLAGS) -DITEST -o $@ $^ -lwinmm -lws2_32
|
||||
|
||||
|
||||
# Unit test for telemetry decoding.
|
||||
|
||||
|
||||
etest : telemetry.c ax25_pad.c fcs_calc.c textcolor.c misc.a regex.a
|
||||
$(CC) $(CFLAGS) -DTEST -o $@ $^
|
||||
./etest
|
||||
|
||||
|
||||
# Multiple AGWPE network or serial port clients to test TNCs side by side.
|
||||
|
||||
aclients : aclients.c ax25_pad.c fcs_calc.c textcolor.c misc.a regex.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lwinmm -lws2_32
|
||||
|
||||
|
||||
# Touch Tone to Speech sample application.
|
||||
|
||||
ttcalc : ttcalc.o ax25_pad.o fcs_calc.o textcolor.o misc.a regex.a
|
||||
$(CC) $(CFLAGS) -o $@ $^ -lwinmm -lws2_32
|
||||
|
||||
|
||||
|
||||
.PHONY: depend
|
||||
depend : $(wildcard *.c)
|
||||
makedepend -f $(lastword $(MAKEFILE_LIST)) -- $(CFLAGS) -- $^
|
||||
|
||||
.PHONY: clean
|
||||
clean :
|
||||
rm -f *.o *.a *.exe fsk_fast_filter.h noisy96.wav
|
||||
echo " " > tune.h
|
||||
|
||||
|
||||
# Package it up for distribution: Prebuilt Windows & source versions.
|
||||
|
||||
|
||||
# Left out RPi Tracker due to Comcast upload size limit.
|
||||
|
||||
.PHONY: dist-win
|
||||
dist-win : direwolf.exe decode_aprs.exe text2tt.exe tt2text.exe ll2utm.exe utm2ll.exe \
|
||||
aclients.exe log2gpx.exe gen_packets.exe atest.exe ttcalc.exe \
|
||||
direwolf.txt dwespeak.bat \
|
||||
CHANGES.txt User-Guide.pdf \
|
||||
Raspberry-Pi-APRS.pdf APRStt-Implementation-Notes.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf
|
||||
rm -f ../$z-win.zip
|
||||
egrep '^C|^W' direwolf.txt | cut -c2-999 > direwolf.conf
|
||||
unix2dos direwolf.conf
|
||||
zip ../$z-win.zip \
|
||||
CHANGES.txt \
|
||||
User-Guide.pdf \
|
||||
Raspberry-Pi-APRS.pdf \
|
||||
APRStt-Implementation-Notes.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf \
|
||||
LICENSE* \
|
||||
direwolf.conf \
|
||||
direwolf.exe \
|
||||
decode_aprs.exe \
|
||||
tocalls.txt symbols-new.txt symbolsX.txt \
|
||||
text2tt.exe tt2text.exe \
|
||||
ll2utm.exe utm2ll.exe \
|
||||
aclients.exe \
|
||||
log2gpx.exe \
|
||||
gen_packets.exe \
|
||||
atest.exe \
|
||||
ttcalc.exe \
|
||||
dwespeak.bat
|
||||
|
||||
.PHONY: dist-src
|
||||
dist-src : CHANGES.txt \
|
||||
User-Guide.pdf \
|
||||
Raspberry-Pi-APRS.pdf \
|
||||
Raspberry-Pi-APRS-Tracker.pdf \
|
||||
APRStt-Implementation-Notes.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf \
|
||||
A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf \
|
||||
dw-start.sh dwespeak.bat dwespeak.sh \
|
||||
tocalls.txt symbols-new.txt symbolsX.txt direwolf.spec
|
||||
rm -f fsk_fast_filter.h
|
||||
echo " " > tune.h
|
||||
rm -f ../$z-src.zip
|
||||
egrep '^C|^L' direwolf.txt | cut -c2-999 > direwolf.conf
|
||||
dos2unix direwolf.conf
|
||||
dos2unix Makefile
|
||||
dos2unix Makefile.linux
|
||||
(cd .. ; zip $z-src.zip \
|
||||
$z/CHANGES.txt \
|
||||
$z/LICENSE* \
|
||||
$z/User-Guide.pdf \
|
||||
$z/Raspberry-Pi-APRS.pdf \
|
||||
$z/Raspberry-Pi-APRS-Tracker.pdf \
|
||||
$z/APRStt-Implementation-Notes.pdf \
|
||||
$z/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf \
|
||||
$z/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf \
|
||||
$z/Makefile.win $z/Makefile.linux $z/Makefile \
|
||||
$z/*.c $z/*.h \
|
||||
$z/regex/* $z/misc/* $z/geotranz/* \
|
||||
$z/man1/* \
|
||||
$z/direwolf.conf $z/direwolf.txt \
|
||||
$z/tocalls.txt $z/symbols-new.txt $z/symbolsX.txt \
|
||||
$z/dw-icon.png $z/dw-icon.rc $z/dw-icon.ico \
|
||||
$z/dw-start.sh $z/direwolf.spec \
|
||||
$z/dwespeak.bat $z/dwespeak.sh )
|
||||
unix2dos Makefile
|
||||
unix2dos Makefile.linux
|
||||
rm direwolf.conf
|
||||
|
||||
|
||||
|
||||
User-Guide.pdf : User-Guide.docx
|
||||
echo "***** User-Guide.pdf is out of date *****"
|
||||
|
||||
Raspberry-Pi-APRS.pdf : Raspberry-Pi-APRS.docx
|
||||
echo "***** Raspberry-Pi-APRS.pdf is out of date *****"
|
||||
|
||||
Raspberry-Pi-APRS-Tracker.pdf : Raspberry-Pi-APRS-Tracker.docx
|
||||
echo "***** Raspberry-Pi-APRS-Tracker.pdf is out of date *****"
|
||||
|
||||
APRStt-Implementation-Notes.pdf : APRStt-Implementation-Notes.docx
|
||||
echo "***** APRStt-Implementation-Notes.pdf is out of date *****"
|
||||
|
||||
A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf : A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.docx
|
||||
echo "***** A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf is out of date *****"
|
||||
|
||||
A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf : A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.docx
|
||||
echo "***** A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf is out of date *****"
|
||||
|
||||
.PHONY: backup
|
||||
backup :
|
||||
mkdir /cygdrive/e/backup-cygwin-home/`date +"%Y-%m-%d"`
|
||||
cp -r . /cygdrive/e/backup-cygwin-home/`date +"%Y-%m-%d"`
|
||||
|
||||
#
|
||||
# The locations below appear to be the most recent.
|
||||
# The copy at http://www.aprs.org/tocalls.txt is out of date.
|
||||
#
|
||||
|
||||
.PHONY: tocalls-symbols
|
||||
tocalls-symbols :
|
||||
cp tocalls.txt tocalls.txt~
|
||||
wget http://www.aprs.org/aprs11/tocalls.txt -O tocalls.txt
|
||||
diff tocalls.txt~ tocalls.txt
|
||||
cp symbols-new.txt symbols-new.txt~
|
||||
wget http://www.aprs.org/symbols/symbols-new.txt -O symbols-new.txt
|
||||
diff symbols-new.txt~ symbols-new.txt
|
||||
cp symbolsX.txt symbolsX.txt~
|
||||
wget http://www.aprs.org/symbols/symbolsX.txt -O symbolsX.txt
|
||||
diff symbolsX.txt~ symbolsX.txt
|
||||
|
||||
#
|
||||
# The following is updated by "make depend"
|
||||
#
|
||||
# DO NOT DELETE
|
||||
|
|
@ -0,0 +1,235 @@
|
|||
|
||||
# Dire Wolf #
|
||||
|
||||
### Decoded Information from Radio Emissions for Windows Or Linux Fans ###
|
||||
|
||||
In the early days of Amateur Packet Radio, it was necessary to use an expensive "Terminal Node Controller" (TNC) with specialized hardware. Those days are gone. You can now get better results at lower cost by connecting your radio to the "soundcard" interface of a computer and using software to decode the signals.
|
||||
|
||||
Why waste $200 and settle for mediocre receive performance from a 1980's technology TNC using an old modem chip? Dire Wolf decodes over 1000 error-free frames from Track 2 of the [WA8LMF TNC Test CD](https://github.com/wb2osz/direwolf/tree/dev/doc/WA8LMF-TNC-Test-CD-Results.pdf), leaving all the hardware TNCs, and first generation "soundcard" modems, behind in the dust.
|
||||
|
||||

|
||||
|
||||
Dire Wolf includes [FX.25](https://en.wikipedia.org/wiki/FX.25_Forward_Error_Correction) which adds Forward Error Correction (FEC) in a way that is completely compatible with existing systems. If both ends are capable of FX.25, your information will continue to get through under conditions where regular AX.25 is completely useless. This was originally developed for satellites and is now seeing widespread use on HF.
|
||||
|
||||

|
||||
|
||||
Version 1.7 adds [IL2P](https://en.wikipedia.org/wiki/Improved_Layer_2_Protocol), a different method of FEC with less overhead but it is not compatible with AX.25.
|
||||
|
||||
|
||||
|
||||
### Dire Wolf is a modern software replacement for the old 1980's style TNC built with special hardware. ###
|
||||
|
||||
Without any additional software, it can perform as:
|
||||
|
||||
- APRS GPS Tracker
|
||||
- Digipeater
|
||||
- Internet Gateway (IGate)
|
||||
- [APRStt](http://www.aprs.org/aprstt.html) gateway
|
||||
|
||||
|
||||
It can also be used as a virtual TNC for other applications such as [APRSIS32](http://aprsisce.wikidot.com/), [Xastir](http://xastir.org/index.php/Main_Page), [APRS-TW](http://aprstw.blandranch.net/), [YAAC](http://www.ka2ddo.org/ka2ddo/YAAC.html), [PinPoint APRS](http://www.pinpointaprs.com/), [UI-View32](http://www.ui-view.net/),[UISS](http://users.belgacom.net/hamradio/uiss.htm), [Linux AX25](http://www.linux-ax25.org/wiki/Main_Page), [SARTrack](http://www.sartrack.co.nz/index.html), [Winlink Express (formerly known as RMS Express, formerly known as Winlink 2000 or WL2K)](http://www.winlink.org/RMSExpress), [BPQ32](http://www.cantab.net/users/john.wiseman/Documents/BPQ32.html), [Outpost PM](http://www.outpostpm.org/), [Ham Radio of Things](https://github.com/wb2osz/hrot), [Packet Compressed Sensing Imaging (PCSI)](https://maqifrnswa.github.io/PCSI/), and many others.
|
||||
|
||||
|
||||
## Features & Benefits ##
|
||||
|
||||

|
||||
|
||||
### Dire Wolf includes: ###
|
||||
|
||||
|
||||
|
||||
- **Beaconing, Tracker, Telemetry Toolkit.**
|
||||
|
||||
Send periodic beacons to provide information to others. For tracking the location is provided by a GPS receiver.
|
||||
Build your own telemetry applications with the toolkit.
|
||||
|
||||
|
||||
- **APRStt Gateway.**
|
||||
|
||||
Very few hams have portable equipment for APRS but nearly everyone has a handheld radio that can send DTMF tones. APRStt allows a user, equipped with only DTMF (commonly known as Touch Tone) generation capability, to enter information into the global APRS data network. Responses can be sent by Morse Code or synthesized speech.
|
||||
|
||||
- **Digipeaters for APRS and traditional Packet Radio.**
|
||||
|
||||
Extend the range of other stations by re-transmitting their signals. Unmatched flexibility for cross band repeating and filtering to limit what is retransmitted.
|
||||
|
||||
- **Internet Gateway (IGate).**
|
||||
|
||||
IGate stations allow communication between disjoint radio networks by allowing some content to flow between them over the Internet.
|
||||
|
||||
- **Ham Radio of Things (HRoT).**
|
||||
|
||||
There have been occasional mentions of merging Ham Radio with the Internet of Things but only ad hoc incompatible narrowly focused applications. Here is a proposal for a standardized more flexible method so different systems can communicate with each other.
|
||||
|
||||
[Ham Radio of Things - IoT over Ham Radio](https://github.com/wb2osz/hrot)
|
||||
|
||||
- **AX.25 v2.2 Link Layer.**
|
||||
|
||||
Traditional connected mode packet radio where the TNC automatically retries transmissions and delivers data in the right order.
|
||||
|
||||
- **KISS Interface (TCP/IP, serial port, Bluetooth) & AGW network Interface (TCP/IP).**
|
||||
|
||||
Dire Wolf can be used as a virtual TNC for applications such as [APRSIS32](http://aprsisce.wikidot.com/), [Xastir](http://xastir.org/index.php/Main_Page), [APRS-TW](http://aprstw.blandranch.net/), [YAAC](http://www.ka2ddo.org/ka2ddo/YAAC.html), [PinPoint APRS](http://www.pinpointaprs.com/), [UI-View32](http://www.ui-view.net/),[UISS](http://users.belgacom.net/hamradio/uiss.htm), [Linux AX25](http://www.linux-ax25.org/wiki/Main_Page), [SARTrack](http://www.sartrack.co.nz/index.html), [Winlink Express (formerly known as RMS Express, formerly known as Winlink 2000 or WL2K)](http://www.winlink.org/RMSExpress), [BPQ32](http://www.cantab.net/users/john.wiseman/Documents/BPQ32.html), [Outpost PM](http://www.outpostpm.org/), [Ham Radio of Things](https://github.com/wb2osz/hrot), [Packet Compressed Sensing Imaging (PCSI)](https://maqifrnswa.github.io/PCSI/), and many others.
|
||||
|
||||
### Radio Interfaces: ###
|
||||
|
||||
- **Uses computer's "soundcard" and digital signal processing.**
|
||||
|
||||
Lower cost and better performance than specialized hardware.
|
||||
|
||||
Compatible interfaces include [DRAWS](http://nwdigitalradio.com/draws/), [UDRC](https://nw-digital-radio.groups.io/g/udrc/wiki/UDRC%E2%84%A2-and-Direwolf-Packet-Modem), [SignaLink USB](http://www.tigertronics.com/slusbmain.htm), [DMK URI](http://www.dmkeng.com/URI_Order_Page.htm), [RB-USB RIM](http://www.repeater-builder.com/products/usb-rim-lite.html), [RA-35](http://www.masterscommunications.com/products/radio-adapter/ra35.html), [DINAH](https://hamprojects.info/dinah/), [SHARI](https://hamprojects.info/shari/), and many others.
|
||||
|
||||
|
||||
|
||||
- **Modems:**
|
||||
|
||||
300 bps AFSK for HF
|
||||
|
||||
1200 bps AFSK most common for VHF/UHF
|
||||
|
||||
2400 & 4800 bps PSK
|
||||
|
||||
9600 bps GMSK/G3RUH
|
||||
|
||||
AIS reception
|
||||
|
||||
EAS SAME reception
|
||||
|
||||
|
||||
|
||||
- **DTMF ("Touch Tone") Decoding and Encoding.**
|
||||
|
||||
- **Speech Synthesizer interface & Morse code generator.**
|
||||
|
||||
Transmit human understandable messages.
|
||||
|
||||
- **Compatible with Software Defined Radios such as gqrx, rtl_fm, and SDR#.**
|
||||
|
||||
- **Concurrent operation with up to 3 soundcards and 6 radios.**
|
||||
|
||||
### Portable & Open Source: ###
|
||||
|
||||
- **Runs on Windows, Linux (PC/laptop, Raspberry Pi, etc.), Mac OSX.**
|
||||
|
||||
|
||||
|
||||
## Documentation ##
|
||||
|
||||
|
||||
[Stable Version](https://github.com/wb2osz/direwolf/tree/master/doc)
|
||||
|
||||
[Latest Development Version ("dev" branch)](https://github.com/wb2osz/direwolf/tree/dev/doc)
|
||||
|
||||
[Additional Topics](https://github.com/wb2osz/direwolf-doc)
|
||||
|
||||
[Power Point presentations](https://github.com/wb2osz/direwolf-presentation) -- Why not give a talk at a local club meeting?
|
||||
|
||||
Youtube has many interesting and helpful videos. Searching for [direwolf tnc](https://www.youtube.com/results?search_query=direwolf+tnc) or [direwolf aprs](https://www.youtube.com/results?search_query=direwolf+aprs) will produce the most relevant results.
|
||||
|
||||
## Installation ##
|
||||
|
||||
### Windows ###
|
||||
|
||||
Go to the [**releases** page](https://github.com/wb2osz/direwolf/releases). Download a zip file with "win" in its name, unzip it, and run direwolf.exe from a command window.
|
||||
|
||||
You can also build it yourself from source. For more details see the **User Guide** in the [**doc** directory](https://github.com/wb2osz/direwolf/tree/master/doc).
|
||||
|
||||
|
||||
|
||||
|
||||
### Linux - Using git clone (recommended) ###
|
||||
|
||||
***Note that this has changed for version 1.6. There are now a couple extra steps.***
|
||||
|
||||
|
||||
First you will need to install some software development packages using different commands depending on your flavor of Linux.
|
||||
In most cases, the first few will already be there and the package installer will tell you that installation is not necessary.
|
||||
|
||||
On Debian / Ubuntu / Raspbian / Raspberry Pi OS:
|
||||
|
||||
sudo apt-get install git
|
||||
sudo apt-get install gcc
|
||||
sudo apt-get install g++
|
||||
sudo apt-get install make
|
||||
sudo apt-get install cmake
|
||||
sudo apt-get install libasound2-dev
|
||||
sudo apt-get install libudev-dev
|
||||
sudo apt-get install libavahi-client-dev
|
||||
|
||||
Or on Red Hat / Fedora / CentOS:
|
||||
|
||||
sudo yum install git
|
||||
sudo yum install gcc
|
||||
sudo yum install gcc-c++
|
||||
sudo yum install make
|
||||
sudo yum install alsa-lib-devel
|
||||
sudo yum install libudev-devel
|
||||
sudo yum install avahi-devel
|
||||
|
||||
CentOS 6 & 7 currently have cmake 2.8 but we need 3.1 or later.
|
||||
First you need to enable the EPEL repository. Add a symlink if you don't already have the older version and want to type cmake rather than cmake3.
|
||||
|
||||
sudo yum install epel-release
|
||||
sudo rpm -e cmake
|
||||
sudo yum install cmake3
|
||||
sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
|
||||
|
||||
Then on any flavor of Linux:
|
||||
|
||||
cd ~
|
||||
git clone https://www.github.com/wb2osz/direwolf
|
||||
cd direwolf
|
||||
git checkout dev
|
||||
mkdir build && cd build
|
||||
cmake ..
|
||||
make -j4
|
||||
sudo make install
|
||||
make install-conf
|
||||
|
||||
This gives you the latest development version. Leave out the "git checkout dev" to get the most recent stable release.
|
||||
|
||||
For more details see the **User Guide** in the [**doc** directory](https://github.com/wb2osz/direwolf/tree/master/doc). Special considerations for the Raspberry Pi are found in **Raspberry-Pi-APRS.pdf**
|
||||
|
||||
|
||||
### Linux - Using apt-get (Debian flavor operating systems) ###
|
||||
|
||||
Results will vary depending on your hardware platform and operating system version because it depends on various volunteers who perform the packaging. Expect the version to lag significantly behind development.
|
||||
|
||||
sudo apt-get update
|
||||
apt-cache showpkg direwolf
|
||||
sudo apt-get install direwolf
|
||||
|
||||
|
||||
### Linux - Using yum (Red Hat flavor operating systems) ###
|
||||
|
||||
Results will vary depending on your hardware platform and operating system version because it depends on various volunteers who perform the packaging. Expect the version to lag significantly behind development.
|
||||
|
||||
sudo yum check-update
|
||||
sudo yum list direwolf
|
||||
sudo yum install direwolf
|
||||
|
||||
|
||||
### Macintosh OS X ###
|
||||
|
||||
Read the **User Guide** in the [**doc** directory](https://github.com/wb2osz/direwolf/tree/master/doc). It is more complicated than Linux.
|
||||
|
||||
If you have problems, post them to the [Dire Wolf packet TNC](https://groups.io/g/direwolf) discussion group.
|
||||
|
||||
You can also install a pre-built version from Mac Ports. Keeping this up to date depends on volunteers who perform the packaging. This version could lag behind development.
|
||||
|
||||
sudo port install direwolf
|
||||
|
||||
|
||||
## Join the conversation ##
|
||||
|
||||
Here are some good places to ask questions and share your experience:
|
||||
|
||||
- [Dire Wolf Software TNC](https://groups.io/g/direwolf)
|
||||
|
||||
- [Raspberry Pi 4 Ham Radio](https://groups.io/g/RaspberryPi-4-HamRadio)
|
||||
|
||||
- [linuxham](https://groups.io/g/linuxham)
|
||||
|
||||
- [TAPR aprssig](http://www.tapr.org/pipermail/aprssig/)
|
||||
|
||||
|
||||
The github "issues" section is for reporting software defects and enhancement requests. It is NOT a place to ask questions or have general discussions. Please use one of the locations above.
|
Binary file not shown.
Binary file not shown.
BIN
User-Guide.pdf
BIN
User-Guide.pdf
Binary file not shown.
708
atest.c
708
atest.c
|
@ -1,708 +0,0 @@
|
|||
|
||||
//
|
||||
// This file is part of Dire Wolf, an amateur radio packet TNC.
|
||||
//
|
||||
// Copyright (C) 2011, 2012, 2013, 2014, 2015 John Langner, WB2OSZ
|
||||
//
|
||||
// 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
|
||||
// the Free Software Foundation, either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: atest.c
|
||||
*
|
||||
* Purpose: Test fixture for the AFSK demodulator.
|
||||
*
|
||||
* Inputs: Takes audio from a .WAV file insted of the audio device.
|
||||
*
|
||||
* Description: This can be used to test the AFSK demodulator under
|
||||
* controlled and reproducable conditions for tweaking.
|
||||
*
|
||||
* For example
|
||||
*
|
||||
* (1) Download WA8LMF's TNC Test CD image file from
|
||||
* http://wa8lmf.net/TNCtest/index.htm
|
||||
*
|
||||
* (2) Burn a physical CD.
|
||||
*
|
||||
* (3) "Rip" the desired tracks with Windows Media Player.
|
||||
* Select .WAV file format.
|
||||
*
|
||||
* "Track 2" is used for most tests because that is more
|
||||
* realistic for most people using the speaker output.
|
||||
*
|
||||
*
|
||||
* Without ONE_CHAN defined:
|
||||
*
|
||||
* Notice that the number of packets decoded, as reported by
|
||||
* this test program, will be twice the number expected because
|
||||
* we are decoding the left and right audio channels separately.
|
||||
*
|
||||
*
|
||||
* With ONE_CHAN defined:
|
||||
*
|
||||
* Only process one channel.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
// #define X 1
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <getopt.h>
|
||||
|
||||
|
||||
#define ATEST_C 1
|
||||
|
||||
#include "audio.h"
|
||||
#include "demod.h"
|
||||
#include "multi_modem.h"
|
||||
#include "textcolor.h"
|
||||
#include "ax25_pad.h"
|
||||
#include "hdlc_rec2.h"
|
||||
#include "dlq.h"
|
||||
#include "ptt.h"
|
||||
|
||||
|
||||
|
||||
#if 0 /* Typical but not flexible enough. */
|
||||
|
||||
struct wav_header { /* .WAV file header. */
|
||||
char riff[4]; /* "RIFF" */
|
||||
int filesize; /* file length - 8 */
|
||||
char wave[4]; /* "WAVE" */
|
||||
char fmt[4]; /* "fmt " */
|
||||
int fmtsize; /* 16. */
|
||||
short wformattag; /* 1 for PCM. */
|
||||
short nchannels; /* 1 for mono, 2 for stereo. */
|
||||
int nsamplespersec; /* sampling freq, Hz. */
|
||||
int navgbytespersec; /* = nblockalign*nsamplespersec. */
|
||||
short nblockalign; /* = wbitspersample/8 * nchannels. */
|
||||
short wbitspersample; /* 16 or 8. */
|
||||
char data[4]; /* "data" */
|
||||
int datasize; /* number of bytes following. */
|
||||
} ;
|
||||
#endif
|
||||
/* 8 bit samples are unsigned bytes */
|
||||
/* in range of 0 .. 255. */
|
||||
|
||||
/* 16 bit samples are signed short */
|
||||
/* in range of -32768 .. +32767. */
|
||||
|
||||
static struct {
|
||||
char riff[4]; /* "RIFF" */
|
||||
int filesize; /* file length - 8 */
|
||||
char wave[4]; /* "WAVE" */
|
||||
} header;
|
||||
|
||||
static struct {
|
||||
char id[4]; /* "LIST" or "fmt " */
|
||||
int datasize;
|
||||
} chunk;
|
||||
|
||||
static struct {
|
||||
short wformattag; /* 1 for PCM. */
|
||||
short nchannels; /* 1 for mono, 2 for stereo. */
|
||||
int nsamplespersec; /* sampling freq, Hz. */
|
||||
int navgbytespersec; /* = nblockalign*nsamplespersec. */
|
||||
short nblockalign; /* = wbitspersample/8 * nchannels. */
|
||||
short wbitspersample; /* 16 or 8. */
|
||||
char extras[4];
|
||||
} format;
|
||||
|
||||
static struct {
|
||||
char data[4]; /* "data" */
|
||||
int datasize;
|
||||
} wav_data;
|
||||
|
||||
|
||||
static FILE *fp;
|
||||
static int e_o_f;
|
||||
static int packets_decoded = 0;
|
||||
static int decimate = 0; /* Reduce that sampling rate if set. */
|
||||
/* 1 = normal, 2 = half, etc. */
|
||||
|
||||
static struct audio_s my_audio_config;
|
||||
|
||||
static int error_if_less_than = 0; /* Exit with error status if this minimum not reached. */
|
||||
|
||||
|
||||
|
||||
//#define EXPERIMENT_G 1
|
||||
//#define EXPERIMENT_H 1
|
||||
|
||||
#if defined(EXPERIMENT_G) || defined(EXPERIMENT_H)
|
||||
|
||||
static int count[MAX_SUBCHANS];
|
||||
|
||||
#if EXPERIMENT_H
|
||||
extern float space_gain[MAX_SUBCHANS];
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
static void usage (void);
|
||||
|
||||
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
|
||||
int err;
|
||||
int c;
|
||||
int channel;
|
||||
time_t start_time;
|
||||
|
||||
|
||||
|
||||
#if defined(EXPERIMENT_G) || defined(EXPERIMENT_H)
|
||||
int j;
|
||||
|
||||
for (j=0; j<MAX_SUBCHANS; j++) {
|
||||
count[j] = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
text_color_init(1);
|
||||
text_color_set(DW_COLOR_INFO);
|
||||
|
||||
/*
|
||||
* First apply defaults.
|
||||
*/
|
||||
|
||||
memset (&my_audio_config, 0, sizeof(my_audio_config));
|
||||
|
||||
my_audio_config.adev[0].num_channels = DEFAULT_NUM_CHANNELS;
|
||||
my_audio_config.adev[0].samples_per_sec = DEFAULT_SAMPLES_PER_SEC;
|
||||
my_audio_config.adev[0].bits_per_sample = DEFAULT_BITS_PER_SAMPLE;
|
||||
|
||||
// Results v0.9:
|
||||
//
|
||||
// fix_bits = 0 971 packets, 69 sec
|
||||
// fix_bits = SINGLE 990 64
|
||||
// fix_bits = DOUBLE 992 65
|
||||
// fix_bits = TRIPLE 992 67
|
||||
// fix_bits = TWO_SEP 1004 476
|
||||
|
||||
// Essentially no difference in time for those with order N time.
|
||||
// Time increases greatly for the one with order N^2 time.
|
||||
|
||||
|
||||
// Results: version 1.1, decoder C, my_audio_config.fix_bits = RETRY_MAX - 1
|
||||
//
|
||||
// 971 NONE
|
||||
// +19 SINGLE
|
||||
// +2 DOUBLE
|
||||
// +12 TWO_SEP
|
||||
// +3 REMOVE_MANY
|
||||
// ----
|
||||
// 1007 Total in 1008 sec. More than twice as long as earlier version.
|
||||
|
||||
// Results: version 1.1, decoders ABC, my_audio_config.fix_bits = RETRY_MAX - 1
|
||||
//
|
||||
// 976 NONE
|
||||
// +21 SINGLE
|
||||
// +1 DOUBLE
|
||||
// +22 TWO_SEP
|
||||
// +1 MANY
|
||||
// +3 REMOVE_MANY
|
||||
// ----
|
||||
// 1024 Total in 2042 sec.
|
||||
// About 34 minutes of CPU time for a roughly 40 minute CD.
|
||||
// Many computers wouldn't be able to keep up.
|
||||
|
||||
// The SINGLE and TWO_SEP techniques are the most effective.
|
||||
// Should we reorder the enum values so that TWO_SEP
|
||||
// comes after SINGLE? That way "FIX_BITS 2" would
|
||||
// use the two most productive techniques and not waste
|
||||
// time on the others. People with plenty of CPU power
|
||||
// to spare can still specify larger numbers for the other
|
||||
// techniques with less return on investment.
|
||||
|
||||
|
||||
for (channel=0; channel<MAX_CHANS; channel++) {
|
||||
|
||||
my_audio_config.achan[channel].modem_type = MODEM_AFSK;
|
||||
|
||||
my_audio_config.achan[channel].mark_freq = DEFAULT_MARK_FREQ;
|
||||
my_audio_config.achan[channel].space_freq = DEFAULT_SPACE_FREQ;
|
||||
my_audio_config.achan[channel].baud = DEFAULT_BAUD;
|
||||
|
||||
strcpy (my_audio_config.achan[channel].profiles, "E");
|
||||
|
||||
my_audio_config.achan[channel].num_freq = 1;
|
||||
my_audio_config.achan[channel].offset = 0;
|
||||
|
||||
my_audio_config.achan[channel].fix_bits = RETRY_NONE;
|
||||
|
||||
my_audio_config.achan[channel].sanity_test = SANITY_APRS;
|
||||
//my_audio_config.achan[channel].sanity_test = SANITY_AX25;
|
||||
//my_audio_config.achan[channel].sanity_test = SANITY_NONE;
|
||||
|
||||
my_audio_config.achan[channel].passall = 0;
|
||||
//my_audio_config.achan[channel].passall = 1;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] = {
|
||||
{"future1", 1, 0, 0},
|
||||
{"future2", 0, 0, 0},
|
||||
{"future3", 1, 0, 'c'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/* ':' following option character means arg is required. */
|
||||
|
||||
c = getopt_long(argc, argv, "B:P:D:F:e:",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
|
||||
case 'B': /* -B for data Bit rate */
|
||||
/* 300 implies 1600/1800 AFSK. */
|
||||
/* 1200 implies 1200/2200 AFSK. */
|
||||
/* 9600 implies scrambled. */
|
||||
|
||||
my_audio_config.achan[0].baud = atoi(optarg);
|
||||
|
||||
dw_printf ("Data rate set to %d bits / second.\n", my_audio_config.achan[0].baud);
|
||||
|
||||
if (my_audio_config.achan[0].baud < 100 || my_audio_config.achan[0].baud > 10000) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Use a more reasonable bit rate in range of 100 - 10000.\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
if (my_audio_config.achan[0].baud < 600) {
|
||||
my_audio_config.achan[0].modem_type = MODEM_AFSK;
|
||||
my_audio_config.achan[0].mark_freq = 1600;
|
||||
my_audio_config.achan[0].space_freq = 1800;
|
||||
strcpy (my_audio_config.achan[0].profiles, "D"); }
|
||||
else if (my_audio_config.achan[0].baud > 2400) {
|
||||
my_audio_config.achan[0].modem_type = MODEM_SCRAMBLE;
|
||||
my_audio_config.achan[0].mark_freq = 0;
|
||||
my_audio_config.achan[0].space_freq = 0;
|
||||
strcpy (my_audio_config.achan[0].profiles, " "); // avoid getting default later.
|
||||
dw_printf ("Using scrambled baseband signal rather than AFSK.\n");
|
||||
}
|
||||
else {
|
||||
my_audio_config.achan[0].modem_type = MODEM_AFSK;
|
||||
my_audio_config.achan[0].mark_freq = 1200;
|
||||
my_audio_config.achan[0].space_freq = 2200;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'P': /* -P for modem profile. */
|
||||
|
||||
dw_printf ("Demodulator profile set to \"%s\"\n", optarg);
|
||||
strcpy (my_audio_config.achan[0].profiles, optarg);
|
||||
break;
|
||||
|
||||
case 'D': /* -D reduce sampling rate for lower CPU usage. */
|
||||
|
||||
decimate = atoi(optarg);
|
||||
|
||||
dw_printf ("Divide audio sample rate by %d\n", decimate);
|
||||
if (decimate < 1 || decimate > 8) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Unreasonable value for -D.\n");
|
||||
exit (1);
|
||||
}
|
||||
dw_printf ("Divide audio sample rate by %d\n", decimate);
|
||||
my_audio_config.achan[0].decimate = decimate;
|
||||
break;
|
||||
|
||||
case 'F': /* -D set "fix bits" level. */
|
||||
|
||||
my_audio_config.achan[0].fix_bits = atoi(optarg);
|
||||
|
||||
if (my_audio_config.achan[0].fix_bits < RETRY_NONE || my_audio_config.achan[0].fix_bits >= RETRY_MAX) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Invalid Fix Bits level.\n");
|
||||
exit (1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'e': /* -e error if less than this number decoded. */
|
||||
|
||||
error_if_less_than = atoi(optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
|
||||
/* Unknown option message was already printed. */
|
||||
usage ();
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Should not be here. */
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf("?? getopt returned character code 0%o ??\n", c);
|
||||
usage ();
|
||||
}
|
||||
}
|
||||
|
||||
if (optind >= argc) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Specify .WAV file name on command line.\n");
|
||||
usage ();
|
||||
}
|
||||
|
||||
fp = fopen(argv[optind], "rb");
|
||||
if (fp == NULL) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Couldn't open file for read: %s\n", argv[optind]);
|
||||
//perror ("more info?");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
start_time = time(NULL);
|
||||
|
||||
|
||||
/*
|
||||
* Read the file header.
|
||||
* Doesn't handle all possible cases but good enough for our purposes.
|
||||
*/
|
||||
|
||||
err= fread (&header, (size_t)12, (size_t)1, fp);
|
||||
|
||||
if (strncmp(header.riff, "RIFF", 4) != 0 || strncmp(header.wave, "WAVE", 4) != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("This is not a .WAV format file.\n");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
err = fread (&chunk, (size_t)8, (size_t)1, fp);
|
||||
|
||||
if (strncmp(chunk.id, "LIST", 4) == 0) {
|
||||
err = fseek (fp, (long)chunk.datasize, SEEK_CUR);
|
||||
err = fread (&chunk, (size_t)8, (size_t)1, fp);
|
||||
}
|
||||
|
||||
if (strncmp(chunk.id, "fmt ", 4) != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("WAV file error: Found \"%4.4s\" where \"fmt \" was expected.\n", chunk.id);
|
||||
exit(1);
|
||||
}
|
||||
if (chunk.datasize != 16 && chunk.datasize != 18) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("WAV file error: Need fmt chunk datasize of 16 or 18. Found %d.\n", chunk.datasize);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
err = fread (&format, (size_t)chunk.datasize, (size_t)1, fp);
|
||||
|
||||
err = fread (&wav_data, (size_t)8, (size_t)1, fp);
|
||||
|
||||
if (strncmp(wav_data.data, "data", 4) != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("WAV file error: Found \"%4.4s\" where \"data\" was expected.\n", wav_data.data);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
assert (format.nchannels == 1 || format.nchannels == 2);
|
||||
assert (format.wbitspersample == 8 || format.wbitspersample == 16);
|
||||
|
||||
my_audio_config.adev[0].samples_per_sec = format.nsamplespersec;
|
||||
my_audio_config.adev[0].bits_per_sample = format.wbitspersample;
|
||||
my_audio_config.adev[0].num_channels = format.nchannels;
|
||||
|
||||
my_audio_config.achan[0].valid = 1;
|
||||
if (format.nchannels == 2) my_audio_config.achan[1].valid = 1;
|
||||
|
||||
text_color_set(DW_COLOR_INFO);
|
||||
dw_printf ("%d samples per second\n", my_audio_config.adev[0].samples_per_sec);
|
||||
dw_printf ("%d bits per sample\n", my_audio_config.adev[0].bits_per_sample);
|
||||
dw_printf ("%d audio channels\n", my_audio_config.adev[0].num_channels);
|
||||
dw_printf ("%d audio bytes in file\n", (int)(wav_data.datasize));
|
||||
dw_printf ("Fix Bits level = %d\n", my_audio_config.achan[0].fix_bits);
|
||||
|
||||
|
||||
/*
|
||||
* Initialize the AFSK demodulator and HDLC decoder.
|
||||
*/
|
||||
multi_modem_init (&my_audio_config);
|
||||
|
||||
|
||||
e_o_f = 0;
|
||||
while ( ! e_o_f)
|
||||
{
|
||||
|
||||
|
||||
int audio_sample;
|
||||
int c;
|
||||
|
||||
for (c=0; c<my_audio_config.adev[0].num_channels; c++)
|
||||
{
|
||||
|
||||
/* This reads either 1 or 2 bytes depending on */
|
||||
/* bits per sample. */
|
||||
|
||||
audio_sample = demod_get_sample (ACHAN2ADEV(c));
|
||||
|
||||
if (audio_sample >= 256 * 256)
|
||||
e_o_f = 1;
|
||||
|
||||
#define ONE_CHAN 1 /* only use one audio channel. */
|
||||
|
||||
#if ONE_CHAN
|
||||
if (c != 0) continue;
|
||||
#endif
|
||||
|
||||
multi_modem_process_sample(c,audio_sample);
|
||||
}
|
||||
|
||||
/* When a complete frame is accumulated, */
|
||||
/* process_rec_frame, below, is called. */
|
||||
|
||||
}
|
||||
text_color_set(DW_COLOR_INFO);
|
||||
dw_printf ("\n\n");
|
||||
|
||||
#if EXPERIMENT_G
|
||||
|
||||
for (j=0; j<MAX_SUBCHANS; j++) {
|
||||
float db = 20.0 * log10f(space_gain[j]);
|
||||
dw_printf ("%+.1f dB, %d\n", db, count[j]);
|
||||
}
|
||||
#endif
|
||||
#if EXPERIMENT_H
|
||||
|
||||
for (j=0; j<MAX_SUBCHANS; j++) {
|
||||
dw_printf ("%d\n", count[j]);
|
||||
}
|
||||
#endif
|
||||
dw_printf ("%d packets decoded in %d seconds.\n", packets_decoded, (int)(time(NULL) - start_time));
|
||||
|
||||
if (packets_decoded < error_if_less_than) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("\n * * * TEST FAILED to achieve minimum of %d * * * \n", error_if_less_than);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Simulate sample from the audio device.
|
||||
*/
|
||||
|
||||
int audio_get (int a)
|
||||
{
|
||||
int ch;
|
||||
|
||||
if (wav_data.datasize <= 0) {
|
||||
e_o_f = 1;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
ch = getc(fp);
|
||||
wav_data.datasize--;
|
||||
|
||||
if (ch < 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Unexpected end of file.\n");
|
||||
e_o_f = 1;
|
||||
}
|
||||
|
||||
return (ch);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Rather than queuing up frames with bad FCS,
|
||||
* try to fix them immediately.
|
||||
*/
|
||||
|
||||
void rdq_append (rrbb_t rrbb)
|
||||
{
|
||||
int chan;
|
||||
alevel_t alevel;
|
||||
int subchan;
|
||||
|
||||
|
||||
chan = rrbb_get_chan(rrbb);
|
||||
subchan = rrbb_get_subchan(rrbb);
|
||||
alevel = rrbb_get_audio_level(rrbb);
|
||||
|
||||
hdlc_rec2_try_to_fix_later (rrbb, chan, subchan, alevel);
|
||||
rrbb_delete (rrbb);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This is called when we have a good frame.
|
||||
*/
|
||||
|
||||
void dlq_append (dlq_type_t type, int chan, int subchan, packet_t pp, alevel_t alevel, retry_t retries, char *spectrum)
|
||||
{
|
||||
|
||||
char stemp[500];
|
||||
unsigned char *pinfo;
|
||||
int info_len;
|
||||
int h;
|
||||
char heard[20];
|
||||
char alevel_text[32];
|
||||
|
||||
packets_decoded++;
|
||||
|
||||
|
||||
ax25_format_addrs (pp, stemp);
|
||||
|
||||
info_len = ax25_get_info (pp, &pinfo);
|
||||
|
||||
/* Print so we can see what is going on. */
|
||||
|
||||
//TODO: quiet option - suppress packet printing, only the count at the end.
|
||||
|
||||
#if 1
|
||||
/* Display audio input level. */
|
||||
/* Who are we hearing? Original station or digipeater? */
|
||||
|
||||
if (ax25_get_num_addr(pp) == 0) {
|
||||
/* Not AX.25. No station to display below. */
|
||||
h = -1;
|
||||
strcpy (heard, "");
|
||||
}
|
||||
else {
|
||||
h = ax25_get_heard(pp);
|
||||
ax25_get_addr_with_ssid(pp, h, heard);
|
||||
}
|
||||
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("\n");
|
||||
dw_printf("DECODED[%d] ", packets_decoded );
|
||||
if (h != AX25_SOURCE) {
|
||||
dw_printf ("Digipeater ");
|
||||
}
|
||||
ax25_alevel_to_text (alevel, alevel_text);
|
||||
|
||||
if (my_audio_config.achan[chan].fix_bits == RETRY_NONE && my_audio_config.achan[chan].passall == 0) {
|
||||
dw_printf ("%s audio level = %s %s\n", heard, alevel_text, spectrum);
|
||||
}
|
||||
else {
|
||||
dw_printf ("%s audio level = %s [%s] %s\n", heard, alevel_text, retry_text[(int)retries], spectrum);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(EXPERIMENT_G) || defined(EXPERIMENT_H)
|
||||
int j;
|
||||
|
||||
for (j=0; j<MAX_SUBCHANS; j++) {
|
||||
if (spectrum[j] == '|') {
|
||||
count[j]++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Display non-APRS packets in a different color.
|
||||
|
||||
// TODO: display subchannel if appropriate.
|
||||
|
||||
if (ax25_is_aprs(pp)) {
|
||||
text_color_set(DW_COLOR_REC);
|
||||
dw_printf ("[%d] ", chan);
|
||||
}
|
||||
else {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("[%d] ", chan);
|
||||
}
|
||||
|
||||
dw_printf ("%s", stemp); /* stations followed by : */
|
||||
ax25_safe_print ((char *)pinfo, info_len, 0);
|
||||
dw_printf ("\n");
|
||||
|
||||
ax25_delete (pp);
|
||||
|
||||
} /* end app_process_rec_packet */
|
||||
|
||||
|
||||
void ptt_set (int ot, int chan, int ptt_signal)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void usage (void) {
|
||||
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
|
||||
dw_printf ("\n");
|
||||
dw_printf ("atest is a test application which decodes AX.25 frames from an audio\n");
|
||||
dw_printf ("recording. This provides an easy way to test Dire Wolf decoding\n");
|
||||
dw_printf ("performance much quicker than normal real-time. \n");
|
||||
dw_printf ("\n");
|
||||
dw_printf ("usage:\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" atest [ options ] wav-file-in\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" -B n Bits/second for data. Proper modem automatically selected for speed.\n");
|
||||
dw_printf (" 300 baud uses 1600/1800 Hz AFSK.\n");
|
||||
dw_printf (" 1200 (default) baud uses 1200/2200 Hz AFSK.\n");
|
||||
dw_printf (" 9600 baud uses K9NG/G2RUH standard.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" -D n Divide audio sample rate by n.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" -F n Amount of effort to try fixing frames with an invalid CRC. \n");
|
||||
dw_printf (" 0 (default) = consider only correct frames. \n");
|
||||
dw_printf (" 1 = Try to fix only a single bit. \n");
|
||||
dw_printf (" more = Try modifying more bits to get a good CRC.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" -P m Select the demodulator type such as A, B, C, D (default for 300 baud),\n");
|
||||
dw_printf (" E (default for 1200 baud), F, A+, B+, C+, D+, E+, F+.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" wav-file-in is a WAV format audio file.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf ("Examples:\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" gen_packets -o test1.wav\n");
|
||||
dw_printf (" atest test1.wav\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" gen_packets -B 300 -o test3.wav\n");
|
||||
dw_printf (" atest -B 300 test3.wav\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" gen_packets -B 9600 -o test9.wav\n");
|
||||
dw_printf (" atest -B 9600 test9.wav\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" This generates and decodes 3 test files with 1200, 300, and 9600\n");
|
||||
dw_printf (" bits per second.\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" atest 02_Track_2.wav\n");
|
||||
dw_printf (" atest -P C+ 02_Track_2.wav\n");
|
||||
dw_printf (" atest -F 1 02_Track_2.wav\n");
|
||||
dw_printf (" atest -P C+ -F 1 02_Track_2.wav\n");
|
||||
dw_printf ("\n");
|
||||
dw_printf (" Try different combinations of options to find the best decoding\n");
|
||||
dw_printf (" performance.\n");
|
||||
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* end atest.c */
|
320
audio.h
320
audio.h
|
@ -1,320 +0,0 @@
|
|||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Module: audio.h
|
||||
*
|
||||
* Purpose: Interface to audio device commonly called a "sound card"
|
||||
* for historical reasons.
|
||||
*
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
|
||||
#ifndef AUDIO_H
|
||||
#define AUDIO_H 1
|
||||
|
||||
#include "direwolf.h" /* for MAX_CHANS used throughout the application. */
|
||||
#include "ax25_pad.h" /* for AX25_MAX_ADDR_LEN */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* PTT control.
|
||||
*/
|
||||
|
||||
enum ptt_method_e {
|
||||
PTT_METHOD_NONE, /* VOX or no transmit. */
|
||||
PTT_METHOD_SERIAL, /* Serial port RTS or DTR. */
|
||||
PTT_METHOD_GPIO, /* General purpose I/O, Linux only. */
|
||||
PTT_METHOD_LPT }; /* Parallel printer port, Linux only. */
|
||||
|
||||
typedef enum ptt_method_e ptt_method_t;
|
||||
|
||||
enum ptt_line_e { PTT_LINE_NONE = 0, PTT_LINE_RTS = 1, PTT_LINE_DTR = 2 }; // Important: 0 for neither.
|
||||
typedef enum ptt_line_e ptt_line_t;
|
||||
|
||||
enum audio_in_type_e {
|
||||
AUDIO_IN_TYPE_SOUNDCARD,
|
||||
AUDIO_IN_TYPE_SDR_UDP,
|
||||
AUDIO_IN_TYPE_STDIN };
|
||||
|
||||
/* For option to try fixing frames with bad CRC. */
|
||||
|
||||
typedef enum retry_e {
|
||||
RETRY_NONE=0,
|
||||
RETRY_SWAP_SINGLE=1,
|
||||
RETRY_SWAP_DOUBLE=2,
|
||||
RETRY_SWAP_TRIPLE=3,
|
||||
RETRY_REMOVE_SINGLE=4,
|
||||
RETRY_REMOVE_DOUBLE=5,
|
||||
RETRY_REMOVE_TRIPLE=6,
|
||||
RETRY_INSERT_SINGLE=7,
|
||||
RETRY_INSERT_DOUBLE=8,
|
||||
RETRY_SWAP_TWO_SEP=9,
|
||||
RETRY_SWAP_MANY=10,
|
||||
RETRY_REMOVE_MANY=11,
|
||||
RETRY_REMOVE_TWO_SEP=12,
|
||||
RETRY_MAX = 13} retry_t;
|
||||
|
||||
typedef enum sanity_e { SANITY_APRS, SANITY_AX25, SANITY_NONE } sanity_t;
|
||||
|
||||
|
||||
struct audio_s {
|
||||
|
||||
/* Previously we could handle only a single audio device. */
|
||||
/* In version 1.2, we generalize this to handle multiple devices. */
|
||||
/* This means we can now have more than 2 radio channels. */
|
||||
|
||||
struct adev_param_s {
|
||||
|
||||
/* Properites of the sound device. */
|
||||
|
||||
int defined; /* Was device defined? */
|
||||
/* First one defaults to yes. */
|
||||
|
||||
char adevice_in[80]; /* Name of the audio input device (or file?). */
|
||||
/* TODO: Can be "-" to read from stdin. */
|
||||
|
||||
char adevice_out[80]; /* Name of the audio output device (or file?). */
|
||||
|
||||
int num_channels; /* Should be 1 for mono or 2 for stereo. */
|
||||
int samples_per_sec; /* Audio sampling rate. Typically 11025, 22050, or 44100. */
|
||||
int bits_per_sample; /* 8 (unsigned char) or 16 (signed short). */
|
||||
|
||||
} adev[MAX_ADEVS];
|
||||
|
||||
|
||||
/* Common to all channels. */
|
||||
|
||||
char tts_script[80]; /* Script for text to speech. */
|
||||
|
||||
|
||||
/* Properties for each audio channel, common to receive and transmit. */
|
||||
/* Can be different for each radio channel. */
|
||||
|
||||
|
||||
struct achan_param_s {
|
||||
|
||||
int valid; /* Is this channel valid? */
|
||||
|
||||
char mycall[AX25_MAX_ADDR_LEN]; /* Call associated with this radio channel. */
|
||||
/* Could all be the same or different. */
|
||||
|
||||
|
||||
enum modem_t { MODEM_AFSK, MODEM_BASEBAND, MODEM_SCRAMBLE, MODEM_OFF } modem_type;
|
||||
|
||||
/* Usual AFSK. */
|
||||
/* Baseband signal. Not used yet. */
|
||||
/* Scrambled http://www.amsat.org/amsat/articles/g3ruh/109/fig03.gif */
|
||||
/* No modem. Might want this for DTMF only channel. */
|
||||
|
||||
|
||||
enum dtmf_decode_t { DTMF_DECODE_OFF, DTMF_DECODE_ON } dtmf_decode;
|
||||
|
||||
/* Originally the DTMF ("Touch Tone") decoder was always */
|
||||
/* enabled because it took a negligible amount of CPU. */
|
||||
/* There were complaints about the false positives when */
|
||||
/* hearing other modulation schemes on HF SSB so now it */
|
||||
/* is enabled only when needed. */
|
||||
|
||||
/* "On" will send special "t" packet to attached applications */
|
||||
/* and process as APRStt. Someday we might want to separate */
|
||||
/* these but for now, we have a single off/on. */
|
||||
|
||||
int decimate; /* Reduce AFSK sample rate by this factor to */
|
||||
/* decrease computational requirements. */
|
||||
|
||||
int mark_freq; /* Two tones for AFSK modulation, in Hz. */
|
||||
int space_freq; /* Standard tones are 1200 and 2200 for 1200 baud. */
|
||||
|
||||
int baud; /* Data bits (more accurately, symbols) per second. */
|
||||
/* Standard rates are 1200 for VHF and 300 for HF. */
|
||||
|
||||
/* Next 3 come from config file or command line. */
|
||||
|
||||
char profiles[16]; /* zero or more of ABC etc, optional + */
|
||||
|
||||
int num_freq; /* Number of different frequency pairs for decoders. */
|
||||
|
||||
int offset; /* Spacing between filter frequencies. */
|
||||
|
||||
/* Next two are derived from 3 above by demod_init. */
|
||||
|
||||
int num_demod; /* Number of different demodulators (filters). */
|
||||
/* Previously this was same as num_subchan but we add */
|
||||
/* a new variation in version 1.2 where a single modem */
|
||||
/* can feed multiple slicers and HDLC decoders. */
|
||||
|
||||
/* num_slicers could be added to be more general but */
|
||||
/* for the intial experiment, we can just examine profiles. */
|
||||
|
||||
int num_subchan; /* Total number of modems / hdlc decoders for each channel. */
|
||||
/* Potentially it could be product of strlen(profiles) * num_freq. */
|
||||
/* Currently can't use both at once. */
|
||||
|
||||
/* These are for dealing with imperfect frames. */
|
||||
|
||||
enum retry_e fix_bits; /* Level of effort to recover from */
|
||||
/* a bad FCS on the frame. */
|
||||
/* 0 = no effort */
|
||||
/* 1 = try fixing a single bit */
|
||||
/* 2... = more techniques... */
|
||||
|
||||
enum sanity_e sanity_test; /* Sanity test to apply when finding a good */
|
||||
/* CRC after making a change. */
|
||||
/* Must look like APRS, AX.25, or anything. */
|
||||
|
||||
int passall; /* Allow thru even with bad CRC. */
|
||||
|
||||
|
||||
/* Additional properties for transmit. */
|
||||
|
||||
/* Originally we had control outputs only for PTT. */
|
||||
/* In version 1.2, we generalize this to allow others such as DCD. */
|
||||
/* Index following structure by one of these: */
|
||||
|
||||
|
||||
#define OCTYPE_PTT 0
|
||||
#define OCTYPE_DCD 1
|
||||
#define OCTYPE_FUTURE 2
|
||||
|
||||
#define NUM_OCTYPES 3 /* number of values above */
|
||||
|
||||
struct {
|
||||
|
||||
ptt_method_t ptt_method; /* none, serial port, GPIO, LPT. */
|
||||
|
||||
char ptt_device[20]; /* Serial device name for PTT. e.g. COM1 or /dev/ttyS0 */
|
||||
|
||||
ptt_line_t ptt_line; /* Control line when using serial port. PTT_LINE_RTS, PTT_LINE_DTR. */
|
||||
ptt_line_t ptt_line2; /* Optional second one: PTT_LINE_NONE when not used. */
|
||||
|
||||
int ptt_gpio; /* GPIO number. */
|
||||
|
||||
int ptt_lpt_bit; /* Bit number for parallel printer port. */
|
||||
/* Bit 0 = pin 2, ..., bit 7 = pin 9. */
|
||||
|
||||
int ptt_invert; /* Invert the output. */
|
||||
int ptt_invert2; /* Invert the secondary output. */
|
||||
|
||||
} octrl[NUM_OCTYPES];
|
||||
|
||||
/* Transmit timing. */
|
||||
|
||||
int dwait; /* First wait extra time for receiver squelch. */
|
||||
/* Default 0 units of 10 mS each . */
|
||||
|
||||
int slottime; /* Slot time in 10 mS units for persistance algorithm. */
|
||||
/* Typical value is 10 meaning 100 milliseconds. */
|
||||
|
||||
int persist; /* Sets probability for transmitting after each */
|
||||
/* slot time delay. Transmit if a random number */
|
||||
/* in range of 0 - 255 <= persist value. */
|
||||
/* Otherwise wait another slot time and try again. */
|
||||
/* Default value is 63 for 25% probability. */
|
||||
|
||||
int txdelay; /* After turning on the transmitter, */
|
||||
/* send "flags" for txdelay * 10 mS. */
|
||||
/* Default value is 30 meaning 300 milliseconds. */
|
||||
|
||||
int txtail; /* Amount of time to keep transmitting after we */
|
||||
/* are done sending the data. This is to avoid */
|
||||
/* dropping PTT too soon and chopping off the end */
|
||||
/* of the frame. Again 10 mS units. */
|
||||
/* At this point, I'm thinking of 10 as the default. */
|
||||
|
||||
} achan[MAX_CHANS];
|
||||
|
||||
};
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
#define DEFAULT_ADEVICE "" /* Windows: Empty string = default audio device. */
|
||||
#else
|
||||
#if USE_ALSA
|
||||
#define DEFAULT_ADEVICE "default" /* Use default device for ALSA. */
|
||||
#else
|
||||
#define DEFAULT_ADEVICE "/dev/dsp" /* First audio device for OSS. */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* UDP audio receiving port. Couldn't find any standard or usage precedent.
|
||||
* Got the number from this example: http://gqrx.dk/doc/streaming-audio-over-udp
|
||||
* Any better suggestions?
|
||||
*/
|
||||
|
||||
#define DEFAULT_UDP_AUDIO_PORT 7355
|
||||
|
||||
|
||||
// Maximum size of the UDP buffer (for allowing IP routing, udp packets are often limited to 1472 bytes)
|
||||
|
||||
#define SDR_UDP_BUF_MAXLEN 2000
|
||||
|
||||
|
||||
|
||||
#define DEFAULT_NUM_CHANNELS 1
|
||||
#define DEFAULT_SAMPLES_PER_SEC 44100 /* Very early observations. Might no longer be valid. */
|
||||
/* 22050 works a lot better than 11025. */
|
||||
/* 44100 works a little better than 22050. */
|
||||
/* If you have a reasonable machine, use the highest rate. */
|
||||
#define MIN_SAMPLES_PER_SEC 8000
|
||||
#define MAX_SAMPLES_PER_SEC 48000 /* Formerly 44100. */
|
||||
/* Software defined radio often uses 48000. */
|
||||
|
||||
#define DEFAULT_BITS_PER_SAMPLE 16
|
||||
|
||||
#define DEFAULT_FIX_BITS RETRY_SWAP_SINGLE
|
||||
|
||||
/*
|
||||
* Standard for AFSK on VHF FM.
|
||||
* Reversing mark and space makes no difference because
|
||||
* NRZI encoding only cares about change or lack of change
|
||||
* between the two tones.
|
||||
*
|
||||
* HF SSB uses 300 baud and 200 Hz shift.
|
||||
* 1600 & 1800 Hz is a popular tone pair, sometimes
|
||||
* called the KAM tones.
|
||||
*/
|
||||
|
||||
#define DEFAULT_MARK_FREQ 1200
|
||||
#define DEFAULT_SPACE_FREQ 2200
|
||||
#define DEFAULT_BAUD 1200
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Typical transmit timings for VHF.
|
||||
*/
|
||||
|
||||
#define DEFAULT_DWAIT 0
|
||||
#define DEFAULT_SLOTTIME 10
|
||||
#define DEFAULT_PERSIST 63
|
||||
#define DEFAULT_TXDELAY 30
|
||||
#define DEFAULT_TXTAIL 10
|
||||
|
||||
|
||||
/*
|
||||
* Note that we have two versions of these in audio.c and audio_win.c.
|
||||
* Use one or the other depending on the platform.
|
||||
*/
|
||||
|
||||
|
||||
int audio_open (struct audio_s *pa);
|
||||
|
||||
int audio_get (int a); /* a = audio device, 0 for first */
|
||||
|
||||
int audio_put (int a, int c);
|
||||
|
||||
int audio_flush (int a);
|
||||
|
||||
void audio_wait (int a);
|
||||
|
||||
int audio_close (void);
|
||||
|
||||
|
||||
#endif /* ifdef AUDIO_H */
|
||||
|
||||
|
||||
/* end audio.h */
|
||||
|
803
beacon.c
803
beacon.c
|
@ -1,803 +0,0 @@
|
|||
//#define DEBUG 1
|
||||
//#define DEBUG_SIM 1
|
||||
|
||||
|
||||
//
|
||||
// This file is part of Dire Wolf, an amateur radio packet TNC.
|
||||
//
|
||||
// Copyright (C) 2011, 2013, 2014, 2015 John Langner, WB2OSZ
|
||||
//
|
||||
// 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
|
||||
// the Free Software Foundation, either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Module: beacon.c
|
||||
*
|
||||
* Purpose: Transmit messages on a fixed schedule.
|
||||
*
|
||||
* Description: Transmit periodic messages as specified in the config file.
|
||||
*
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <time.h>
|
||||
#if __WIN32__
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "direwolf.h"
|
||||
#include "ax25_pad.h"
|
||||
#include "textcolor.h"
|
||||
#include "audio.h"
|
||||
#include "tq.h"
|
||||
#include "xmit.h"
|
||||
#include "config.h"
|
||||
#include "digipeater.h"
|
||||
#include "version.h"
|
||||
#include "encode_aprs.h"
|
||||
#include "beacon.h"
|
||||
#include "latlong.h"
|
||||
#include "dwgps.h"
|
||||
#include "log.h"
|
||||
#include "dlq.h"
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Are we using GPS data?
|
||||
* Incremented if tracker beacons configured.
|
||||
* Cleared if dwgps_init fails.
|
||||
*/
|
||||
|
||||
static int g_using_gps = 0;
|
||||
|
||||
/*
|
||||
* Save pointers to configuration settings.
|
||||
*/
|
||||
|
||||
static struct audio_s *g_modem_config_p;
|
||||
static struct misc_config_s *g_misc_config_p;
|
||||
static struct digi_config_s *g_digi_config_p;
|
||||
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
static unsigned __stdcall beacon_thread (void *arg);
|
||||
#else
|
||||
static void * beacon_thread (void *arg);
|
||||
#endif
|
||||
|
||||
static int g_tracker_debug_level = 0; // 1 for data from gps.
|
||||
// 2 + Smart Beaconing logic.
|
||||
// 3 + Send transmissions to log file.
|
||||
|
||||
|
||||
void beacon_tracker_set_debug (int level)
|
||||
{
|
||||
g_tracker_debug_level = level;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: beacon_init
|
||||
*
|
||||
* Purpose: Initialize the beacon process.
|
||||
*
|
||||
* Inputs: pmodem - Aduio device and modem configuration.
|
||||
* Used only to find valide channels.
|
||||
* pconfig - misc. configuration from config file.
|
||||
* pdigi - digipeater configuration from config file.
|
||||
* TODO: Is this needed?
|
||||
*
|
||||
*
|
||||
* Outputs: Remember required information for future use.
|
||||
*
|
||||
* Description: Initialize the queue to be empty and set up other
|
||||
* mechanisms for sharing it between different threads.
|
||||
*
|
||||
* Start up xmit_thread to actually send the packets
|
||||
* at the appropriate time.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
void beacon_init (struct audio_s *pmodem, struct misc_config_s *pconfig, struct digi_config_s *pdigi)
|
||||
{
|
||||
time_t now;
|
||||
int j;
|
||||
int count;
|
||||
#if __WIN32__
|
||||
HANDLE beacon_th;
|
||||
#else
|
||||
pthread_t beacon_tid;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("beacon_init ( ... )\n");
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Save parameters for later use.
|
||||
*/
|
||||
g_modem_config_p = pmodem;
|
||||
g_misc_config_p = pconfig;
|
||||
g_digi_config_p = pdigi;
|
||||
|
||||
/*
|
||||
* Precompute the packet contents so any errors are
|
||||
* Reported once at start up time rather than for each transmission.
|
||||
* If a serious error is found, set type to BEACON_IGNORE and that
|
||||
* table entry should be ignored later on.
|
||||
*/
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
int chan = g_misc_config_p->beacon[j].sendto_chan;
|
||||
|
||||
if (chan < 0) chan = 0; /* For IGate, use channel 0 call. */
|
||||
|
||||
if (g_modem_config_p->achan[chan].valid) {
|
||||
|
||||
if (strlen(g_modem_config_p->achan[chan].mycall) > 0 && strcasecmp(g_modem_config_p->achan[chan].mycall, "NOCALL") != 0) {
|
||||
|
||||
switch (g_misc_config_p->beacon[j].btype) {
|
||||
|
||||
case BEACON_OBJECT:
|
||||
|
||||
/* Object name is required. */
|
||||
|
||||
if (strlen(g_misc_config_p->beacon[j].objname) == 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: OBJNAME is required for OBEACON.\n", g_misc_config_p->beacon[j].lineno);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
continue;
|
||||
}
|
||||
/* Fall thru. Ignore any warning about missing break. */
|
||||
|
||||
case BEACON_POSITION:
|
||||
|
||||
/* Location is required. */
|
||||
|
||||
if (g_misc_config_p->beacon[j].lat == G_UNKNOWN || g_misc_config_p->beacon[j].lon == G_UNKNOWN) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: Latitude and longitude are required.\n", g_misc_config_p->beacon[j].lineno);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case BEACON_TRACKER:
|
||||
|
||||
#if defined(ENABLE_GPS) || defined(DEBUG_SIM)
|
||||
g_using_gps++;
|
||||
#else
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: GPS tracker feature is not enabled.\n", g_misc_config_p->beacon[j].lineno);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
continue;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case BEACON_CUSTOM:
|
||||
|
||||
/* INFO is required. */
|
||||
|
||||
if (g_misc_config_p->beacon[j].custom_info == NULL) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: INFO is required for custom beacon.\n", g_misc_config_p->beacon[j].lineno);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case BEACON_IGNORE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: MYCALL must be set for beacon on channel %d. \n", g_misc_config_p->beacon[j].lineno, chan);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file, line %d: Invalid channel number %d for beacon. \n", g_misc_config_p->beacon[j].lineno, chan);
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate next time for each beacon.
|
||||
*/
|
||||
|
||||
now = time(NULL);
|
||||
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
#if DEBUG
|
||||
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("beacon[%d] chan=%d, delay=%d, every=%d\n",
|
||||
j,
|
||||
g_misc_config_p->beacon[j].sendto_chan,
|
||||
g_misc_config_p->beacon[j].delay,
|
||||
g_misc_config_p->beacon[j].every);
|
||||
#endif
|
||||
g_misc_config_p->beacon[j].next = now + g_misc_config_p->beacon[j].delay;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Connect to GPS receiver if any tracker beacons are configured.
|
||||
* If open fails, disable all tracker beacons.
|
||||
*/
|
||||
|
||||
#if DEBUG_SIM
|
||||
|
||||
g_using_gps = 1;
|
||||
|
||||
#elif ENABLE_GPS
|
||||
|
||||
if (g_using_gps > 0) {
|
||||
int err;
|
||||
|
||||
err = dwgps_init();
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("All tracker beacons disabled.\n");
|
||||
g_using_gps = 0;
|
||||
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
if (g_misc_config_p->beacon[j].btype == BEACON_TRACKER) {
|
||||
g_misc_config_p->beacon[j].btype = BEACON_IGNORE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Start up thread for processing only if at least one is valid.
|
||||
*/
|
||||
|
||||
count = 0;
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
if (g_misc_config_p->beacon[j].btype != BEACON_IGNORE) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count >= 1) {
|
||||
|
||||
#if __WIN32__
|
||||
beacon_th = (HANDLE)_beginthreadex (NULL, 0, &beacon_thread, NULL, 0, NULL);
|
||||
if (beacon_th == NULL) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Could not create beacon thread\n");
|
||||
return;
|
||||
}
|
||||
#else
|
||||
int e;
|
||||
|
||||
e = pthread_create (&beacon_tid, NULL, beacon_thread, (void *)0);
|
||||
if (e != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
perror("Could not create beacon thread");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
} /* end beacon_init */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: beacon_thread
|
||||
*
|
||||
* Purpose: Transmit beacons when it is time.
|
||||
*
|
||||
* Inputs: g_misc_config_p->beacon
|
||||
*
|
||||
* Outputs: g_misc_config_p->beacon[].next_time
|
||||
*
|
||||
* Description: Go to sleep until it is time for the next beacon.
|
||||
* Transmit any beacons scheduled for now.
|
||||
* Repeat.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
#define MIN(x,y) ((x) < (y) ? (x) : (y))
|
||||
|
||||
|
||||
/* Difference between two angles. */
|
||||
|
||||
static inline float heading_change (float a, float b)
|
||||
{
|
||||
float diff;
|
||||
|
||||
diff = fabs(a - b);
|
||||
if (diff <= 180.)
|
||||
return (diff);
|
||||
else
|
||||
return (360. - diff);
|
||||
}
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
static unsigned __stdcall beacon_thread (void *arg)
|
||||
#else
|
||||
static void * beacon_thread (void *arg)
|
||||
#endif
|
||||
{
|
||||
int j;
|
||||
time_t earliest;
|
||||
time_t now;
|
||||
|
||||
/*
|
||||
* Information from GPS.
|
||||
*/
|
||||
int fix = 0; /* 0 = none, 2 = 2D, 3 = 3D */
|
||||
double my_lat = 0; /* degrees */
|
||||
double my_lon = 0;
|
||||
float my_course = 0; /* degrees */
|
||||
float my_speed_knots = 0;
|
||||
float my_speed_mph = 0;
|
||||
float my_alt_m = G_UNKNOWN; /* meters */
|
||||
int my_alt_ft = G_UNKNOWN;
|
||||
|
||||
/*
|
||||
* SmartBeaconing state.
|
||||
*/
|
||||
time_t sb_prev_time = 0; /* Time of most recent transmission. */
|
||||
float sb_prev_course = 0; /* Most recent course reported. */
|
||||
//float sb_prev_speed_mph; /* Most recent speed reported. */
|
||||
int sb_every; /* Calculated time between transmissions. */
|
||||
|
||||
|
||||
#if DEBUG
|
||||
struct tm tm;
|
||||
char hms[20];
|
||||
|
||||
now = time(NULL);
|
||||
localtime_r (&now, &tm);
|
||||
strftime (hms, sizeof(hms), "%H:%M:%S", &tm);
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("beacon_thread: started %s\n", hms);
|
||||
#endif
|
||||
now = time(NULL);
|
||||
|
||||
while (1) {
|
||||
|
||||
assert (g_misc_config_p->num_beacons >= 1);
|
||||
|
||||
/*
|
||||
* Sleep until time for the earliest scheduled or
|
||||
* the soonest we could transmit due to corner pegging.
|
||||
*/
|
||||
|
||||
earliest = g_misc_config_p->beacon[0].next;
|
||||
for (j=1; j<g_misc_config_p->num_beacons; j++) {
|
||||
if (g_misc_config_p->beacon[j].btype == BEACON_IGNORE)
|
||||
continue;
|
||||
earliest = MIN(g_misc_config_p->beacon[j].next, earliest);
|
||||
}
|
||||
|
||||
if (g_misc_config_p->sb_configured && g_using_gps) {
|
||||
earliest = MIN(now + g_misc_config_p->sb_turn_time, earliest);
|
||||
earliest = MIN(now + g_misc_config_p->sb_fast_rate, earliest);
|
||||
}
|
||||
|
||||
if (earliest > now) {
|
||||
SLEEP_SEC (earliest - now);
|
||||
}
|
||||
|
||||
/*
|
||||
* Woke up. See what needs to be done.
|
||||
*/
|
||||
now = time(NULL);
|
||||
|
||||
#if DEBUG
|
||||
localtime_r (&now, &tm);
|
||||
strftime (hms, sizeof(hms), "%H:%M:%S", &tm);
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("beacon_thread: woke up %s\n", hms);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Get information from GPS if being used.
|
||||
* This needs to be done before the next scheduled tracker
|
||||
* beacon because corner pegging make it sooner.
|
||||
*/
|
||||
|
||||
#if DEBUG_SIM
|
||||
FILE *fp;
|
||||
char cs[40];
|
||||
|
||||
fp = fopen ("c:\\cygwin\\tmp\\cs", "r");
|
||||
if (fp != NULL) {
|
||||
fscanf (fp, "%f %f", &my_course, &my_speed_knots);
|
||||
fclose (fp);
|
||||
}
|
||||
else {
|
||||
fprintf (stderr, "Can't read /tmp/cs.\n");
|
||||
}
|
||||
fix = 3;
|
||||
my_speed_mph = DW_KNOTS_TO_MPH(my_speed_knots);
|
||||
my_lat = 42.99;
|
||||
my_lon = 71.99;
|
||||
my_alt_m = 100;
|
||||
#else
|
||||
if (g_using_gps) {
|
||||
|
||||
fix = dwgps_read (&my_lat, &my_lon, &my_speed_knots, &my_course, &my_alt_m);
|
||||
my_speed_mph = DW_KNOTS_TO_MPH(my_speed_knots);
|
||||
|
||||
if (g_tracker_debug_level >= 1) {
|
||||
struct tm tm;
|
||||
char hms[20];
|
||||
|
||||
localtime_r (&now, &tm);
|
||||
strftime (hms, sizeof(hms), "%H:%M:%S", &tm);
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
if (fix == 3) {
|
||||
dw_printf ("%s 3D, %.6f, %.6f, %.1f mph, %.0f\xc2\xb0, %.1f m\n", hms, my_lat, my_lon, my_speed_mph, my_course, my_alt_m);
|
||||
}
|
||||
else if (fix == 2) {
|
||||
dw_printf ("%s 2D, %.6f, %.6f, %.1f mph, %.0f\xc2\xb0\n", hms, my_lat, my_lon, my_speed_mph, my_course);
|
||||
}
|
||||
else {
|
||||
dw_printf ("%s No GPS fix\n", hms);
|
||||
}
|
||||
}
|
||||
|
||||
/* Transmit altitude only if 3D fix and user asked for it. */
|
||||
|
||||
my_alt_ft = G_UNKNOWN;
|
||||
if (fix >= 3 && my_alt_m != G_UNKNOWN && g_misc_config_p->beacon[j].alt_m != G_UNKNOWN) {
|
||||
my_alt_ft = DW_METERS_TO_FEET(my_alt_m);
|
||||
}
|
||||
|
||||
/* Don't complain here for no fix. */
|
||||
/* Possibly at the point where about to transmit. */
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Run SmartBeaconing calculation if configured and GPS data available.
|
||||
*/
|
||||
if (g_misc_config_p->sb_configured && g_using_gps && fix >= 2) {
|
||||
|
||||
if (my_speed_mph > g_misc_config_p->sb_fast_speed) {
|
||||
sb_every = g_misc_config_p->sb_fast_rate;
|
||||
if (g_tracker_debug_level >= 2) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("my speed %.1f > fast %d mph, interval = %d sec\n", my_speed_mph, g_misc_config_p->sb_fast_speed, sb_every);
|
||||
}
|
||||
}
|
||||
else if (my_speed_mph < g_misc_config_p->sb_slow_speed) {
|
||||
sb_every = g_misc_config_p->sb_slow_rate;
|
||||
if (g_tracker_debug_level >= 2) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("my speed %.1f < slow %d mph, interval = %d sec\n", my_speed_mph, g_misc_config_p->sb_slow_speed, sb_every);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Can't divide by 0 assuming sb_slow_speed > 0. */
|
||||
sb_every = ( g_misc_config_p->sb_fast_rate * g_misc_config_p->sb_fast_speed ) / my_speed_mph;
|
||||
if (g_tracker_debug_level >= 2) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("my speed %.1f mph, interval = %d sec\n", my_speed_mph, sb_every);
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG_SIM
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("SB: fast %d %d slow %d %d speed=%.1f every=%d\n",
|
||||
g_misc_config_p->sb_fast_speed, g_misc_config_p->sb_fast_rate,
|
||||
g_misc_config_p->sb_slow_speed, g_misc_config_p->sb_slow_rate,
|
||||
my_speed_mph, sb_every);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Test for "Corner Pegging" if moving.
|
||||
*/
|
||||
if (my_speed_mph >= 1.0) {
|
||||
int turn_threshold = g_misc_config_p->sb_turn_angle +
|
||||
g_misc_config_p->sb_turn_slope / my_speed_mph;
|
||||
|
||||
#if DEBUG_SIM
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("SB-moving: course %.0f prev %.0f thresh %d\n",
|
||||
my_course, sb_prev_course, turn_threshold);
|
||||
#endif
|
||||
if (heading_change(my_course, sb_prev_course) > turn_threshold &&
|
||||
now >= sb_prev_time + g_misc_config_p->sb_turn_time) {
|
||||
|
||||
if (g_tracker_debug_level >= 2) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("heading change (%.0f, %.0f) > threshold %d and %d since last >= turn time %d\n",
|
||||
my_course, sb_prev_course, turn_threshold,
|
||||
(int)(now - sb_prev_time), g_misc_config_p->sb_turn_time);
|
||||
}
|
||||
|
||||
/* Send it now. */
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
if (g_misc_config_p->beacon[j].btype == BEACON_TRACKER) {
|
||||
g_misc_config_p->beacon[j].next = now;
|
||||
}
|
||||
}
|
||||
} /* significant change in direction */
|
||||
} /* is moving */
|
||||
} /* apply SmartBeaconing */
|
||||
|
||||
|
||||
for (j=0; j<g_misc_config_p->num_beacons; j++) {
|
||||
|
||||
if (g_misc_config_p->beacon[j].btype == BEACON_IGNORE)
|
||||
continue;
|
||||
|
||||
if (g_misc_config_p->beacon[j].next <= now) {
|
||||
|
||||
int strict = 1; /* Strict packet checking because they will go over air. */
|
||||
char stemp[20];
|
||||
char info[AX25_MAX_INFO_LEN];
|
||||
char beacon_text[AX25_MAX_PACKET_LEN];
|
||||
packet_t pp = NULL;
|
||||
char mycall[AX25_MAX_ADDR_LEN];
|
||||
int alt_ft;
|
||||
|
||||
/*
|
||||
* Obtain source call for the beacon.
|
||||
* This could potentially be different on different channels.
|
||||
* When sending to IGate server, use call from first radio channel.
|
||||
*
|
||||
* Check added in version 1.0a. Previously used index of -1.
|
||||
*
|
||||
* Version 1.1 - channel should now be 0 for IGate.
|
||||
* Type of destination is encoded separately.
|
||||
*/
|
||||
strcpy (mycall, "NOCALL");
|
||||
|
||||
assert (g_misc_config_p->beacon[j].sendto_chan >= 0);
|
||||
|
||||
strcpy (mycall, g_modem_config_p->achan[g_misc_config_p->beacon[j].sendto_chan].mycall);
|
||||
|
||||
if (strlen(mycall) == 0 || strcmp(mycall, "NOCALL") == 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("MYCALL not set for beacon in config file line %d.\n", g_misc_config_p->beacon[j].lineno);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare the monitor format header.
|
||||
*
|
||||
* src > dest [ , via ]
|
||||
*/
|
||||
|
||||
strcpy (beacon_text, mycall);
|
||||
strcat (beacon_text, ">");
|
||||
|
||||
if (g_misc_config_p->beacon[j].dest != NULL) {
|
||||
strcat (beacon_text, g_misc_config_p->beacon[j].dest);
|
||||
}
|
||||
else {
|
||||
sprintf (stemp, "%s%1d%1d", APP_TOCALL, MAJOR_VERSION, MINOR_VERSION);
|
||||
strcat (beacon_text, stemp);
|
||||
}
|
||||
|
||||
if (g_misc_config_p->beacon[j].via != NULL) {
|
||||
strcat (beacon_text, ",");
|
||||
strcat (beacon_text, g_misc_config_p->beacon[j].via);
|
||||
}
|
||||
strcat (beacon_text, ":");
|
||||
|
||||
/*
|
||||
* Add the info part depending on beacon type.
|
||||
*/
|
||||
switch (g_misc_config_p->beacon[j].btype) {
|
||||
|
||||
case BEACON_POSITION:
|
||||
|
||||
alt_ft = DW_METERS_TO_FEET(g_misc_config_p->beacon[j].alt_m);
|
||||
|
||||
encode_position (g_misc_config_p->beacon[j].messaging,
|
||||
g_misc_config_p->beacon[j].compress, g_misc_config_p->beacon[j].lat, g_misc_config_p->beacon[j].lon, alt_ft,
|
||||
g_misc_config_p->beacon[j].symtab, g_misc_config_p->beacon[j].symbol,
|
||||
g_misc_config_p->beacon[j].power, g_misc_config_p->beacon[j].height, g_misc_config_p->beacon[j].gain, g_misc_config_p->beacon[j].dir,
|
||||
0, 0, /* course, speed */
|
||||
g_misc_config_p->beacon[j].freq, g_misc_config_p->beacon[j].tone, g_misc_config_p->beacon[j].offset,
|
||||
g_misc_config_p->beacon[j].comment,
|
||||
info);
|
||||
strcat (beacon_text, info);
|
||||
g_misc_config_p->beacon[j].next = now + g_misc_config_p->beacon[j].every;
|
||||
break;
|
||||
|
||||
case BEACON_OBJECT:
|
||||
|
||||
encode_object (g_misc_config_p->beacon[j].objname, g_misc_config_p->beacon[j].compress, 0, g_misc_config_p->beacon[j].lat, g_misc_config_p->beacon[j].lon,
|
||||
g_misc_config_p->beacon[j].symtab, g_misc_config_p->beacon[j].symbol,
|
||||
g_misc_config_p->beacon[j].power, g_misc_config_p->beacon[j].height, g_misc_config_p->beacon[j].gain, g_misc_config_p->beacon[j].dir,
|
||||
0, 0, /* course, speed */
|
||||
g_misc_config_p->beacon[j].freq, g_misc_config_p->beacon[j].tone, g_misc_config_p->beacon[j].offset, g_misc_config_p->beacon[j].comment,
|
||||
info);
|
||||
strcat (beacon_text, info);
|
||||
g_misc_config_p->beacon[j].next = now + g_misc_config_p->beacon[j].every;
|
||||
break;
|
||||
|
||||
case BEACON_TRACKER:
|
||||
|
||||
if (fix >= 2) {
|
||||
int coarse; /* APRS encoder wants 1 - 360. */
|
||||
/* 0 means none or unknown. */
|
||||
|
||||
coarse = (int)roundf(my_course);
|
||||
if (coarse == 0) {
|
||||
coarse = 360;
|
||||
}
|
||||
encode_position (g_misc_config_p->beacon[j].messaging,
|
||||
g_misc_config_p->beacon[j].compress,
|
||||
my_lat, my_lon, my_alt_ft,
|
||||
g_misc_config_p->beacon[j].symtab, g_misc_config_p->beacon[j].symbol,
|
||||
g_misc_config_p->beacon[j].power, g_misc_config_p->beacon[j].height, g_misc_config_p->beacon[j].gain, g_misc_config_p->beacon[j].dir,
|
||||
coarse, (int)roundf(my_speed_knots),
|
||||
g_misc_config_p->beacon[j].freq, g_misc_config_p->beacon[j].tone, g_misc_config_p->beacon[j].offset,
|
||||
g_misc_config_p->beacon[j].comment,
|
||||
info);
|
||||
strcat (beacon_text, info);
|
||||
|
||||
/* Remember most recent tracker beacon. */
|
||||
|
||||
sb_prev_time = now;
|
||||
sb_prev_course = my_course;
|
||||
//sb_prev_speed_mph = my_speed_mph;
|
||||
|
||||
/* Calculate time for next transmission. */
|
||||
if (g_misc_config_p->sb_configured) {
|
||||
g_misc_config_p->beacon[j].next = now + sb_every;
|
||||
}
|
||||
else {
|
||||
g_misc_config_p->beacon[j].next = now + g_misc_config_p->beacon[j].every;
|
||||
}
|
||||
|
||||
/* Write to log file for testing. */
|
||||
/* The idea is to run log2gpx and map the result rather than */
|
||||
/* actually transmitting and relying on someone else to receive */
|
||||
/* the signals. */
|
||||
|
||||
if (g_tracker_debug_level >= 3) {
|
||||
|
||||
decode_aprs_t A;
|
||||
alevel_t alevel;
|
||||
|
||||
memset (&A, 0, sizeof(A));
|
||||
A.g_freq = G_UNKNOWN;
|
||||
A.g_offset = G_UNKNOWN;
|
||||
A.g_tone = G_UNKNOWN;
|
||||
A.g_dcs = G_UNKNOWN;
|
||||
|
||||
strcpy (A.g_src, mycall);
|
||||
A.g_symbol_table = g_misc_config_p->beacon[j].symtab;
|
||||
A.g_symbol_code = g_misc_config_p->beacon[j].symbol;
|
||||
A.g_lat = my_lat;
|
||||
A.g_lon = my_lon;
|
||||
A.g_speed = DW_KNOTS_TO_MPH(my_speed_knots);
|
||||
A.g_course = coarse;
|
||||
A.g_altitude = my_alt_ft;
|
||||
|
||||
/* Fake channel of 999 to distinguish from real data. */
|
||||
memset (&alevel, 0, sizeof(alevel));
|
||||
log_write (999, &A, NULL, alevel, 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g_misc_config_p->beacon[j].next = now + 2;
|
||||
continue; /* No fix. Try again in a couple seconds. */
|
||||
}
|
||||
break;
|
||||
|
||||
case BEACON_CUSTOM:
|
||||
|
||||
if (g_misc_config_p->beacon[j].custom_info != NULL) {
|
||||
strcat (beacon_text, g_misc_config_p->beacon[j].custom_info);
|
||||
}
|
||||
else {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Internal error. custom_info is null. %s %d\n", __FILE__, __LINE__);
|
||||
continue;
|
||||
}
|
||||
g_misc_config_p->beacon[j].next = now + g_misc_config_p->beacon[j].every;
|
||||
break;
|
||||
|
||||
case BEACON_IGNORE:
|
||||
default:
|
||||
break;
|
||||
|
||||
} /* switch beacon type. */
|
||||
|
||||
/*
|
||||
* Parse monitor format into form for transmission.
|
||||
*/
|
||||
pp = ax25_from_text (beacon_text, strict);
|
||||
|
||||
if (pp != NULL) {
|
||||
|
||||
/* Send to desired destination. */
|
||||
|
||||
alevel_t alevel;
|
||||
|
||||
|
||||
switch (g_misc_config_p->beacon[j].sendto_type) {
|
||||
|
||||
case SENDTO_IGATE:
|
||||
|
||||
|
||||
#if 1
|
||||
text_color_set(DW_COLOR_XMIT);
|
||||
dw_printf ("[ig] %s\n", beacon_text);
|
||||
#endif
|
||||
igate_send_rec_packet (0, pp);
|
||||
ax25_delete (pp);
|
||||
break;
|
||||
|
||||
case SENDTO_XMIT:
|
||||
default:
|
||||
|
||||
tq_append (g_misc_config_p->beacon[j].sendto_chan, TQ_PRIO_1_LO, pp);
|
||||
break;
|
||||
|
||||
case SENDTO_RECV:
|
||||
|
||||
/* Simulated reception. */
|
||||
|
||||
memset (&alevel, 0xff, sizeof(alevel));
|
||||
dlq_append (DLQ_REC_FRAME, g_misc_config_p->beacon[j].sendto_chan, 0, pp, alevel, 0, "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Config file: Failed to parse packet constructed from line %d.\n", g_misc_config_p->beacon[j].lineno);
|
||||
dw_printf ("%s\n", beacon_text);
|
||||
}
|
||||
|
||||
} /* if time to send it */
|
||||
|
||||
} /* for each configured beacon */
|
||||
|
||||
} /* do forever */
|
||||
|
||||
} /* end beacon_thread */
|
||||
|
||||
/* end beacon.c */
|
|
@ -0,0 +1 @@
|
|||
include(CPack)
|
|
@ -0,0 +1,10 @@
|
|||
[Desktop Entry]
|
||||
Name=@APPLICATION_NAME@
|
||||
Comment=APRS Soundcard TNC
|
||||
Exec=@APPLICATION_DESKTOP_EXEC@
|
||||
Icon=@CMAKE_PROJECT_NAME@_icon.png
|
||||
StartupNotify=true
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=HamRadio
|
||||
Keywords=Ham Radio;APRS;Soundcard TNC;KISS;AGWPE;AX.25
|
|
@ -0,0 +1 @@
|
|||
MAINICON ICON "direwolf_icon.ico"
|
Before Width: | Height: | Size: 361 KiB After Width: | Height: | Size: 361 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
@ -0,0 +1,16 @@
|
|||
#include <stdint.h>
|
||||
#include <arm_neon.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
uint32x4_t x={0};
|
||||
x=veorq_u32(x,x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <immintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m256d x = _mm256_setzero_pd();
|
||||
x=_mm256_addsub_pd(x,x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <immintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m256i x = _mm256_setzero_si256();
|
||||
x=_mm256_add_epi64 (x,x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <immintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
uint64_t x[8] = {0};
|
||||
__m512i y = _mm512_loadu_si512((__m512i*)x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <emmintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m128i x = _mm_setzero_si128();
|
||||
x=_mm_add_epi64(x,x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <emmintrin.h>
|
||||
#include <pmmintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m128d x = _mm_setzero_pd();
|
||||
x=_mm_addsub_pd(x,x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <emmintrin.h>
|
||||
#include <smmintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m128i x = _mm_setzero_si128();
|
||||
__m128i a = _mm_setzero_si128();
|
||||
__m128i b = _mm_setzero_si128();
|
||||
x=_mm_blend_epi16(a,b,4);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <nmmintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
unsigned int x=32;
|
||||
x=_mm_crc32_u8(x,4);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <emmintrin.h>
|
||||
#include <tmmintrin.h>
|
||||
|
||||
void signalHandler(int signum) {
|
||||
exit(signum); // SIGILL = 4
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
signal(SIGILL, signalHandler);
|
||||
__m128i x = _mm_setzero_si128();
|
||||
x=_mm_alignr_epi8(x,x,2);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
|
||||
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
||||
foreach(file ${files})
|
||||
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
|
||||
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
exec_program(
|
||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||
OUTPUT_VARIABLE rm_out
|
||||
RETURN_VALUE rm_retval
|
||||
)
|
||||
if(NOT "${rm_retval}" STREQUAL 0)
|
||||
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
|
||||
endif(NOT "${rm_retval}" STREQUAL 0)
|
||||
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
|
||||
endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
endforeach(file)
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
find_library(AVAHI_COMMON_LIBRARY NAMES avahi-common PATHS ${PC_AVAHI_CLIENT_LIBRARY_DIRS})
|
||||
if(AVAHI_COMMON_LIBRARY)
|
||||
set(AVAHI_COMMON_FOUND TRUE)
|
||||
endif()
|
||||
|
||||
find_library(AVAHI_CLIENT_LIBRARY NAMES avahi-client PATHS ${PC_AVAHI_CLIENT_LIBRARY_DIRS})
|
||||
if(AVAHI_CLIENT_LIBRARY)
|
||||
set(AVAHI_CLIENT_FOUND TRUE)
|
||||
endif()
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Avahi DEFAULT_MSG AVAHI_COMMON_FOUND AVAHI_CLIENT_FOUND)
|
||||
|
||||
if (AVAHI_FOUND)
|
||||
set(AVAHI_INCLUDE_DIRS ${AVAHI_UI_INCLUDE_DIR})
|
||||
set(AVAHI_LIBRARIES ${AVAHI_COMMON_LIBRARY} ${AVAHI_CLIENT_LIBRARY})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(AVAHI_INCLUDE_DIRS AVAHI_LIBRARIES)
|
|
@ -0,0 +1,383 @@
|
|||
# Clang or AppleClang (see CMP0025)
|
||||
if(NOT DEFINED C_CLANG AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(C_CLANG 1)
|
||||
elseif(NOT DEFINED C_GCC AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
set(C_GCC 1)
|
||||
elseif(NOT DEFINED C_MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
set(C_MSVC 1)
|
||||
endif()
|
||||
|
||||
# Detect current compilation architecture and create standard definitions
|
||||
include(CheckSymbolExists)
|
||||
function(detect_architecture symbol arch)
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(CMAKE_REQUIRED_QUIET 1)
|
||||
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
||||
unset(CMAKE_REQUIRED_QUIET)
|
||||
|
||||
# The output variable needs to be unique across invocations otherwise
|
||||
# CMake's crazy scope rules will keep it defined
|
||||
if (ARCHITECTURE_${arch})
|
||||
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
||||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
||||
add_definitions(-DARCHITECTURE_${arch}=1)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# direwolf versions thru 1.5 were available pre-built for 32 bit Windows targets.
|
||||
# Research and experimentation revealed that the SSE instructions made a big
|
||||
# difference in runtime speed but SSE2 and later were not significantly better
|
||||
# for this application. I decided to build with only the SSE instructions making
|
||||
# the Pentium 3 the minimum requirement. SSE2 would require at least a Pentium 4
|
||||
# and offered no significant performance advantage.
|
||||
# These are ancient history - from the previous Century - but old computers, generally
|
||||
# considered useless for anything else, often end up in the ham shack.
|
||||
#
|
||||
# When cmake was first used for direwolf, the default target became 64 bit and the
|
||||
# SSE2, SSE3, SSE4.1, and SSE4.2 instructions were automatically enabled based on the
|
||||
# build machine capabilities. This was fine until I tried running the application
|
||||
# on a computer much older than where it was built. It did not have the SSE4 instructions
|
||||
# and the application died without a clue for the reason.
|
||||
# Just how much benefit do these new instructions provide for this application?
|
||||
#
|
||||
# These were all run on the same computer, but compiled in different ways.
|
||||
# Times to run atest with Track 1 of the TNC test CD:
|
||||
#
|
||||
# direwolf 1.5 - 32 bit target - gcc 6.3.0
|
||||
#
|
||||
# 60.4 sec. Pentium 3 with SSE
|
||||
#
|
||||
# direwolf 1.6 - 32 bit target - gcc 7.4.0
|
||||
#
|
||||
# 81.0 sec. with no SIMD instructions enabled.
|
||||
# 54.4 sec. with SSE
|
||||
# 52.0 sec. with SSE2
|
||||
# 52.4 sec. with SSE2, SSE3
|
||||
# 52.3 sec. with SSE2, SSE3, SSE4.1, SSE4.2
|
||||
# 49.9 sec. Fedora standard: -m32 -march=i686 -mtune=generic -msse2 -mfpmath=sse
|
||||
# 50.4 sec. sse not sse2: -m32 -march=i686 -mtune=generic -msse -mfpmath=sse
|
||||
#
|
||||
# That's what I found several years ago with a much older compiler.
|
||||
# The original SSE helped a lot but SSE2 and later made little difference.
|
||||
#
|
||||
# direwolf 1.6 - 64 bit target - gcc 7.4.0
|
||||
#
|
||||
# 34.8 sec. with no SIMD instructions enabled.
|
||||
# 34.8 sec. with SSE
|
||||
# 34.8 sec. with SSE2
|
||||
# 34.2 sec. with SSE2, SSE3
|
||||
# 33.5 sec. with SSE2, SSE3, SSE4.1, SSE4.2
|
||||
# 33.4 Fedora standard: -mtune=generic
|
||||
#
|
||||
# Why do we see such little variation? 64-bit target implies
|
||||
# SSE, SSE2, SSE3 instructions are available.
|
||||
#
|
||||
# Building for a 64 bit target makes it run about 1.5x faster on the same hardware.
|
||||
#
|
||||
# The default will be set for maximum portability so packagers won't need to
|
||||
# to anything special.
|
||||
#
|
||||
#
|
||||
# While ENABLE_GENERIC also had the desired result (for x86_64), I don't think
|
||||
# it is the right approach. It prevents the detection of the architecture,
|
||||
# i.e. x86, x86_64, ARM, ARM64. That's why it did not go looking for the various
|
||||
# SSE instructions. For x86, we would miss out on using SSE.
|
||||
|
||||
if (NOT ENABLE_GENERIC)
|
||||
if (C_MSVC)
|
||||
detect_architecture("_M_AMD64" x86_64)
|
||||
detect_architecture("_M_IX86" x86)
|
||||
detect_architecture("_M_ARM" ARM)
|
||||
detect_architecture("_M_ARM64" ARM64)
|
||||
else()
|
||||
detect_architecture("__x86_64__" x86_64)
|
||||
detect_architecture("__i386__" x86)
|
||||
detect_architecture("__arm__" ARM)
|
||||
detect_architecture("__aarch64__" ARM64)
|
||||
endif()
|
||||
endif()
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(ARCHITECTURE "GENERIC")
|
||||
set(ARCHITECTURE_GENERIC 1)
|
||||
add_definitions(-DARCHITECTURE_GENERIC=1)
|
||||
endif()
|
||||
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
||||
|
||||
set(TEST_DIR ${PROJECT_SOURCE_DIR}/cmake/cpu_tests)
|
||||
|
||||
# flag that set the minimum cpu flag requirements
|
||||
# used to create re-distribuitable binary
|
||||
|
||||
if (${ARCHITECTURE} MATCHES "x86_64|x86" AND (FORCE_SSE OR FORCE_SSSE3 OR FORCE_SSE41))
|
||||
if (FORCE_SSE)
|
||||
set(HAS_SSE ON CACHE BOOL "SSE SIMD enabled")
|
||||
if(C_GCC OR C_CLANG)
|
||||
if (${ARCHITECTURE} MATCHES "x86_64")
|
||||
# All 64-bit capable chips support MMX, SSE, SSE2, and SSE3
|
||||
# so they are all enabled automatically. We don't want to use
|
||||
# SSE4, based on build machine capabilites, because the application
|
||||
# would not run properly on an older CPU.
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mtune=generic" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=generic" )
|
||||
else()
|
||||
# Fedora standard uses -msse2 here.
|
||||
# I dropped it down to -msse for greater compatibility and little penalty.
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686 -mtune=generic -msse -mfpmath=sse" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -march=i686 -mtune=generic -msse -mfpmath=sse" )
|
||||
endif()
|
||||
message(STATUS "Use SSE SIMD instructions")
|
||||
add_definitions(-DUSE_SSE)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:SSE" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSE" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
message(STATUS "Use MSVC SSSE3 SIMD instructions")
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
endif()
|
||||
elseif (FORCE_SSSE3)
|
||||
set(HAS_SSSE3 ON CACHE BOOL "SSSE3 SIMD enabled")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mssse3" )
|
||||
message(STATUS "Use SSSE3 SIMD instructions")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:SSSE3" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSSE3" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
message(STATUS "Use MSVC SSSE3 SIMD instructions")
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
endif()
|
||||
elseif (FORCE_SSE41)
|
||||
set(HAS_SSSE3 ON CACHE BOOL "SSSE3 SIMD enabled")
|
||||
set(HAS_SSE4_1 ON CACHE BOOL "Architecture has SSE 4.1 SIMD enabled")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1" )
|
||||
message(STATUS "Use SSE 4.1 SIMD instructions")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
add_definitions(-DUSE_SSE4_1)
|
||||
elseif(C_MSVC)
|
||||
# seems that from MSVC 2015 comiler doesn't support those flags
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:SSE4_1" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSE4_1" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
message(STATUS "Use SSE 4.1 SIMD instructions")
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
add_definitions(-DUSE_SSE4_1)
|
||||
endif()
|
||||
endif()
|
||||
else ()
|
||||
if (${ARCHITECTURE} MATCHES "x86_64|x86")
|
||||
if(C_MSVC)
|
||||
try_run(RUN_SSE2 COMPILE_SSE2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse2.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_SSE2 COMPILE_SSE2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse2.cxx" COMPILE_DEFINITIONS -msse2 -O0)
|
||||
endif()
|
||||
if(COMPILE_SSE2 AND RUN_SSE2 EQUAL 0)
|
||||
set(HAS_SSE2 ON CACHE BOOL "Architecture has SSSE2 SIMD enabled")
|
||||
message(STATUS "Use SSE2 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2" )
|
||||
add_definitions(-DUSE_SSE2)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:SSE2" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSE2" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:SSE2" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:SSE2" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSE2)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_SSE2 OFF CACHE BOOL "Architecture does not have SSSE2 SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_SSSE3 COMPILE_SSSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_ssse3.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_SSSE3 COMPILE_SSSE3 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_ssse3.cxx" COMPILE_DEFINITIONS -mssse3 -O0)
|
||||
endif()
|
||||
if(COMPILE_SSSE3 AND RUN_SSSE3 EQUAL 0)
|
||||
set(HAS_SSSE3 ON CACHE BOOL "Architecture has SSSE3 SIMD enabled")
|
||||
message(STATUS "Use SSSE3 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mssse3" )
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
elseif(C_MSVC)
|
||||
# seems not present on MSVC 2017
|
||||
#set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:SSSE3" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSSE3)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_SSSE3 OFF CACHE BOOL "Architecture does not have SSSE3 SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_SSE4_1 COMPILE_SSE4_1 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse41.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_SSE4_1 COMPILE_SSE4_1 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse41.cxx" COMPILE_DEFINITIONS -msse4.1 -O0)
|
||||
endif()
|
||||
if(COMPILE_SSE4_1 AND RUN_SSE4_1 EQUAL 0)
|
||||
set(HAS_SSE4_1 ON CACHE BOOL "Architecture has SSE 4.1 SIMD enabled")
|
||||
message(STATUS "Use SSE 4.1 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.1" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1" )
|
||||
add_definitions(-DUSE_SSE4_1)
|
||||
elseif(C_MSVC)
|
||||
# seems not present on MSVC 2017
|
||||
#set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSE4_1" )
|
||||
#set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:SSE4_1" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSE4_1)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_SSE4_1 OFF CACHE BOOL "Architecture does not have SSE 4.1 SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_SSE4_2 COMPILE_SSE4_2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse42.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_SSE4_2 COMPILE_SSE4_2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_sse42.cxx" COMPILE_DEFINITIONS -msse4.2 -O0)
|
||||
endif()
|
||||
if(COMPILE_SSE4_2 AND RUN_SSE4_2 EQUAL 0)
|
||||
set(HAS_SSE4_2 ON CACHE BOOL "Architecture has SSE 4.2 SIMD enabled")
|
||||
message(STATUS "Use SSE 4.2 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2" )
|
||||
add_definitions(-DUSE_SSE4_2)
|
||||
elseif(C_MSVC)
|
||||
# seems not present on MSVC 2017
|
||||
#set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:SSE4_2" )
|
||||
#set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:SSE4_2" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_SSE4_2)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_SSE4_2 OFF CACHE BOOL "Architecture does not have SSE 4.2 SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_AVX COMPILE_AVX "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_AVX COMPILE_AVX "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx.cxx" COMPILE_DEFINITIONS -mavx -O0)
|
||||
endif()
|
||||
if(COMPILE_AVX AND RUN_AVX EQUAL 0)
|
||||
set(HAS_AVX ON CACHE BOOL "Architecture has AVX SIMD enabled")
|
||||
message(STATUS "Use AVX SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx" )
|
||||
add_definitions(-DUSE_AVX)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:AVX" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:AVX" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_AVX)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_AVX OFF CACHE BOOL "Architecture does not have AVX SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_AVX2 COMPILE_AVX2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx2.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_AVX2 COMPILE_AVX2 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx2.cxx" COMPILE_DEFINITIONS -mavx2 -O0)
|
||||
endif()
|
||||
if(COMPILE_AVX2 AND RUN_AVX2 EQUAL 0)
|
||||
set(HAS_AVX2 ON CACHE BOOL "Architecture has AVX2 SIMD enabled")
|
||||
message(STATUS "Use AVX2 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2" )
|
||||
add_definitions(-DUSE_AVX2)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:AVX2" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:AVX2" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX2" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX2" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_AVX2)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_AVX2 OFF CACHE BOOL "Architecture does not have AVX2 SIMD enabled")
|
||||
endif()
|
||||
if(C_MSVC)
|
||||
try_run(RUN_AVX512 COMPILE_AVX512 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx512.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
try_run(RUN_AVX512 COMPILE_AVX512 "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_x86_avx512.cxx" COMPILE_DEFINITIONS -mavx512f -O0)
|
||||
endif()
|
||||
if(COMPILE_AVX512 AND RUN_AVX512 EQUAL 0)
|
||||
set(HAS_AVX512 ON CACHE BOOL "Architecture has AVX512 SIMD enabled")
|
||||
message(STATUS "Use AVX512 SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx512f" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512f" )
|
||||
add_definitions(-DUSE_AVX512)
|
||||
elseif(C_MSVC)
|
||||
set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /arch:AVX512" )
|
||||
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /arch:AVX512" )
|
||||
set( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX512" )
|
||||
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /GL /Ot /Ox /arch:AVX512" )
|
||||
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG" )
|
||||
add_definitions (/D "_CRT_SECURE_NO_WARNINGS")
|
||||
add_definitions(-DUSE_AVX512)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_AVX512 OFF CACHE BOOL "Architecture does not have AVX512 SIMD enabled")
|
||||
endif()
|
||||
elseif(ARCHITECTURE_ARM)
|
||||
if(C_MSVC)
|
||||
try_run(RUN_NEON COMPILE_NEON "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_arm_neon.cxx" COMPILE_DEFINITIONS /O0)
|
||||
else()
|
||||
if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_SYSTEM_PROCESSOR})
|
||||
try_run(RUN_NEON COMPILE_NEON "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_arm_neon.cxx" COMPILE_DEFINITIONS -mfpu=neon -O0)
|
||||
else()
|
||||
try_compile(COMPILE_NEON "${CMAKE_BINARY_DIR}/tmp" "${TEST_DIR}/test_arm_neon.cxx" COMPILE_DEFINITIONS -mfpu=neon -O0)
|
||||
set(RUN_NEON 0)
|
||||
endif()
|
||||
endif()
|
||||
if(COMPILE_NEON AND RUN_NEON EQUAL 0)
|
||||
set(HAS_NEON ON CACHE BOOL "Architecture has NEON SIMD enabled")
|
||||
message(STATUS "Use NEON SIMD instructions")
|
||||
if(C_GCC OR C_CLANG)
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon" )
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon" )
|
||||
add_definitions(-DUSE_NEON)
|
||||
endif()
|
||||
else()
|
||||
set(HAS_NEON OFF CACHE BOOL "Architecture does not have NEON SIMD enabled")
|
||||
endif()
|
||||
elseif(ARCHITECTURE_ARM64)
|
||||
# Advanced SIMD (aka NEON) is mandatory for AArch64
|
||||
set(HAS_NEON ON CACHE BOOL "Architecture has NEON SIMD enabled")
|
||||
message(STATUS "Use NEON SIMD instructions")
|
||||
add_definitions(-DUSE_NEON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# clear binary test folder
|
||||
FILE(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/tmp)
|
|
@ -0,0 +1,15 @@
|
|||
# Clang or AppleClang (see CMP0025)
|
||||
if(NOT DEFINED C_CLANG AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(C_CLANG 1)
|
||||
elseif(NOT DEFINED C_GCC AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
set(C_GCC 1)
|
||||
elseif(NOT DEFINED C_MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
set(C_MSVC 1)
|
||||
if(MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS_EQUAL 1929)
|
||||
set(VS2019 ON)
|
||||
elseif(MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS_EQUAL 1919)
|
||||
set(VS2017 ON)
|
||||
elseif(MSVC_VERSION GREATER 1899 AND MSVC_VERSION LESS 1910)
|
||||
set(VS2015 ON)
|
||||
endif()
|
||||
endif()
|
|
@ -0,0 +1,88 @@
|
|||
# - Try to find GPSD
|
||||
# Once done this will define
|
||||
#
|
||||
# GPSD_FOUND - system has GPSD
|
||||
# GPSD_INCLUDE_DIRS - the GPSD include directory
|
||||
# GPSD_LIBRARIES - Link these to use GPSD
|
||||
# GPSD_DEFINITIONS - Compiler switches required for using GPSD
|
||||
#
|
||||
# Copyright (c) 2006 Andreas Schneider <mail@cynapses.org>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New
|
||||
# BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
set(GPSD_ROOT_DIR
|
||||
"${GPSD_ROOT_DIR}"
|
||||
CACHE
|
||||
PATH
|
||||
"Directory to search for gpsd")
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_GPSD libgps)
|
||||
endif()
|
||||
|
||||
if (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS)
|
||||
# in cache already
|
||||
set(GPSD_FOUND TRUE)
|
||||
else (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS)
|
||||
find_path(GPSD_INCLUDE_DIRS
|
||||
NAMES
|
||||
gps.h
|
||||
PATHS
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
/opt/local/include
|
||||
/sw/include
|
||||
/usr/include/gps
|
||||
/usr/local/include/gps
|
||||
/opt/local/include/gps
|
||||
/sw/include/gps
|
||||
HINTS
|
||||
${PC_GPSD_INCLUDEDIR}
|
||||
${GPSD_ROOT_DIR}
|
||||
)
|
||||
|
||||
# debian uses version suffixes
|
||||
# add suffix evey new release
|
||||
find_library(GPSD_LIBRARIES
|
||||
NAMES
|
||||
gps
|
||||
PATHS
|
||||
/usr/lib64
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
/opt/local/lib
|
||||
/sw/lib
|
||||
HINTS
|
||||
${PC_GPSD_LIBDIR}
|
||||
${GPSD_ROOT_DIR}
|
||||
)
|
||||
|
||||
if (GPSD_INCLUDE_DIRS AND GPSD_LIBRARIES)
|
||||
set(GPSD_FOUND TRUE)
|
||||
endif (GPSD_INCLUDE_DIRS AND GPSD_LIBRARIES)
|
||||
|
||||
if (GPSD_FOUND)
|
||||
if (NOT GPSD_FIND_QUIETLY)
|
||||
message(STATUS "Found GPSD: ${GPSD_LIBRARIES}")
|
||||
endif (NOT GPSD_FIND_QUIETLY)
|
||||
else (GPSD_FOUND)
|
||||
if (GPSD_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Could not find GPSD")
|
||||
endif (GPSD_FIND_REQUIRED)
|
||||
endif (GPSD_FOUND)
|
||||
|
||||
# show the GPSD_INCLUDE_DIRS and GPSD_LIBRARIES variables only in the advanced view
|
||||
mark_as_advanced(GPSD_INCLUDE_DIRS GPSD_LIBRARIES)
|
||||
|
||||
endif (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS)
|
||||
|
||||
# maybe on CYGWIN gpsd works
|
||||
if (WIN32)
|
||||
set(GPSD_FOUND FALSE)
|
||||
set(GPSD_LIBRARIES "")
|
||||
set(GPSD_INCLUDE_DIRS "")
|
||||
endif (WIN32)
|
|
@ -0,0 +1,64 @@
|
|||
# - Try to find Portaudio
|
||||
# Once done this will define
|
||||
#
|
||||
# PORTAUDIO_FOUND - system has Portaudio
|
||||
# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory
|
||||
# PORTAUDIO_LIBRARIES - Link these to use Portaudio
|
||||
|
||||
set(PORTAUDIO_ROOT_DIR
|
||||
"${PORTAUDIO_ROOT_DIR}"
|
||||
CACHE
|
||||
PATH
|
||||
"Directory to search for portaudio")
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_PORTAUDIO portaudio-2.0)
|
||||
endif()
|
||||
|
||||
find_path(PORTAUDIO_INCLUDE_DIRS
|
||||
NAMES
|
||||
portaudio.h
|
||||
PATHS
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
/opt/local/include
|
||||
HINTS
|
||||
${PC_PORTAUDIO_INCLUDEDIR}
|
||||
${PORTAUDIO_ROOT_DIR}
|
||||
)
|
||||
|
||||
find_library(PORTAUDIO_LIBRARIES
|
||||
NAMES
|
||||
portaudio
|
||||
PATHS
|
||||
/usr/local/lib
|
||||
/usr/lib
|
||||
/usr/lib64
|
||||
/opt/local/lib
|
||||
HINTS
|
||||
${PC_PORTAUDIO_LIBDIR}
|
||||
${PORTAUDIO_ROOT_DIR}
|
||||
)
|
||||
|
||||
mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARIES)
|
||||
|
||||
# Found PORTAUDIO, but it may be version 18 which is not acceptable.
|
||||
if(EXISTS ${PORTAUDIO_INCLUDE_DIRS}/portaudio.h)
|
||||
include(CheckCXXSourceCompiles)
|
||||
set(CMAKE_REQUIRED_INCLUDES_SAVED ${CMAKE_REQUIRED_INCLUDES})
|
||||
set(CMAKE_REQUIRED_INCLUDES ${PORTAUDIO_INCLUDE_DIRS})
|
||||
CHECK_CXX_SOURCE_COMPILES(
|
||||
"#include <portaudio.h>\nPaDeviceIndex pa_find_device_by_name(const char *name); int main () {return 0;}"
|
||||
PORTAUDIO2_FOUND)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVED})
|
||||
unset(CMAKE_REQUIRED_INCLUDES_SAVED)
|
||||
if(PORTAUDIO2_FOUND)
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PORTAUDIO DEFAULT_MSG PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARIES)
|
||||
else(PORTAUDIO2_FOUND)
|
||||
message(STATUS
|
||||
" portaudio.h not compatible (requires API 2.0)")
|
||||
set(PORTAUDIO_FOUND FALSE)
|
||||
endif(PORTAUDIO2_FOUND)
|
||||
endif()
|
|
@ -0,0 +1,67 @@
|
|||
# - Try to find Hamlib
|
||||
#
|
||||
# HAMLIB_FOUND - system has Hamlib
|
||||
# HAMLIB_LIBRARIES - location of the library for hamlib
|
||||
# HAMLIB_INCLUDE_DIRS - location of the include files for hamlib
|
||||
#
|
||||
# Requires these CMake modules:
|
||||
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
|
||||
#
|
||||
# Original Author:
|
||||
# 2019 Davide Gerhard <rainbow@irh.it>
|
||||
|
||||
set(HAMLIB_ROOT_DIR
|
||||
"${HAMLIB_ROOT_DIR}"
|
||||
CACHE
|
||||
PATH
|
||||
"Directory to search for hamlib")
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_HAMLIB hamlib)
|
||||
endif()
|
||||
|
||||
find_path(HAMLIB_INCLUDE_DIR
|
||||
NAMES hamlib/rig.h
|
||||
PATHS
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
/opt/local/include
|
||||
HINTS
|
||||
${PC_HAMLIB_INCLUDEDIR}
|
||||
${HAMLIB_ROOT_DIR}
|
||||
)
|
||||
|
||||
find_library(HAMLIB_LIBRARY
|
||||
NAMES hamlib
|
||||
PATHS
|
||||
/usr/lib64/hamlib
|
||||
/usr/lib/hamlib
|
||||
/usr/lib64
|
||||
/usr/lib
|
||||
/usr/local/lib64/hamlib
|
||||
/usr/local/lib/hamlib
|
||||
/usr/local/lib64
|
||||
/usr/local/lib
|
||||
/opt/local/lib
|
||||
/opt/local/lib/hamlib
|
||||
HINTS
|
||||
${PC_HAMLIB_LIBDIR}
|
||||
${HAMLIB_ROOT_DIR}
|
||||
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(hamlib
|
||||
DEFAULT_MSG
|
||||
HAMLIB_LIBRARY
|
||||
HAMLIB_INCLUDE_DIR
|
||||
)
|
||||
|
||||
if(HAMLIB_FOUND)
|
||||
list(APPEND HAMLIB_LIBRARIES ${HAMLIB_LIBRARY})
|
||||
list(APPEND HAMLIB_INCLUDE_DIRS ${HAMLIB_INCLUDE_DIR})
|
||||
mark_as_advanced(HAMLIB_ROOT_DIR)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(HAMLIB_INCLUDE_DIR HAMLIB_LIBRARY)
|
|
@ -0,0 +1,42 @@
|
|||
# - Try to find sndio
|
||||
#
|
||||
# SNDIO_FOUND - system has sndio
|
||||
# SNDIO_LIBRARIES - location of the library for sndio
|
||||
# SNDIO_INCLUDE_DIRS - location of the include files for sndio
|
||||
|
||||
set(SNDIO_ROOT_DIR
|
||||
"${SNDIO_ROOT_DIR}"
|
||||
CACHE
|
||||
PATH
|
||||
"Directory to search for sndio")
|
||||
|
||||
# no need to check pkg-config
|
||||
|
||||
find_path(SNDIO_INCLUDE_DIRS
|
||||
NAMES
|
||||
sndio.h
|
||||
PATHS
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
/opt/local/include
|
||||
HINTS
|
||||
${SNDIO_ROOT_DIR}
|
||||
)
|
||||
|
||||
find_library(SNDIO_LIBRARIES
|
||||
NAMES
|
||||
sndio
|
||||
PATHS
|
||||
/usr/local/lib
|
||||
/usr/lib
|
||||
/usr/lib64
|
||||
/opt/local/lib
|
||||
HINTS
|
||||
${SNDIIO_ROOT_DIR}
|
||||
)
|
||||
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SNDIO DEFAULT_MSG SNDIO_INCLUDE_DIRS SNDIO_LIBRARIES)
|
||||
|
||||
mark_as_advanced(SNDIO_INCLUDE_DIRS SNDIO_LIBRARIES)
|
|
@ -0,0 +1,85 @@
|
|||
# - try to find the udev library
|
||||
#
|
||||
# Cache Variables: (probably not for direct use in your scripts)
|
||||
# UDEV_INCLUDE_DIR
|
||||
# UDEV_SOURCE_DIR
|
||||
# UDEV_LIBRARY
|
||||
#
|
||||
# Non-cache variables you might use in your CMakeLists.txt:
|
||||
# UDEV_FOUND
|
||||
# UDEV_INCLUDE_DIRS
|
||||
# UDEV_LIBRARIES
|
||||
#
|
||||
# Requires these CMake modules:
|
||||
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
|
||||
#
|
||||
# Original Author:
|
||||
# 2014 Kevin M. Godby <kevin@godby.org>
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
set(UDEV_ROOT_DIR
|
||||
"${UDEV_ROOT_DIR}"
|
||||
CACHE
|
||||
PATH
|
||||
"Directory to search for udev")
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PC_LIBUDEV libudev)
|
||||
endif()
|
||||
|
||||
find_library(UDEV_LIBRARY
|
||||
NAMES
|
||||
udev
|
||||
PATHS
|
||||
${PC_LIBUDEV_LIBRARY_DIRS}
|
||||
${PC_LIBUDEV_LIBDIR}
|
||||
/usr/lib64
|
||||
/usr/lib
|
||||
/usr/local/lib
|
||||
HINTS
|
||||
"${UDEV_ROOT_DIR}"
|
||||
PATH_SUFFIXES
|
||||
lib
|
||||
)
|
||||
|
||||
get_filename_component(_libdir "${UDEV_LIBRARY}" PATH)
|
||||
|
||||
find_path(UDEV_INCLUDE_DIR
|
||||
NAMES
|
||||
libudev.h
|
||||
PATHS
|
||||
/usr/include
|
||||
/usr/local/include
|
||||
${PC_LIBUDEV_INCLUDE_DIRS}
|
||||
${PC_LIBUDEV_INCLUDEDIR}
|
||||
HINTS
|
||||
"${_libdir}"
|
||||
"${_libdir}/.."
|
||||
"${UDEV_ROOT_DIR}"
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(udev
|
||||
DEFAULT_MSG
|
||||
UDEV_LIBRARY
|
||||
UDEV_INCLUDE_DIR
|
||||
)
|
||||
|
||||
if (UDEV_INCLUDE_DIR AND UDEV_LIBRARY)
|
||||
set(UDEV_FOUND TRUE)
|
||||
endif (UDEV_INCLUDE_DIR AND UDEV_LIBRARY)
|
||||
|
||||
if(UDEV_FOUND)
|
||||
list(APPEND UDEV_LIBRARIES ${UDEV_LIBRARY})
|
||||
list(APPEND UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR})
|
||||
mark_as_advanced(UDEV_ROOT_DIR)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(UDEV_INCLUDE_DIR
|
||||
UDEV_LIBRARY)
|
|
@ -0,0 +1,36 @@
|
|||
# Normally, all of /dev/hidraw* are accessible only by root.
|
||||
#
|
||||
# $ ls -l /dev/hidraw*
|
||||
# crw------- 1 root root 247, 0 Sep 24 09:40 /dev/hidraw0
|
||||
#
|
||||
# An ordinary user, trying to access it will be denied.
|
||||
#
|
||||
# Unnecessarily running applications as root is generally a bad idea because it makes it too easy
|
||||
# to accidentally trash your system. We need to relax the restrictions so ordinary users can use these devices.
|
||||
#
|
||||
# If all went well with installation, the /etc/udev/rules.d directory should contain a file called
|
||||
# 99-direwolf-cmedia.rules containing:
|
||||
#
|
||||
|
||||
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", GROUP="audio", MODE="0660"
|
||||
|
||||
#
|
||||
# I used the "audio" group, mimicking the permissions on the sound side of the device.
|
||||
#
|
||||
# $ ls -l /dev/snd/pcm*
|
||||
# crw-rw----+ 1 root audio 116, 16 Sep 24 09:40 /dev/snd/pcmC0D0p
|
||||
# crw-rw----+ 1 root audio 116, 17 Sep 24 09:40 /dev/snd/pcmC0D1p
|
||||
#
|
||||
# You should see something similar to this where someone in the "audio" group has read-write access.
|
||||
#
|
||||
# $ ls -l /dev/hidraw*
|
||||
# crw-rw---- 1 root audio 247, 0 Oct 6 19:24 /dev/hidraw0
|
||||
#
|
||||
# Read the User Guide and run the "cm108" application for more information.
|
||||
#
|
||||
|
||||
#
|
||||
# Same thing for the "All In One Cable."
|
||||
#
|
||||
|
||||
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="7388", GROUP="audio", MODE="0660"
|
|
@ -0,0 +1,48 @@
|
|||
# generate conf per platform
|
||||
file(READ "${CUSTOM_CONF_DIR}/generic.conf" file_content)
|
||||
|
||||
if(LINUX)
|
||||
string(REGEX REPLACE "\n%W%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%M%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%L%([^\n]*)" "\n\\1" file_content "${file_content}")
|
||||
elseif(WIN32 OR CYGWIN)
|
||||
string(REGEX REPLACE "\n%M%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%L%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%W%([^\n]*)" "\n\\1" file_content "${file_content}")
|
||||
else() # macOS FreeBSD OpenBSD
|
||||
string(REGEX REPLACE "\n%W%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%L%[^\n]*" "" file_content "${file_content}")
|
||||
string(REGEX REPLACE "\n%M%([^\n]*)" "\n\\1" file_content "${file_content}")
|
||||
endif()
|
||||
|
||||
# remove remark
|
||||
string(REGEX REPLACE "\n%R%[^\n]*" "" file_content "${file_content}")
|
||||
|
||||
# clear common lines
|
||||
string(REGEX REPLACE "\n%C%([^\n]*)" "\n\\1" file_content "${file_content}")
|
||||
string(REGEX REPLACE "^%C%([^\n]*)" "\\1" file_content "${file_content}")
|
||||
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/direwolf.conf" "${file_content}")
|
||||
|
||||
# install udev rules for CM108
|
||||
if(LINUX)
|
||||
install(FILES "${CUSTOM_CONF_DIR}/99-direwolf-cmedia.rules" DESTINATION /etc/udev/rules.d/)
|
||||
endif()
|
||||
|
||||
install(FILES "${CMAKE_BINARY_DIR}/direwolf.conf" DESTINATION ${INSTALL_CONF_DIR})
|
||||
install(FILES "${CUSTOM_CONF_DIR}/sdr.conf" DESTINATION ${INSTALL_CONF_DIR})
|
||||
|
||||
# Put sample configuration & startup files in home directory.
|
||||
# This step would be done as ordinary user.
|
||||
# Some people like to put the direwolf config file in /etc/ax25.
|
||||
# Note that all of these are also in $(DESTDIR)/share/doc/direwolf/examples/.
|
||||
if(NOT (WIN32 OR CYGWIN))
|
||||
add_custom_target(install-conf
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DCUSTOM_BINARY_DIR="${CMAKE_BINARY_DIR}"
|
||||
-DCUSTOM_CONF_DIR="${CUSTOM_CONF_DIR}"
|
||||
-DCUSTOM_SCRIPTS_DIR="${CUSTOM_SCRIPTS_DIR}"
|
||||
-DCUSTOM_TELEMETRY_DIR="${CUSTOM_TELEMETRY_DIR}"
|
||||
-P "${CMAKE_SOURCE_DIR}/conf/install_conf.cmake"
|
||||
)
|
||||
endif()
|
|
@ -0,0 +1,537 @@
|
|||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# Configuration file for Dire Wolf #
|
||||
%C%# #
|
||||
%L%# Linux version #
|
||||
%W%# Windows version #
|
||||
%M%# Macintosh version #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%R%
|
||||
%R%
|
||||
%R% The sample config file was getting pretty messy
|
||||
%R% with the Windows and Linux differences.
|
||||
%R% It would be a maintenance burden to keep most of
|
||||
%R% two different versions in sync.
|
||||
%R% This common source is now used to generate the
|
||||
%R% two different variations while having only a single
|
||||
%R% copy of the common parts.
|
||||
%R%
|
||||
%R% The first column contains one of the following:
|
||||
%R%
|
||||
%R% R remark which is discarded.
|
||||
%R% C common to both versions.
|
||||
%R% W Windows version only.
|
||||
%R% L Linux version only.
|
||||
%R% M Macintosh version and possibly others (portaudio used).
|
||||
%R%
|
||||
%C%#
|
||||
%C%# Extensive documentation can be found here:
|
||||
%C%# Stable release - https://github.com/wb2osz/direwolf/tree/master/doc
|
||||
%C%# Latest development - https://github.com/wb2osz/direwolf/tree/dev/doc
|
||||
%C%# Additional topics - https://github.com/wb2osz/direwolf-doc
|
||||
%C%#
|
||||
%W%# The basic documentation set can also be found in the doc folder.
|
||||
%L%# The basic documentation set can also be found in
|
||||
%L%# /usr/local/share/doc/direwolf/ or /usr/share/doc/direwolf/
|
||||
%L%# Concise "man" pages are also available for Linux.
|
||||
%M%# /usr/local/share/doc/direwolf/ or /usr/share/doc/direwolf/
|
||||
%M%# Concise "man" pages are also available for Mac OSX.
|
||||
%C%#
|
||||
%C%# Questions??? Join the discussion forum: https://groups.io/g/direwolf
|
||||
%C%#
|
||||
%C%#
|
||||
%C%# This sample file does not have examples for all of the possibilities.
|
||||
%C%# Consult the User Guide for more details on configuration options
|
||||
%C%# and other documents for more details for different uses.
|
||||
%C%#
|
||||
%C%# These are the most likely settings you might change:
|
||||
%C%#
|
||||
%C%# (1) MYCALL - call sign and SSID for your station.
|
||||
%C%#
|
||||
%C%# Look for lines starting with MYCALL and
|
||||
%C%# change NOCALL to your own.
|
||||
%C%#
|
||||
%C%# (2) PBEACON - enable position beaconing.
|
||||
%C%#
|
||||
%C%# Look for lines starting with PBEACON and
|
||||
%C%# modify for your call, location, etc.
|
||||
%C%#
|
||||
%C%# (3) DIGIPEATER - configure digipeating rules.
|
||||
%C%#
|
||||
%C%# Look for lines starting with DIGIPEATER.
|
||||
%C%# Most people will probably use the given example.
|
||||
%C%# Just remove the "#" from the start of the line
|
||||
%C%# to enable it.
|
||||
%C%#
|
||||
%C%# (4) IGSERVER, IGLOGIN - IGate server and login
|
||||
%C%#
|
||||
%C%# Configure an IGate client to relay messages between
|
||||
%C%# radio and internet servers.
|
||||
%C%#
|
||||
%C%#
|
||||
%C%# The default location is "direwolf.conf" in the current working directory.
|
||||
%L%# On Linux, the user's home directory will also be searched.
|
||||
%C%# An alternate configuration file location can be specified with the "-c" command line option.
|
||||
%C%#
|
||||
%C%# As you probably guessed by now, # indicates a comment line.
|
||||
%C%#
|
||||
%C%# Remove the # at the beginning of a line if you want to use a sample
|
||||
%C%# configuration that is currently commented out.
|
||||
%C%#
|
||||
%C%# Commands are a keyword followed by parameters.
|
||||
%C%#
|
||||
%C%# Command key words are case insensitive. i.e. upper and lower case are equivalent.
|
||||
%C%#
|
||||
%C%# Command parameters are generally case sensitive. i.e. upper and lower case are different.
|
||||
%C%#
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# FIRST AUDIO DEVICE PROPERTIES #
|
||||
%C%# (Channel 0 + 1 if in stereo) #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Many people will simply use the default sound device.
|
||||
%C%# Some might want to use an alternative device by choosing it here.
|
||||
%C%#
|
||||
%C%#
|
||||
%C%# Many examples of radio interfaces and PTT options can be found in:
|
||||
%C%# https://github.com/wb2osz/direwolf-doc/blob/main/Radio-Interface-Guide.pdf
|
||||
%C%#
|
||||
%C%#
|
||||
%R% ---------- Windows ----------
|
||||
%R%
|
||||
%W%# When the Windows version starts up, it displays something like
|
||||
%W%# this with the available sound devices and capabilities:
|
||||
%W%#
|
||||
%W%# Available audio input devices for receive (*=selected):
|
||||
%W%# * 0: Microphone (C-Media USB Headpho (channel 2)
|
||||
%W%# 1: Microphone (Bluetooth SCO Audio
|
||||
%W%# 2: Microphone (Bluetooth AV Audio)
|
||||
%W%# * 3: Microphone (Realtek High Defini (channels 0 & 1)
|
||||
%W%# Available audio output devices for transmit (*=selected):
|
||||
%W%# * 0: Speakers (C-Media USB Headphone (channel 2)
|
||||
%W%# 1: Speakers (Bluetooth SCO Audio)
|
||||
%W%# 2: Realtek Digital Output(Optical)
|
||||
%W%# 3: Speakers (Bluetooth AV Audio)
|
||||
%W%# * 4: Speakers (Realtek High Definiti (channels 0 & 1)
|
||||
%W%# 5: Realtek Digital Output (Realtek
|
||||
%W%#
|
||||
%W%# Example: To use the microphone and speaker connections on the
|
||||
%W%# system board, either of these forms can be used:
|
||||
%W%
|
||||
%W%#ADEVICE High
|
||||
%W%#ADEVICE 3 4
|
||||
%W%
|
||||
%W%
|
||||
%W%# Example: To use the USB Audio, use a command like this with
|
||||
%W%# the input and output device numbers. (Remove the # comment character.)
|
||||
%W%#ADEVICE USB
|
||||
%W%
|
||||
%W%# You can also use "-" or "stdin" to pipe stdout from
|
||||
%W%# some other application such as a software defined radio.
|
||||
%W%# "stdin" is not an audio device. Don't use this unless you
|
||||
%W%# understand what this means. Read the User Guide.
|
||||
%W%# You can also specify "UDP:" and an optional port for input.
|
||||
%W%# Something different must be specified for output.
|
||||
%W%
|
||||
%W%# ADEVICE stdin 0
|
||||
%W%# ADEVICE UDP:7355 0
|
||||
%W%
|
||||
%W%# The position in the list can change when devices (e.g. USB) are added and removed.
|
||||
%W%# You can also specify devices by using part of the name.
|
||||
%W%# Here is an example of specifying the USB Audio device.
|
||||
%W%# This is case-sensitive. Upper and lower case are not treated the same.
|
||||
%W%
|
||||
%W%#ADEVICE USB
|
||||
%W%
|
||||
%W%
|
||||
%R% ---------- Linux ----------
|
||||
%R%
|
||||
%L%# Linux ALSA is complicated. See User Guide for discussion.
|
||||
%L%# To use something other than the default, generally use plughw
|
||||
%L%# and a card number reported by "arecord -l" command. Example:
|
||||
%L%
|
||||
%L%# ADEVICE plughw:1,0
|
||||
%L%
|
||||
%L%# You can also use "-" or "stdin" to pipe stdout from
|
||||
%L%# some other application such as a software defined radio.
|
||||
%L%# "stdin" is not an audio device. Don't use this unless you
|
||||
%L%# understand what this means. Read the User Guide.
|
||||
%L%# You can also specify "UDP:" and an optional port for input.
|
||||
%L%# Something different must be specified for output.
|
||||
%L%
|
||||
%L%# ADEVICE stdin plughw:1,0
|
||||
%L%# ADEVICE UDP:7355 default
|
||||
%L%
|
||||
%R% ---------- Mac ----------
|
||||
%R%
|
||||
%M%# Macintosh Operating System uses portaudio driver for audio
|
||||
%M%# input/output. Default device selection not available. User/OP
|
||||
%M%# must configure the sound input/output option. Note that
|
||||
%M%# the device names can contain spaces. In this case, the names
|
||||
%M%# must be enclosed by quotes.
|
||||
%M%#
|
||||
%M%# Examples:
|
||||
%M%#
|
||||
%M%ADEVICE "Built-in Input" "Built-in Output"
|
||||
%M%
|
||||
%M%# ADEVICE "USB Audio Codec:6" "USB Audio Codec:5"
|
||||
%M%#
|
||||
%M%#
|
||||
%M%# You can also use "-" or "stdin" to pipe stdout from
|
||||
%M%# some other application such as a software defined radio.
|
||||
%M%# "stdin" is not an audio device. Don't use this unless you
|
||||
%M%# understand what this means. Read the User Guide.
|
||||
%M%# You can also specify "UDP:" and an optional port for input.
|
||||
%M%# Something different must be specified for output.
|
||||
%M%
|
||||
%M%# ADEVICE UDP:7355 default
|
||||
%M%#
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Number of audio channels for this souncard: 1 (mono) or 2 (stereo).
|
||||
%C%# 1 is the default so there is no need to specify it.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#ACHANNELS 2
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# SECOND AUDIO DEVICE PROPERTIES #
|
||||
%C%# (Channel 2 + 3 if in stereo) #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#ADEVICE1 ...
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# THIRD AUDIO DEVICE PROPERTIES #
|
||||
%C%# (Channel 4 + 5 if in stereo) #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#ADEVICE2 ...
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# CHANNEL 0 PROPERTIES #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%CHANNEL 0
|
||||
%C%
|
||||
%C%#
|
||||
%C%# The following MYCALL, MODEM, PTT, etc. configuration items
|
||||
%C%# apply to the most recent CHANNEL.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Station identifier for this channel.
|
||||
%C%# Multiple channels can have the same or different names.
|
||||
%C%#
|
||||
%C%# It can be up to 6 letters and digits with an optional ssid.
|
||||
%C%# The APRS specification requires that it be upper case.
|
||||
%C%#
|
||||
%C%# Example (don't use this unless you are me): MYCALL WB2OSZ-5
|
||||
%C%#
|
||||
%C%
|
||||
%C%MYCALL N0CALL
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Pick a suitable modem speed based on your situation.
|
||||
%C%# 1200 Most common for VHF/UHF. This is the default if not specified.
|
||||
%C%# 2400 QPSK compatible with MFJ-2400, and probably PK232-2400 & KPC-2400.
|
||||
%C%# 300 Low speed for HF SSB. Default tones 1600 & 1800.
|
||||
%C%# EAS Emergency Alert System (EAS) Specific Area Message Encoding (SAME).
|
||||
%C%# 9600 G3RUH style - Can't use Microphone and Speaker connections.
|
||||
%C%# AIS International system for tracking ships on VHF.
|
||||
%C%# Also uses 9600 bps so Speaker connection won't work.
|
||||
%C%#
|
||||
%C%# In most cases you can just specify the speed. Examples:
|
||||
%C%#
|
||||
%C%
|
||||
%C%MODEM 1200
|
||||
%C%#MODEM 9600
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Many options are available for great flexibility.
|
||||
%C%# See User Guide for details.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Uncomment line below to enable the DTMF decoder for this channel.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#DTMF
|
||||
%C%
|
||||
%C%# Push to Talk (PTT) can be confusing because there are so many different cases.
|
||||
%C%# Radio-Interface-Guide.pdf in https://github.com/wb2osz/direwolf-doc
|
||||
%C%# goes into detail about the various options.
|
||||
%C%
|
||||
%L%# If using a C-Media CM108/CM119 or similar USB Audio Adapter,
|
||||
%L%# you can use a GPIO pin for PTT control. This is very convenient
|
||||
%L%# because a single USB connection is used for both audio and PTT.
|
||||
%L%# Example:
|
||||
%L%
|
||||
%L%#PTT CM108
|
||||
%L%
|
||||
%W%# If using a C-Media CM108/CM119 or similar USB Audio Adapter,
|
||||
%W%# you can use a GPIO pin for PTT control. This is very convenient
|
||||
%W%# because a single USB connection is used for both audio and PTT.
|
||||
%W%# Example:
|
||||
%W%
|
||||
%W%#PTT CM108
|
||||
%W%%C%#
|
||||
%C%# The transmitter Push to Talk (PTT) control can be wired to a serial port
|
||||
%C%# with a suitable interface circuit. DON'T connect it directly!
|
||||
%C%#
|
||||
%C%# For the PTT command, specify the device and either RTS or DTR.
|
||||
%C%# RTS or DTR may be preceded by "-" to invert the signal.
|
||||
%C%# Both can be used for interfaces that want them driven with opposite polarity.
|
||||
%C%#
|
||||
%L%# COM1 can be used instead of /dev/ttyS0, COM2 for /dev/ttyS1, and so on.
|
||||
%L%#
|
||||
%C%
|
||||
%C%#PTT COM1 RTS
|
||||
%C%#PTT COM1 RTS -DTR
|
||||
%L%#PTT /dev/ttyUSB0 RTS
|
||||
%L%#PTT /dev/ttyUSB0 RTS -DTR
|
||||
%C%
|
||||
%L%#
|
||||
%L%# On Linux, you can also use general purpose I/O pins if
|
||||
%L%# your system is configured for user access to them.
|
||||
%L%# This would apply mostly to microprocessor boards, not a regular PC.
|
||||
%L%# See separate Raspberry Pi document for more details.
|
||||
%L%# The number may be preceded by "-" to invert the signal.
|
||||
%L%#
|
||||
%L%
|
||||
%L%#PTT GPIO 25
|
||||
%L%
|
||||
%C%# The Data Carrier Detect (DCD) signal can be sent to most of the same places
|
||||
%C%# as the PTT signal. This could be used to light up an LED like a normal TNC.
|
||||
%C%
|
||||
%C%#DCD COM1 -DTR
|
||||
%L%#DCD GPIO 24
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# CHANNEL 1 PROPERTIES #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#CHANNEL 1
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Specify MYCALL, MODEM, PTT, etc. configuration items for
|
||||
%C%# CHANNEL 1. Repeat for any other channels.
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# TEXT TO SPEECH COMMAND FILE #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%W%#SPEECH dwespeak.bat
|
||||
%L%#SPEECH dwespeak.sh
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# VIRTUAL TNC SERVER PROPERTIES #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Dire Wolf acts as a virtual TNC and can communicate with
|
||||
%C%# client applications by different protocols:
|
||||
%C%#
|
||||
%C%# - the "AGW TCPIP Socket Interface" - default port 8000
|
||||
%C%# - KISS protocol over TCP socket - default port 8001
|
||||
%W%# - KISS TNC via serial port
|
||||
%L%# - KISS TNC via pseudo terminal (-p command line option)
|
||||
%C%#
|
||||
%C%
|
||||
%C%AGWPORT 8000
|
||||
%C%KISSPORT 8001
|
||||
%C%
|
||||
%W%#
|
||||
%W%# Some applications are designed to operate with only a physical
|
||||
%W%# TNC attached to a serial port. For these, we provide a virtual serial
|
||||
%W%# port that appears to be connected to a TNC.
|
||||
%W%#
|
||||
%W%# Take a look at the User Guide for instructions to set up
|
||||
%W%# two virtual serial ports named COM3 and COM4 connected by
|
||||
%W%# a null modem.
|
||||
%W%#
|
||||
%W%# Using the configuration described, Dire Wolf will connect to
|
||||
%W%# COM3 and the client application will use COM4.
|
||||
%W%#
|
||||
%W%# Uncomment following line to use this feature.
|
||||
%W%
|
||||
%W%#NULLMODEM COM3
|
||||
%W%
|
||||
%W%
|
||||
%C%#
|
||||
%C%# It is sometimes possible to recover frames with a bad FCS.
|
||||
%C%# This is not a global setting.
|
||||
%C%# It applies only the the most recent CHANNEL specified.
|
||||
%C%#
|
||||
%C%# 0 - Don't try to repair. (default)
|
||||
%C%# 1 - Attempt to fix single bit error.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#FIX_BITS 0
|
||||
%C%
|
||||
%C%#
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# FIXED POSIION BEACONING PROPERTIES #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Beaconing is configured with these two commands:
|
||||
%C%#
|
||||
%C%# PBEACON - for a position report (usually yourself)
|
||||
%C%# OBEACON - for an object report (usually some other entity)
|
||||
%C%#
|
||||
%C%# Each has a series of keywords and values for options.
|
||||
%C%# See User Guide for details.
|
||||
%C%#
|
||||
%C%# Example:
|
||||
%C%#
|
||||
%C%# This results in a broadcast once every 10 minutes.
|
||||
%C%# Every half hour, it can travel via one digipeater hop.
|
||||
%C%# The others are kept local.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#PBEACON delay=1 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA" via=WIDE1-1
|
||||
%C%#PBEACON delay=11 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
%C%#PBEACON delay=21 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Did you know that APRS comments and messages can contain UTF-8 characters, not only plain ASCII?
|
||||
%C%#
|
||||
%C%#PBEACON delay=1 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W comment=" Did you know that APRS comments and messages can contain UTF-8 characters? \xe0\xb8\xa7\xe0\xb8\xb4\xe0\xb8\x97\xe0\xb8\xa2\xe0\xb8\xb8\xe0\xb8\xaa\xe0\xb8\xa1\xe0\xb8\xb1\xe0\xb8\x84\xe0\xb8\xa3\xe0\xb9\x80\xe0\xb8\xa5\xe0\xb9\x88\xe0\xb8\x99"
|
||||
%C%#PBEACON delay=11 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W comment=" Did you know that APRS comments and messages can contain UTF-8 characters? \xce\xa1\xce\xb1\xce\xb4\xce\xb9\xce\xbf\xce\xb5\xcf\x81\xce\xb1\xcf\x83\xce\xb9\xcf\x84\xce\xb5\xcf\x87\xce\xbd\xce\xb9\xcf\x83\xce\xbc\xcf\x8c\xcf\x82"
|
||||
%C%#PBEACON delay=21 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W comment=" Did you know that APRS comments and messages can contain UTF-8 characters? \xe3\x82\xa2\xe3\x83\x9e\xe3\x83\x81\xe3\x83\xa5\xe3\x82\xa2\xe7\x84\xa1\xe7\xb7\x9a"
|
||||
%C%#
|
||||
%C%# With UTM coordinates instead of latitude and longitude.
|
||||
%C%
|
||||
%C%#PBEACON delay=1 every=10 overlay=S symbol="digi" zone=19T easting=307477 northing=4720178
|
||||
%C%
|
||||
%C%
|
||||
%C%#
|
||||
%C%# When the destination field is set to "SPEECH" the information part is
|
||||
%C%# converted to speech rather than transmitted as a data frame.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#CBEACON dest="SPEECH" info="Club meeting tonight at 7 pm."
|
||||
%C%
|
||||
%C%# Similar for Morse code. If SSID is specified, it is multiplied
|
||||
%C%# by 2 to get speed in words per minute (WPM).
|
||||
%C%
|
||||
%C%#CBEACON dest="MORSE-6" info="de MYCALL"
|
||||
%C%
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Modify for your particular situation before removing
|
||||
%C%# the # comment character from the beginning of appropriate lines above.
|
||||
%C%#
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# APRS DIGIPEATER PROPERTIES #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#
|
||||
%C%# For most common situations, use something like this by removing
|
||||
%C%# the "#" from the beginning of the line below.
|
||||
%C%#
|
||||
%C%
|
||||
%C%#DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$|^TEST$ ^WIDE[12]-[12]$
|
||||
%C%
|
||||
%C%# See User Guide and "APRS-Digipeaters.pdf" for more explanation of what
|
||||
%C%# this means and how it can be customized for your particular needs.
|
||||
%C%
|
||||
%C%
|
||||
%C%# Traditional connected mode packet radio uses a different
|
||||
%C%# type of digipeating. See User Guide for details.
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# INTERNET GATEWAY #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%# First you need to specify the name of a Tier 2 server.
|
||||
%C%# The current preferred way is to use one of these regional rotate addresses:
|
||||
%C%
|
||||
%C%# noam.aprs2.net - for North America
|
||||
%C%# soam.aprs2.net - for South America
|
||||
%C%# euro.aprs2.net - for Europe and Africa
|
||||
%C%# asia.aprs2.net - for Asia
|
||||
%C%# aunz.aprs2.net - for Oceania
|
||||
%C%
|
||||
%C%#IGSERVER noam.aprs2.net
|
||||
%C%
|
||||
%C%# You also need to specify your login name and passcode.
|
||||
%C%# Contact the author if you can't figure out how to generate the passcode.
|
||||
%C%
|
||||
%C%#IGLOGIN WB2OSZ-5 123456
|
||||
%C%
|
||||
%C%# That's all you need for a receive only IGate which relays
|
||||
%C%# messages from the local radio channel to the global servers.
|
||||
%C%
|
||||
%C%# Some might want to send an IGate client position directly to a server
|
||||
%C%# without sending it over the air and relying on someone else to
|
||||
%C%# forward it to an IGate server. This is done by using sendto=IG rather
|
||||
%C%# than a radio channel number. Overlay R for receive only, T for two way.
|
||||
%C%# There is no need to send it as often as you would over the radio.
|
||||
%C%
|
||||
%C%#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=R lat=42^37.14N long=071^20.83W
|
||||
%C%#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=T lat=42^37.14N long=071^20.83W
|
||||
%C%
|
||||
%C%
|
||||
%C%# To relay messages from the Internet to radio, you need to add
|
||||
%C%# one more option with the transmit channel number and a VIA path.
|
||||
%C%
|
||||
%C%#IGTXVIA 0 WIDE1-1,WIDE2-1
|
||||
%C%
|
||||
%C%
|
||||
%C%# Finally, we don't want to flood the radio channel.
|
||||
%C%# The IGate function will limit the number of packets transmitted
|
||||
%C%# during 1 minute and 5 minute intervals. If a limit would
|
||||
%C%# be exceeded, the packet is dropped and message is displayed in red.
|
||||
%C%# This might be low for APRS Thursday when there is abnormally high activity.
|
||||
%C%
|
||||
%C%IGTXLIMIT 6 10
|
||||
%C%
|
||||
%C%
|
||||
%C%#############################################################
|
||||
%C%# #
|
||||
%C%# APRStt GATEWAY #
|
||||
%C%# #
|
||||
%C%#############################################################
|
||||
%C%
|
||||
%C%#
|
||||
%C%# Dire Wolf can receive DTMF (commonly known as Touch Tone)
|
||||
%C%# messages and convert them to packet objects.
|
||||
%C%#
|
||||
%C%# See separate "APRStt-Implementation-Notes" document for details.
|
||||
%C%#
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
if(NOT EXISTS $ENV{HOME}/direwolf.conf)
|
||||
configure_file("${CUSTOM_BINARY_DIR}/direwolf.conf" $ENV{HOME})
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS $ENV{HOME}/sdr.conf)
|
||||
configure_file("${CUSTOM_CONF_DIR}/sdr.conf" $ENV{HOME})
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS $ENV{HOME}/dw-start.sh)
|
||||
configure_file("${CUSTOM_SCRIPTS_DIR}/dw-start.sh" $ENV{HOME})
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS $ENV{HOME}/telem-m0xer-3.txt)
|
||||
configure_file("${CUSTOM_TELEMETRY_DIR}/telem-m0xer-3.txt" $ENV{HOME})
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS $ENV{HOME}/telem-balloon.conf)
|
||||
configure_file("${CUSTOM_TELEMETRY_DIR}/telem-balloon.conf" $ENV{HOME})
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS $ENV{HOME}/telem-volts.conf)
|
||||
configure_file("${CUSTOM_TELEMETRY_DIR}/telem-volts.conf" $ENV{HOME})
|
||||
endif()
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# Sample configuration for SDR read-only IGate.
|
||||
#
|
||||
|
||||
# We might not have an audio output device so set to null.
|
||||
# We will override the input half on the command line.
|
||||
ADEVICE null null
|
||||
CHANNEL 0
|
||||
MYCALL xxx
|
||||
|
||||
# First you need to specify the name of a Tier 2 server.
|
||||
# The current preferred way is to use one of these regional rotate addresses:
|
||||
|
||||
# noam.aprs2.net - for North America
|
||||
# soam.aprs2.net - for South America
|
||||
# euro.aprs2.net - for Europe and Africa
|
||||
# asia.aprs2.net - for Asia
|
||||
# aunz.aprs2.net - for Oceania
|
||||
|
||||
IGSERVER noam.aprs2.net
|
||||
|
||||
# You also need to specify your login name and passcode.
|
||||
# Contact the author if you can't figure out how to generate the passcode.
|
||||
|
||||
IGLOGIN xxx 123456
|
||||
|
||||
# That's all you need for a receive only IGate which relays
|
||||
# messages from the local radio channel to the global servers.
|
||||
|
||||
|
154
config.h
154
config.h
|
@ -1,154 +0,0 @@
|
|||
|
||||
/*----------------------------------------------------------------------------
|
||||
*
|
||||
* Name: config.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H 1
|
||||
|
||||
#include "audio.h" /* for struct audio_s */
|
||||
#include "digipeater.h" /* for struct digi_config_s */
|
||||
#include "aprs_tt.h" /* for struct tt_config_s */
|
||||
#include "igate.h" /* for struct igate_config_s */
|
||||
|
||||
/*
|
||||
* All the leftovers.
|
||||
* This wasn't thought out. It just happened.
|
||||
*/
|
||||
|
||||
enum beacon_type_e { BEACON_IGNORE, BEACON_POSITION, BEACON_OBJECT, BEACON_TRACKER, BEACON_CUSTOM };
|
||||
|
||||
enum sendto_type_e { SENDTO_XMIT, SENDTO_IGATE, SENDTO_RECV };
|
||||
|
||||
|
||||
#define MAX_BEACONS 30
|
||||
|
||||
struct misc_config_s {
|
||||
|
||||
int agwpe_port; /* Port number for the “AGW TCPIP Socket Interface” */
|
||||
int kiss_port; /* Port number for the “KISS” protocol. */
|
||||
int enable_kiss_pt; /* Enable pseudo terminal for KISS. */
|
||||
/* Want this to be off by default because it hangs */
|
||||
/* after a while if nothing is reading from other end. */
|
||||
|
||||
char nullmodem[40]; /* Serial port name for our end of the */
|
||||
/* virtual null modem for native Windows apps. */
|
||||
|
||||
char nmea_port[40]; /* Serial port name for NMEA communication with GPS */
|
||||
/* receiver and/or mapping application. */
|
||||
|
||||
char logdir[80]; /* Directory for saving activity logs. */
|
||||
|
||||
int sb_configured; /* TRUE if SmartBeaconing is configured. */
|
||||
int sb_fast_speed; /* MPH */
|
||||
int sb_fast_rate; /* seconds */
|
||||
int sb_slow_speed; /* MPH */
|
||||
int sb_slow_rate; /* seconds */
|
||||
int sb_turn_time; /* seconds */
|
||||
int sb_turn_angle; /* degrees */
|
||||
int sb_turn_slope; /* degrees * MPH */
|
||||
|
||||
|
||||
int num_beacons; /* Number of beacons defined. */
|
||||
|
||||
struct beacon_s {
|
||||
|
||||
enum beacon_type_e btype; /* Position or object. */
|
||||
|
||||
int lineno; /* Line number from config file for later error messages. */
|
||||
|
||||
enum sendto_type_e sendto_type;
|
||||
|
||||
/* SENDTO_XMIT - Usually beacons go to a radio transmitter. */
|
||||
/* chan, below is the channel number. */
|
||||
/* SENDTO_IGATE - Send to IGate, probably to announce my position */
|
||||
/* rather than relying on someone else to hear */
|
||||
/* me on the radio and report me. */
|
||||
/* SENDTO_RECV - Pretend this was heard on the specified */
|
||||
/* radio channel. Mostly for testing. It is a */
|
||||
/* convenient way to send packets to attached apps. */
|
||||
|
||||
int sendto_chan; /* Transmit or simulated receive channel for above. Should be 0 for IGate. */
|
||||
|
||||
int delay; /* Seconds to delay before first transmission. */
|
||||
|
||||
int every; /* Time between transmissions, seconds. */
|
||||
/* Remains fixed for PBEACON and OBEACON. */
|
||||
/* Dynamically adjusted for TBEACON. */
|
||||
|
||||
time_t next; /* Unix time to transmit next one. */
|
||||
|
||||
char *dest; /* NULL or explicit AX.25 destination to use */
|
||||
/* instead of the software version such as APDW11. */
|
||||
|
||||
int compress; /* Use more compact form? */
|
||||
|
||||
char objname[10]; /* Object name. Any printable characters. */
|
||||
|
||||
char *via; /* Path, e.g. "WIDE1-1,WIDE2-1" or NULL. */
|
||||
|
||||
char *custom_info; /* Info part for handcrafted custom beacon. */
|
||||
/* Ignore the rest below if this is set. */
|
||||
|
||||
int messaging; /* Set messaging attribute for position report. */
|
||||
/* i.e. Data Type Indicator of '=' rather than '!' */
|
||||
|
||||
double lat; /* Latitude and longitude. */
|
||||
double lon;
|
||||
float alt_m; /* Altitude in meters. */
|
||||
|
||||
char symtab; /* Symbol table: / or \ or overlay character. */
|
||||
char symbol; /* Symbol code. */
|
||||
|
||||
float power; /* For PHG. */
|
||||
float height;
|
||||
float gain; /* Original protocol spec was unclear. */
|
||||
/* Addendum 1.1 clarifies it is dBi not dBd. */
|
||||
|
||||
char dir[3]; /* 1 or 2 of N,E,W,S, or empty for omni. */
|
||||
|
||||
float freq; /* MHz. */
|
||||
float tone; /* Hz. */
|
||||
float offset; /* MHz. */
|
||||
|
||||
char *comment; /* Comment or NULL. */
|
||||
|
||||
|
||||
} beacon[MAX_BEACONS];
|
||||
|
||||
};
|
||||
|
||||
|
||||
#define MIN_IP_PORT_NUMBER 1024
|
||||
#define MAX_IP_PORT_NUMBER 49151
|
||||
|
||||
|
||||
#define DEFAULT_AGWPE_PORT 8000 /* Like everyone else. */
|
||||
#define DEFAULT_KISS_PORT 8001 /* Above plus 1. */
|
||||
|
||||
|
||||
#define DEFAULT_NULLMODEM "COM3" /* should be equiv. to /dev/ttyS2 on Cygwin */
|
||||
|
||||
|
||||
|
||||
|
||||
extern void config_init (char *fname, struct audio_s *p_modem,
|
||||
struct digi_config_s *digi_config,
|
||||
struct tt_config_s *p_tt_config,
|
||||
struct igate_config_s *p_igate_config,
|
||||
struct misc_config_s *misc_config);
|
||||
|
||||
|
||||
|
||||
#endif /* CONFIG_H */
|
||||
|
||||
/* end config.h */
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#
|
||||
# Update: 1 May 2023 (still 1.7 dev version)
|
||||
#
|
||||
# The original intention was to allow an easy way to download the most
|
||||
# recent versions of some files.
|
||||
#
|
||||
# "update-data" would only work once.
|
||||
#
|
||||
# These locations are no longer being maintained:
|
||||
# http://www.aprs.org/aprs11/tocalls.txt -- 14 Dec 2021
|
||||
# http://www.aprs.org/symbols/symbols-new.txt -- 17 Mar 2021
|
||||
# http://www.aprs.org/symbols/symbolsX.txt -- 25 Nov 2015
|
||||
# so there is no reason to provide a capability grab the latest version.
|
||||
#
|
||||
# Rather than fixing an obsolete capability, it will just be removed.
|
||||
#
|
||||
# The destination field is often used to identify the manufacturer/model.
|
||||
# These are not hardcoded into Dire Wolf. Instead they are read from
|
||||
# a file called tocalls.txt at application start up time.
|
||||
#
|
||||
# The original permanent symbols are built in but the "new" symbols,
|
||||
# using overlays, are often updated. These are also read from files.
|
||||
#
|
||||
|
||||
|
||||
include(ExternalProject)
|
||||
|
||||
set(TOCALLS_TXT "tocalls.txt")
|
||||
set(SYMBOLS-NEW_TXT "symbols-new.txt")
|
||||
set(SYMBOLSX_TXT "symbolsX.txt")
|
||||
set(CUSTOM_BINARY_DATA_DIR "${CMAKE_BINARY_DIR}/data")
|
||||
|
||||
# we can also move to a separate cmake file and use file(download)
|
||||
# see conf/install_conf.cmake as example
|
||||
file(COPY "${CUSTOM_DATA_DIR}/${TOCALLS_TXT}" DESTINATION "${CUSTOM_BINARY_DATA_DIR}")
|
||||
file(COPY "${CUSTOM_DATA_DIR}/${SYMBOLS-NEW_TXT}" DESTINATION "${CUSTOM_BINARY_DATA_DIR}")
|
||||
file(COPY "${CUSTOM_DATA_DIR}/${SYMBOLSX_TXT}" DESTINATION "${CUSTOM_BINARY_DATA_DIR}")
|
||||
|
||||
install(FILES "${CUSTOM_BINARY_DATA_DIR}/${TOCALLS_TXT}" DESTINATION ${INSTALL_DATA_DIR})
|
||||
install(FILES "${CUSTOM_BINARY_DATA_DIR}/${SYMBOLS-NEW_TXT}" DESTINATION ${INSTALL_DATA_DIR})
|
||||
install(FILES "${CUSTOM_BINARY_DATA_DIR}/${SYMBOLSX_TXT}" DESTINATION ${INSTALL_DATA_DIR})
|
|
@ -1,37 +1,55 @@
|
|||
APRS SYMBOL OVERLAY and EXTENSION TABLES in APRS 1.2 28 Aug 2014
|
||||
---------------------------------------------------------------------
|
||||
APRS SYMBOL OVERLAY and EXTENSION TABLES in APRS 1.2 17 Mar 2021
|
||||
------------------------------------------------------------------------
|
||||
|
||||
BACKGROUND: This file addresses new additions proposals (OVERLAYS)
|
||||
to the APRS symbol set after 1 October 2007. The master symbol
|
||||
document remains on the www.aprs.org/symbols/symbolsX.txt page.
|
||||
BACKGROUND: Since October 2007, overlay characters (36/symbol) are
|
||||
allowed on all symbols. This allows thousands of uniquely specified
|
||||
symbols instead of the original 188 (94 primary and 94 alternate).
|
||||
But the master symbol document, http://aprs.org/symbols/symbolsX.txt,
|
||||
only has one line per symbol. So this added overlay list below gives
|
||||
us thousands of new symbol codes.
|
||||
|
||||
17 Mar 21 Added L& for LORA Igate
|
||||
24 Jun18: Updated CAR symbols
|
||||
17 Jun18: Added several overlays for RAIL symbol
|
||||
03 Apr17: Added Methane Hazard symbol "MH"
|
||||
13 Feb17: Added Ez = Emergency Power (shelter), Cars: P> = Plugin
|
||||
S> = Solar powered. Moved Ham club C- to Buildings Ch.
|
||||
Added C- to house for combined renewables and added R%
|
||||
Renewable to power plants
|
||||
|
||||
NOTE: There was confusion with different copies of this file on
|
||||
different web pages and links. THIS file is now assumed to be the
|
||||
CORRECT one.
|
||||
18 Oct16: Added G,Y,R for Flood gauges + N for Normal.(on H2O symbol)
|
||||
Added DIGIPEATERS
|
||||
22 Mar16: Added A0 overlay circle for ALSTAR nodes and V0 for VOIP.
|
||||
Combined echolink and IRLP. P& for PSKmail node. W& for
|
||||
Wires-X (was W0 for WiresII). Ya for Yaesu C4FM repeaters
|
||||
|
||||
Update 29 Oct 2015: Reorgainized list to Alphabetical Order.
|
||||
+ Added many new Balloons (due to lost DoD radar Blimp yesterday)
|
||||
+ Confirmed D^ for Drones was already in there since 2014
|
||||
+ Added R^ type aircraft for remotely piloted
|
||||
+ Added S^ Solar Powered Aircraft
|
||||
+ Noticed all new category \= is availalbe. Had been shown ast
|
||||
APRStt, but that was changed in 2009 to overlay BOX symbols.
|
||||
|
||||
UPDATES/REVISIONS/CORRECTIONS:
|
||||
|
||||
28 Aug 14 Added numerous OpenAPRS symbols see "(new Aug 2014)"
|
||||
20 May 14 Changed Da to DSTAR (2700 of them) from Dutch Ares
|
||||
19 May 14 Added Submarine&torpedo to ships and lots of Aircraft
|
||||
search for "(new may 2014)"
|
||||
07 Oct 13 Added new overlays to ships such as Jet Ski, Js
|
||||
Added Ham Club symbol as a C overlay on House, C-
|
||||
19 Sep 11 Added T and 2 overlays for TX 1 and 2 hop IGates
|
||||
Added overlays to (;) portable, to show event types
|
||||
23 Mar 11 Added Radiation Detector (RH)
|
||||
20 Apr 10 Byonics requested (BY)
|
||||
04 Jan 10 added #A to the table (correcting earlier omission)
|
||||
12 Oct 09 Added W0 for Yaesu WIRES nodes
|
||||
09 Apr 09 Changed APRStt symbol to overlayed BOX (#A)
|
||||
21 Aug 08 Added RFID R=, Stroller B], Radios#Y, & skull&Xbones (XH)
|
||||
27 Apr 08 Added some definitions of the numbered circle #0.
|
||||
25 Mar 08 Added these new definitions of overlays:
|
||||
2014 Added numerous OpenAPRS symbol. Changed Da to DSTAR from Dutch
|
||||
ARES. Added Subs to ships and lots of Aircraft overlays.
|
||||
2013 Added ship overlay Jet Ski. Ham Club as C overlay on House, C-
|
||||
2011 Added T and 2 overlays for TX 1 and 2 hop IGates
|
||||
Added overlays to (;) Portables Added Radiation Detector (RH)
|
||||
2010 Byonics requested (BY) and added #A to the table
|
||||
2009 Added W0 for Yaesu WIRES and APRStt symbol to overlayed BOX (#A)
|
||||
2008 Added RFID R=, Babystroller B], Radio#Y, skull&Xbones XH
|
||||
|
||||
Original Alternate Symbol codes being modified for new Overlay Use:
|
||||
|
||||
DEPRICATION AND MAJOR REVISION: 25 Mar 08 Modified several Alternate
|
||||
Symbol codes for expanded Overlays. The following alternate base
|
||||
symbols were redefined so that the basic symbol could take on dozens
|
||||
of unique overlay definitions:
|
||||
|
||||
\= - Had been undefined
|
||||
\0 - Several overlays for the numbered Circle
|
||||
\A - (BOX symbol) APRStt(DTMF), RFID users, XO (OLPC)
|
||||
\' - Was Crash Site. Now expanded to be INCIDENT sites
|
||||
\% - is an overlayed Powerplant. See definitions below
|
||||
|
@ -41,16 +59,17 @@ Original Alternate Symbol codes being modified for new Overlay Use:
|
|||
\u - Overlay Trucks. "Tu" is a tanker. "Gu" is a gas truck, etc
|
||||
\< - Advisories may now have overlays
|
||||
\8 - Nodes with overlays. "G8" would be 802.11G
|
||||
\[ - \[ is wall cloud, but overlays are humans. S[ is a skier.
|
||||
\h - Buildings. \h is a Ham store, "Hh" is Home Depot, etc.
|
||||
\[ - \[ was wall cloud, but overlays are humans. S[ is a skier.
|
||||
\h - Was Ham store, Now Overlays are buildings "Hh" Home Depot, etc.
|
||||
|
||||
Previous edition was 4 Oct 2007.
|
||||
|
||||
4 Oct 2007. ORIGINAL EXPANSION to OVERLAYS ON ALL SYMBOLS
|
||||
|
||||
In April 2007, a proposal to expand the use of overlay bytes for
|
||||
the extension of the APRS symbol set was added to the draft APRS1.2
|
||||
addendum web page. The following document addresses that proposal:
|
||||
|
||||
www.aprs.org/symbols/symbols-overlays.txt
|
||||
http://aprs.org/symbols/symbols-overlays.txt
|
||||
|
||||
For details on Upgrading your symbol set, please see the background
|
||||
information on Symbols prepared by Stephen Smith, WA8LMF:
|
||||
|
@ -80,8 +99,9 @@ small subset of alternate symbols. Those original overlayable
|
|||
alternate symbols were labeled with a "#" and called "numbered"
|
||||
symbols. (UIview requires "No." in the symbols.ini file)
|
||||
|
||||
STATUS OF OVERLAYS 1 OCTOBER 2007: the APRS symbol set only had a
|
||||
few remaining unused symbol codes that had not yet been defined:
|
||||
STATUS OF OVERLAYS 1 OCTOBER 2007: the APRS symbol set was limited
|
||||
to about 94 symbols and only had a few remaining unused symbol
|
||||
codes that had not yet been defined:
|
||||
|
||||
OF THE 94 Primary Symbols. The following were available:
|
||||
10 symbols (/0 - /9) that mostly look like billiard balls now
|
||||
|
@ -93,7 +113,7 @@ OF THE 94 Alternate Symbols. The following were available:
|
|||
8 series \1 through \8 that can support 36 overlays each
|
||||
3 reserved series.
|
||||
|
||||
ADDITIONAL OVERLAY PROPOSAL: But any of the other 79 alternate
|
||||
BASIS FOR OVERLAY EXPANSION: But any of the other 79 alternate
|
||||
symbols could all have multiple (36) overlays if they can make sense
|
||||
with the existing underlying basic symbol that we have been using for
|
||||
that basic alternate symbol. That is, any new definition of a
|
||||
|
@ -114,20 +134,28 @@ letting that define a new graphic just for that combination.
|
|||
The following tables will attempt to keep track of these and
|
||||
any other useful generic applications of overlay characters.
|
||||
|
||||
AMPLIFIED some existing ALTERNATE SYMBOL Overlays: (Aug 2014)
|
||||
change Flooding #W to include Avalanche, Mudslide/Landslide
|
||||
change \' to crash & incident sites
|
||||
change \D to DEPOT family
|
||||
change overlayed car to generic with (1-9 overlays)
|
||||
Update #' name to crash & incident sites
|
||||
Update \D (was available) to DEPOT family
|
||||
change overlayed car to generic Vehicle with (1-9 overlays)
|
||||
|
||||
ADVISORIES: #< (new expansion possibilities)
|
||||
/< = motorcycle
|
||||
\< = Advisory (single gale flag)
|
||||
|
||||
AIRCRAFT
|
||||
/^ = LARGE Aircraft
|
||||
\^ = top-view originally intended to point in direction of flight
|
||||
A^ = Autonomous (2015)
|
||||
D^ = Drone (new may 2014)
|
||||
E^ = Enemy aircraft (too bad I cant use the original Hostile)
|
||||
E^ = Electric aircraft (2015)
|
||||
H^ = Hovercraft (new may 2014)
|
||||
J^ = JET (new may 2014)
|
||||
M^ = Missle (new may 2014)
|
||||
P^ = Prop (new Aug 2014)
|
||||
R^ = Remotely Piloted (new 2015)
|
||||
S^ = Solar Powered (new 2015)
|
||||
V^ = Vertical takeoff (new may 2014)
|
||||
X^ = Experimental (new Aug 2014)
|
||||
|
||||
|
@ -138,103 +166,25 @@ U$ = US dollars
|
|||
L$ = Brittish Pound
|
||||
Y$ = Japanese Yen
|
||||
|
||||
DEPOT
|
||||
/D = was originally undefined
|
||||
\D = was drizzle (moved to ' ovlyD)
|
||||
AD = Airport (new Aug 2014)
|
||||
FD = Ferry Landing (new Aug 2014)
|
||||
HD = Heloport (new Aug 2014)
|
||||
RD = Rail Depot (new Aug 2014)
|
||||
BD = Bus Depot (new Aug 2014)
|
||||
LD = LIght Rail or Subway (new Aug 2014)
|
||||
SD = Seaport Depot (new Aug 2014)
|
||||
ARRL or DIAMOND: #a
|
||||
/a = Ambulance
|
||||
Aa = ARES
|
||||
Da = DSTAR (had been ARES Dutch)
|
||||
Ga = RSGB Radio Society of Great Brittan
|
||||
Ra = RACES
|
||||
Sa = SATERN Salvation Army
|
||||
Wa = WinLink
|
||||
Ya = C4FM Yaesu repeaters
|
||||
|
||||
EMERGENCY: #!
|
||||
/! = Police/Sheriff, etc
|
||||
\! = Emergency!
|
||||
E! = ELT or EPIRB (new Aug 2014)
|
||||
V! = Volcanic Eruption or Lava (new Aug 2014)
|
||||
|
||||
POWER PLANT: #%
|
||||
/% = DX cluster <= the original primary table definition
|
||||
C% = Coal
|
||||
E% = Emergency (new Aug 2014)
|
||||
G% = Geothermal
|
||||
H% = Hydroelectric
|
||||
N% = Nuclear
|
||||
P% = Portable (new Aug 2014)
|
||||
S% = Solar
|
||||
T% = Turbine
|
||||
W% = Wind
|
||||
|
||||
GATEWAYS: #&
|
||||
/& = HF Gateway <= the original primary table definition
|
||||
I& = Igate Generic (please use more specific overlay)
|
||||
R& = Receive only IGate (do not send msgs back to RF)
|
||||
T& = TX igate with path set to 1 hop only)
|
||||
2& = TX igate with path set to 2 hops (not generally good idea)
|
||||
|
||||
INCIDENT SITES: #'
|
||||
/' = Small Aircraft (original primary symbol)
|
||||
\' = Airplane Crash Site <= the original alternate deifinition
|
||||
A' = Automobile crash site
|
||||
H' = Hazardous incident
|
||||
M' = Multi-Vehicle crash site
|
||||
P' = Pileup
|
||||
T' = Truck wreck
|
||||
|
||||
HUMAN SYMBOL: #[
|
||||
/[ = Human
|
||||
\[ = Wall Cloud (the original definition)
|
||||
B[ = Baby on board (stroller, pram etc)
|
||||
S[ = Skier * <= Recommend Special Symbol
|
||||
R[ = Runner
|
||||
H[ = Hiker
|
||||
|
||||
HOUSE: #-
|
||||
/- = House
|
||||
\- = (was HF)
|
||||
5- = 50 Hz mains power
|
||||
6- = 60 Hz mains power
|
||||
B- = Backup Battery Power
|
||||
C- = Club, as in Ham club
|
||||
E- = Emergency power
|
||||
G- = Geothermal
|
||||
H- = Hydro powered
|
||||
O- = Operator Present
|
||||
S- = Solar Powered
|
||||
W- = Wind powered
|
||||
|
||||
NUMBERED CIRCLES: #0
|
||||
E0 = Echolink Node (E0)
|
||||
I0 = IRLP repeater (I0)
|
||||
S0 = Staging Area (S0)
|
||||
W0 = WIRES (Yaesu VOIP)
|
||||
|
||||
NETWORK NODES: #8
|
||||
88 = 802.11 network node (88)
|
||||
G8 = 802.11G (G8)
|
||||
|
||||
PORTABLE SYMBOL: #;
|
||||
/; = Portable operation (tent)
|
||||
\; = Park or Picnic
|
||||
F; = Field Day
|
||||
I; = Islands on the air
|
||||
S; = Summits on the air
|
||||
W; = WOTA
|
||||
|
||||
ADVISORIES: #< (new expansion possibilities)
|
||||
/< = motorcycle
|
||||
\< = Advisory (single gale flag)
|
||||
|
||||
CARS: #> (Vehicles)
|
||||
/> = normal car (side view)
|
||||
\> = Top view and symbol POINTS in direction of travel
|
||||
#> = Reserve overlays 1-9 for numbered cars (new Aug 2014)
|
||||
E> = Electric
|
||||
H> = Hybrid
|
||||
S> = Solar powered
|
||||
V> = GM Volt
|
||||
BALLOONS and lighter than air #O (All new Oct 2015)
|
||||
/O = Original Balloon (think Ham balloon)
|
||||
\O = ROCKET (amateur)(2007)
|
||||
BO = Blimp (2015)
|
||||
MO = Manned Balloon (2015)
|
||||
TO = Teathered (2015)
|
||||
CO = Constant Pressure - Long duration (2015)
|
||||
RO = Rocket bearing Balloon (Rockoon) (2015)
|
||||
WO = World-round balloon (2018)
|
||||
|
||||
BOX SYMBOL: #A (and other system inputted symbols)
|
||||
/A = Aid station
|
||||
|
@ -250,7 +200,69 @@ DA = D-Star report
|
|||
XA = OLPC Laptop XO
|
||||
etc
|
||||
|
||||
EYEBALL and VISIBILITY #E
|
||||
BUILDINGS: #h
|
||||
/h = Hospital
|
||||
\h = Ham Store ** <= now used for HAMFESTS
|
||||
Ch = Club (ham radio)
|
||||
Eh = Electronics Store
|
||||
Fh = HamFest (new Aug 2014)
|
||||
Hh = Hardware Store etc..
|
||||
|
||||
CARS: #> (Vehicles)
|
||||
/> = normal car (side view)
|
||||
\> = Top view and symbol POINTS in direction of travel
|
||||
#> = Reserve overlays 1-9 for numbered cars (new Aug 2014)
|
||||
3> = Model 3 (Tesla)
|
||||
B> = BEV - Battery EV(was E for electric)
|
||||
D> = DIY - Do it yourself
|
||||
E> = Ethanol (was electric)
|
||||
F> = Fuelcell or hydrogen
|
||||
H> = Hybrid
|
||||
L> = Leaf
|
||||
P> = PHEV - Plugin-hybrid
|
||||
S> = Solar powered
|
||||
T> = Tesla (temporary)
|
||||
V> = Volt (temporary)
|
||||
X> = Model X
|
||||
|
||||
CIVIL DEFENSE or TRIANGLE: #c
|
||||
/c = Incident Command Post
|
||||
\c = Civil Defense
|
||||
Dc = Decontamination (new Aug 2014)
|
||||
Rc = RACES
|
||||
Sc = SATERN mobile canteen
|
||||
|
||||
DEPOT
|
||||
/D = was originally undefined
|
||||
\D = was drizzle (moved to ' ovlyD)
|
||||
AD = Airport (new Aug 2014)
|
||||
FD = Ferry Landing (new Aug 2014)
|
||||
HD = Heloport (new Aug 2014)
|
||||
RD = Rail Depot (new Aug 2014)
|
||||
BD = Bus Depot (new Aug 2014)
|
||||
LD = LIght Rail or Subway (new Aug 2014)
|
||||
SD = Seaport Depot (new Aug 2014)
|
||||
|
||||
DIGIPEATERS
|
||||
/# - Generic digipeater
|
||||
1# - WIDE1-1 digipeater
|
||||
A# - Alternate input (i.e. 144.990MHz) digipeater
|
||||
E# - Emergency powered (assumed full normal digi)
|
||||
I# - I-gate equipped digipeater
|
||||
L# - WIDEn-N with path length trapping
|
||||
P# - PacComm
|
||||
S# - SSn-N digipeater (includes WIDEn-N)
|
||||
X# - eXperimental digipeater
|
||||
V# - Viscous https://github.com/PhirePhly/aprx/blob/master/ViscousDigipeater.README
|
||||
W# - WIDEn-N, SSn-N and Trapping
|
||||
|
||||
EMERGENCY: #!
|
||||
/! = Police/Sheriff, etc
|
||||
\! = Emergency!
|
||||
E! = ELT or EPIRB (new Aug 2014)
|
||||
V! = Volcanic Eruption or Lava (new Aug 2014)
|
||||
|
||||
EYEBALL (EVENT) and VISIBILITY #E
|
||||
/E = Eyeball for special live events
|
||||
\E = (existing smoke) the symbol with no overlay
|
||||
HE = (H overlay) Haze
|
||||
|
@ -259,13 +271,113 @@ BE = (B overlay) Blowing Snow was \B
|
|||
DE = (D overlay) blowing Dust or sand was \b
|
||||
FE = (F overlay) Fog was \{
|
||||
|
||||
GATEWAYS: #&
|
||||
/& = HF Gateway <= the original primary table definition
|
||||
I& = Igate Generic (please use more specific overlay)
|
||||
L& - Lora Igate
|
||||
R& = Receive only IGate (do not send msgs back to RF)
|
||||
P& = PSKmail node
|
||||
T& = TX igate with path set to 1 hop only)
|
||||
W& = WIRES-X as opposed to W0 for WiresII
|
||||
2& = TX igate with path set to 2 hops (not generally good idea)
|
||||
|
||||
GPS devices: #\
|
||||
/\ = Triangle DF primary symbol
|
||||
\\ = was undefined alternate symbol
|
||||
A\ = Avmap G5 * <= Recommend special symbol
|
||||
|
||||
HAZARDS: #H
|
||||
/H = hotel
|
||||
\H = Haze
|
||||
MH = Methane Hazard (new Apr 2017)
|
||||
RH = Radiation detector (new mar 2011)
|
||||
WH = Hazardous Waste
|
||||
XH = Skull&Crossbones
|
||||
|
||||
HUMAN SYMBOL: #[
|
||||
/[ = Human
|
||||
\[ = Wall Cloud (the original definition)
|
||||
B[ = Baby on board (stroller, pram etc)
|
||||
S[ = Skier * <= Recommend Special Symbol
|
||||
R[ = Runner
|
||||
H[ = Hiker
|
||||
|
||||
HOUSE: #-
|
||||
/- = House
|
||||
\- = (was HF)
|
||||
5- = 50 Hz if non standard
|
||||
6- = 60 Hz if non standard
|
||||
B- = Battery or off grid
|
||||
C- = Combined alternatives
|
||||
E- = Emergency power (grid down)
|
||||
G- = Geothermal
|
||||
H- = Hydro powered
|
||||
O- = Operator Present
|
||||
S- = Solar Power
|
||||
W- = Wind power
|
||||
|
||||
INCIDENT SITES: #'
|
||||
/' = Small Aircraft (original primary symbol)
|
||||
\' = Airplane Crash Site <= the original alternate deifinition
|
||||
A' = Automobile crash site
|
||||
H' = Hazardous incident
|
||||
M' = Multi-Vehicle crash site
|
||||
P' = Pileup
|
||||
T' = Truck wreck
|
||||
|
||||
NUMBERED CIRCLES: #0
|
||||
A0 = Allstar Node (A0)
|
||||
E0 = Echolink Node (E0)
|
||||
I0 = IRLP repeater (I0)
|
||||
S0 = Staging Area (S0)
|
||||
V0 = Echolink and IRLP (VOIP)
|
||||
W0 = WIRES (Yaesu VOIP)
|
||||
|
||||
NETWORK NODES: #8
|
||||
88 = 802.11 network node (88)
|
||||
G8 = 802.11G (G8)
|
||||
|
||||
PORTABLE SYMBOL: #;
|
||||
/; = Portable operation (tent)
|
||||
\; = Park or Picnic
|
||||
F; = Field Day
|
||||
I; = Islands on the air
|
||||
S; = Summits on the air
|
||||
W; = WOTA
|
||||
|
||||
POWER and ENERGY: #%
|
||||
/% = DX cluster <= the original primary table definition
|
||||
C% = Coal
|
||||
E% = Emergency (new Aug 2014)
|
||||
G% = Gas Turbine
|
||||
H% = Hydroelectric
|
||||
N% = Nuclear
|
||||
P% = Portable (new Aug 2014)
|
||||
R% = Renewable (hydrogen etc fuels)
|
||||
S% = Solar
|
||||
T% = Thermal (geo)
|
||||
W% = Wind
|
||||
|
||||
RAIL Symbols: #=
|
||||
/= = generic train (use steam engine shape for quick recognition)
|
||||
\= = tbd (use same symbol for now)
|
||||
B= = Bus-rail/trolley/streetcar/guiderail
|
||||
C= = Commuter
|
||||
D= = Diesel
|
||||
E= = Electric
|
||||
F= = Freight
|
||||
G= = Gondola
|
||||
H= = High Speed Rail (& Hyperloop?)
|
||||
I= = Inclined Rail
|
||||
L= = eLevated
|
||||
M= = Monorail
|
||||
P= = Passenger
|
||||
S= = Steam
|
||||
T= = Terminal (station)
|
||||
U= = sUbway (& Hyperloop?)
|
||||
X= = eXcursion
|
||||
|
||||
|
||||
RESTAURANTS: #R
|
||||
\R = Restaurant (generic)
|
||||
7R = 7/11
|
||||
|
@ -282,35 +394,6 @@ IY = Icom
|
|||
KY = Kenwood * <= Recommend special symbol
|
||||
YY = Yaesu/Standard* <= Recommend special symbol
|
||||
|
||||
GPS devices: #\
|
||||
/\ = Triangle DF primary symbol
|
||||
\\ = was undefined alternate symbol
|
||||
A\ = Avmap G5 * <= Recommend special symbol
|
||||
|
||||
ARRL or DIAMOND: #a
|
||||
/a = Ambulance
|
||||
Aa = ARES
|
||||
Da = DSTAR (had been ARES Dutch)
|
||||
Ga = RSGB Radio Society of Great Brittan
|
||||
Ra = RACES
|
||||
Sa = SATERN Salvation Army
|
||||
Wa = WinLink
|
||||
|
||||
CIVIL DEFENSE or TRIANGLE: #c
|
||||
/c = Incident Command Post
|
||||
\c = Civil Defense
|
||||
Dc = Decontamination (new Aug 2014)
|
||||
Rc = RACES
|
||||
Sc = SATERN mobile canteen
|
||||
|
||||
BUILDINGS: #h
|
||||
/h = Hospital
|
||||
\h = Ham Store ** <= now used for HAMFESTS
|
||||
Fh = HamFest (new Aug 2014)
|
||||
Hh = Home Dept etc..
|
||||
Mh = Morgue
|
||||
Ch = Clinic
|
||||
Th = Triage
|
||||
|
||||
SPECIAL VEHICLES: #k
|
||||
/k = truck
|
||||
|
@ -318,6 +401,15 @@ SPECIAL VEHICLES: #k
|
|||
4k = 4x4
|
||||
Ak = ATV (all terrain vehicle)
|
||||
|
||||
SHELTERS: #z
|
||||
/z = was available
|
||||
\z = overlayed shelter
|
||||
Cz = Clinic (new Aug 2014)
|
||||
Ez = Emergency Power
|
||||
Gz = Government building (new Aug 2014)
|
||||
Mz = Morgue (new Aug 2014)
|
||||
Tz = Triage (new Aug 2014)
|
||||
|
||||
SHIPS: #s
|
||||
/s = Power boat (ship) side view
|
||||
\s = Overlay Boat (Top view)
|
||||
|
@ -341,17 +433,28 @@ Ws = Wing-in-Ground effect (or Hovercraft)
|
|||
Xs = Passenger (paX)(ferry)
|
||||
Ys = Sailing (large ship)
|
||||
|
||||
|
||||
TRUCKS: #u
|
||||
/u = Truck (18 wheeler)
|
||||
\u = truck with overlay
|
||||
Bu = Buldozer/construction (new Aug 2014)
|
||||
Bu = Buldozer/construction/Backhoe (new Aug 2014)
|
||||
Gu = Gas
|
||||
Pu = Plow or SnowPlow (new Aug 2014)
|
||||
Tu = Tanker
|
||||
Cu = Chlorine Tanker
|
||||
Hu = Hazardous
|
||||
|
||||
WATER #w
|
||||
/w = Water Station or other H2O
|
||||
\w = flooding (or Avalanche/slides)
|
||||
Aw = Avalanche
|
||||
Gw = Green Flood Gauge
|
||||
Mw = Mud slide
|
||||
Nw = Normal flood gauge (blue)
|
||||
Rw = Red flood gauge
|
||||
Sw = Snow Blockage
|
||||
Yw = Yellow flood gauge
|
||||
|
||||
|
||||
|
||||
Anyone can use any overlay on any of the overlayable symbols for any
|
||||
special purpose. We are not trying to document all possible such
|
|
@ -1,4 +1,4 @@
|
|||
APRS SYMBOLS (Icons) 28 Aug 2014
|
||||
APRS SYMBOLS (Icons) 25 Nov 2015
|
||||
-----------------------------------------------------------------------
|
||||
WB4APR
|
||||
|
||||
|
@ -28,6 +28,9 @@ http://aprs.org/symbols/symbols-background.txt
|
|||
|
||||
UPDATE CHRONOLOGY:
|
||||
|
||||
25 Nov 15: Found APRStt symbol poorly documented Was shown as "\=".
|
||||
But has been \A BOX symbol with variety of overlays
|
||||
23 Jun 15: Changed Aircraft to SSID-11 and Human to SSID-7
|
||||
28 Aug 14: Added notation on newly availble BASE codes (begun in 2007)
|
||||
Old WX versions of these: Bb{*:DFegJp were moved to ovlays
|
||||
Expanded #w Flooding to include Avalanches, Mud/Landslides
|
||||
|
@ -178,7 +181,7 @@ for the stand-alone trackers described above.
|
|||
/$ BE PHONE \$ OEO Bank or ATM (green box)
|
||||
/% BF DX CLUSTER \% OFO Power Plant with overlay
|
||||
/& BG HF GATEway \& OG# I=Igte R=RX T=1hopTX 2=2hopTX
|
||||
/' BH Small AIRCRAFT (SSID = 7) \' OHO Crash (& now Incident sites)
|
||||
/' BH Small AIRCRAFT (SSID-11) \' OHO Crash (& now Incident sites)
|
||||
/( BI Mobile Satellite Station \( OIO CLOUDY (other clouds w ovrly)
|
||||
/) BJ Wheelchair (handicapped) \) OJO Firenet MEO, MODIS Earth Obs.
|
||||
/* BK SnowMobile \* OK AVAIL (SNOW moved to ` ovly S)
|
||||
|
@ -203,9 +206,9 @@ for the stand-alone trackers described above.
|
|||
/9 P9 TBD (as mobiles at events)\9 A9 Gas Station (blue pump)
|
||||
/: MR FIRE \: NR AVAIL (Hail ==> ` ovly H)
|
||||
/; MS Campground (Portable ops) \; NSO Park/Picnic + overlay events
|
||||
/< MT Motorcycle (SSID =10) \< NTO ADVISORY (one WX flag)
|
||||
/= MU RAILROAD ENGINE \= NUO APRStt Touchtone (DTMF users)
|
||||
/> MV CAR (SSID = 9) \> NV# OVERLAYED CARs & Vehicles
|
||||
/< MT Motorcycle (SSID-10) \< NTO ADVISORY (one WX flag)
|
||||
/= MU RAILROAD ENGINE \= NUO avail. symbol overlay group
|
||||
/> MV CAR (SSID-9) \> NV# OVERLAYED CARs & Vehicles
|
||||
/? MW SERVER for Files \? NW INFO Kiosk (Blue box with ?)
|
||||
/@ MX HC FUTURE predict (dot) \@ NX HURICANE/Trop-Storm
|
||||
/A PA Aid Station \A AA# overlayBOX DTMF & RFID & XO
|
||||
|
@ -222,19 +225,19 @@ for the stand-alone trackers described above.
|
|||
/L PL PC user (Jan 03) \L AL Lighthouse
|
||||
/M PM MacAPRS \M AMO MARS (A=Army,N=Navy,F=AF)
|
||||
/N PN NTS Station \N AN Navigation Buoy
|
||||
/O PO BALLOON (SSID =11) \O AO Overlay Balloon (Rocket = \O)
|
||||
/O PO BALLOON (SSID-11) \O AO Overlay Balloon (Rocket = \O)
|
||||
/P PP Police \P AP Parking
|
||||
/Q PQ TBD \Q AQ QUAKE
|
||||
/R PR REC. VEHICLE (SSID =13) \R ARO Restaurant
|
||||
/R PR REC. VEHICLE (SSID-13) \R ARO Restaurant
|
||||
/S PS SHUTTLE \S AS Satellite/Pacsat
|
||||
/T PT SSTV \T AT Thunderstorm
|
||||
/U PU BUS (SSID = 2) \U AU SUNNY
|
||||
/U PU BUS (SSID-2) \U AU SUNNY
|
||||
/V PV ATV \V AV VORTAC Nav Aid
|
||||
/W PW National WX Service Site \W AW# # NWS site (NWS options)
|
||||
/X PX HELO (SSID = 6) \X AX Pharmacy Rx (Apothicary)
|
||||
/Y PY YACHT (sail) (SSID = 5) \Y AYO Radios and devices
|
||||
/X PX HELO (SSID-6) \X AX Pharmacy Rx (Apothicary)
|
||||
/Y PY YACHT (sail) (SSID-5) \Y AYO Radios and devices
|
||||
/Z PZ WinAPRS \Z AZ AVAIL
|
||||
/[ HS Human/Person (HT) \[ DSO W.Cloud (& humans w Ovrly)
|
||||
/[ HS Human/Person (SSID-7) \[ DSO W.Cloud (& humans w Ovrly)
|
||||
/\ HT TRIANGLE(DF station) \\ DTO New overlayable GPS symbol
|
||||
/] HU MAIL/PostOffice(was PBBS) \] DU AVAIL
|
||||
/^ HV LARGE AIRCRAFT \^ DV# other Aircraft ovrlys (2014)
|
||||
|
@ -243,17 +246,17 @@ for the stand-alone trackers described above.
|
|||
|
||||
/$ XYZ LOWER CASE SYMBOL TABLE \$ XYZ SECONDARY SYMBOL TABLE (\)
|
||||
-- --- ------------------------ -- --- --------------------------
|
||||
/a LA AMBULANCE (SSID = 1) \a SA#O ARRL,ARES,WinLINK,Dstar, etc
|
||||
/b LB BIKE (SSID = 4) \b SB AVAIL(Blwng Dst/Snd => E ovly)
|
||||
/a LA AMBULANCE (SSID-1) \a SA#O ARRL,ARES,WinLINK,Dstar, etc
|
||||
/b LB BIKE (SSID-4) \b SB AVAIL(Blwng Dst/Snd => E ovly)
|
||||
/c LC Incident Command Post \c SC#O CD triangle RACES/SATERN/etc
|
||||
/d LD Fire dept \d SD DX spot by callsign
|
||||
/e LE HORSE (equestrian) \e SE Sleet (& future ovrly codes)
|
||||
/f LF FIRE TRUCK (SSID = 3) \f SF Funnel Cloud
|
||||
/f LF FIRE TRUCK (SSID-3) \f SF Funnel Cloud
|
||||
/g LG Glider \g SG Gale Flags
|
||||
/h LH HOSPITAL \h SHO Store. or HAMFST Hh=HAM store
|
||||
/i LI IOTA (islands on the air) \i SI# BOX or points of Interest
|
||||
/j LJ JEEP (SSID-12) \j SJ WorkZone (Steam Shovel)
|
||||
/k LK TRUCK (SSID = 14) \k SKO Special Vehicle SUV,ATV,4x4
|
||||
/k LK TRUCK (SSID-14) \k SKO Special Vehicle SUV,ATV,4x4
|
||||
/l LL Laptop (Jan 03) (Feb 07) \l SL Areas (box,circles,etc)
|
||||
/m LM Mic-E Repeater \m SM Value Sign (3 digit display)
|
||||
/n LN Node (black bulls-eye) \n SN# OVERLAY TRIANGLE
|
||||
|
@ -264,7 +267,7 @@ for the stand-alone trackers described above.
|
|||
/s LS SHIP (pwr boat) (SSID-8) \s SS# OVERLAY SHIP/boats
|
||||
/t LT TRUCK STOP \t ST Tornado
|
||||
/u LU TRUCK (18 wheeler) \u SU# OVERLAYED TRUCK
|
||||
/v LV VAN (SSID = 15) \v SV# OVERLAYED Van
|
||||
/v LV VAN (SSID-15) \v SV# OVERLAYED Van
|
||||
/w LW WATER station \w SWO Flooding (Avalanches/Slides)
|
||||
/x LX xAPRS (Unix) \x SX Wreck or Obstruction ->X<-
|
||||
/y LY YAGI @ QTH \y SY Skywarn
|
|
@ -1,35 +1,40 @@
|
|||
APRS TO-CALL VERSION NUMBERS 27 Apr 2015
|
||||
-------------------------------------------------------------------
|
||||
WB4APR
|
||||
27 Apr 15 added APZMAJ for Martyn M1MAJ DeLorme inReach Tracker
|
||||
21 Apr 15 added APB2MF & APR2MF DL2MF - MF2APRS Radiosonde
|
||||
06 Apr 15 added APAVT5 SainSonic AP510 - a 1watt tracker
|
||||
13 Mar 14 added APECAN Pecan Pico APRS Balloon Tracker
|
||||
02 Sep 14 added APSTMx W7QO's Balloon trackers
|
||||
21 Aug 14 added APSMSx Paul Defrusne's SMS gateway
|
||||
11 Aug 14 added APCWP8 John GM7HHB, WinphoneAPRS
|
||||
18 Dec 13 added APZWKR GM1WKR NetSked application
|
||||
22 Oct 13 added APFIxx APRS.FI OH7LZB, Hessu
|
||||
23 Aug 13 added APOxxx OSCAR satellites for AMSAT-LU by LU9DO
|
||||
22 Feb 13 added APNWxx SQ3FYK.com & SQ3PLX http://microsat.com.pl/
|
||||
and APMIxx SQ3PLX http://microsat.com.pl/
|
||||
29 Jan 13 added APICxx for HA9MCQ Pic IGate
|
||||
23 Jan 13 added APWAxx APRSISCE Android version
|
||||
18 Jan 13 added APDGxx,APDHxx,APDOxx,APDDxx,APDKxx,APD4xx for Dstar
|
||||
13 Jan 13 added APLMxx WA0TQG transceiver controller
|
||||
17 Dec 12 added APAMxx Altus Metrum GPS trackers
|
||||
03 Dec 12 added APUDRx NW Digital Radio's UDR (APRS/Dstar)
|
||||
03 Nov 12 added APHAXn SM2APRS by PY2UEP
|
||||
17 Sep 12 added APSCxx aprsc APRS-IS core server (OH7LZB, OH2MQK)
|
||||
12 Sep 12 added APSARx for ZL4FOX's SARTRACK
|
||||
02 Jul 12 added APDGxx D-Star Gateways by G4KLX
|
||||
28 Jun 12 added APDInn DIXPRS - Bela, HA5DI
|
||||
27 jun 12 added APMGxx MiniGate - Alex, AB0TJ
|
||||
17 Feb 12 added APJYnn KA2DDO yet another APRS system
|
||||
20 Jan 12 added APDSXX SP9UOB for dsDigi and ds-tracker
|
||||
APBPQx John G8BPQ Digipeater/IGate
|
||||
APLQRU Charlie - QRU Server
|
||||
11 Jan 12 added APYTxx for YagTracker and updated Yaesu APY008/350
|
||||
<title>
|
||||
APRS TO-CALL VERSION NUMBERS 14 Dec 2021
|
||||
---------------------------------------------------------------------
|
||||
WB4APR
|
||||
</title>
|
||||
<version_notes>
|
||||
07 Jun 23 Added APK005 for Kenwood TH-D75
|
||||
14 Dec 21 Added APATAR ATA-R APRS Digipeater by TA7W/OH2UDS and TA6AEU
|
||||
26 Sep 21 Added APRRDZ EPS32 https://github.com/dl9rdz/rdz_ttgo_sonde
|
||||
18 Sep 21 Added APCSS for AMSAT Cubesat Simulator https://cubesatsim.org
|
||||
16 Sep 21 Added APY05D for Yaesu FT5D series
|
||||
04 Sep 21 APLOxx LoRa KISS TNC/Tracker https://github.com/SQ9MDD/TTGO-T-Beam-LoRa-APRS
|
||||
24 Aug 21 Added APLSxx SARIMESH http://www.sarimesh.net
|
||||
22 Aug 21 Added APE2Ax for VA3NNW's Email-2-APRS ap
|
||||
30 Jun 21 Added APCNxx for carNET by DG5OAW
|
||||
14 Jun 21 Added APN2xx for NOSaprs JNOS 2.0 - VE4KLM
|
||||
24 Apr 21 Added APMPAD for DF1JSL's WXBot clone and extension
|
||||
20 Apr 21 Added APLCxx for APRScube by DL3DCW
|
||||
19 Apr 21 Added APVMxx for DRCC-DVM Voice (Digital Radio China Club)
|
||||
13 Apr 21 Added APIxxx for all Dstar ICOMS (APRS via DPRS)
|
||||
23 MAr 20 Added APW9xx For 9A9Y Weather Tracker
|
||||
16 Feb 21 Added API970 for I com 9700
|
||||
|
||||
2020 Added APHBLx,APIZCI,APLGxx,APLTxx,APNVxx,APY300,APESPG,APESPW
|
||||
APGDTx,APOSWx,APOSBx,APBT62,APCLUB,APMQxx
|
||||
2019 Added APTPNx,APJ8xx,APBSDx,APNKMX,APAT51,APMGxx,APTCMA,
|
||||
APATxx,APQTHx,APLIGx
|
||||
2018 added APRARX,APELKx,APGBLN,APBKxx,APERSx,APTCHE
|
||||
2017 Added APHWxx,APDVxx,APPICO,APBMxx,APP6xx,APTAxx,APOCSG,APCSMS,
|
||||
APPMxx,APOFF,APDTMF,APRSON,APDIGI,APSAT,APTBxx,APIExx,
|
||||
APSFxx
|
||||
2016 added APYSxx,APINxx,APNICx,APTKPT,APK004,APFPRS,APCDS0,APDNOx
|
||||
2015 Added APSTPO,APAND1,APDRxx,APZ247,APHTxx,APMTxx,APZMAJ
|
||||
APB2MF,APR2MF,APAVT5
|
||||
|
||||
</version_notes>
|
||||
<description>
|
||||
|
||||
In APRS, the AX.25 Destination address is not used for packet
|
||||
routing as is normally done in AX.25. So APRS uses it for two
|
||||
|
@ -40,6 +45,13 @@ bytes of the field are available to indicate the software version
|
|||
number or application. The following applications have requested
|
||||
a TOCALL number series:
|
||||
|
||||
Authors with similar alphabetic requirements are encouraged to share
|
||||
their address space with other software. Work out agreements amongst
|
||||
yourselves and keep me informed.
|
||||
|
||||
</description>
|
||||
<tocalls>
|
||||
|
||||
APn 3rd digit is a number
|
||||
AP1WWX TAPR T-238+ WX station
|
||||
AP1MAJ Martyn M1MAJ DeLorme inReach Tracker
|
||||
|
@ -52,20 +64,32 @@ a TOCALL number series:
|
|||
APALxx Alinco DR-620/635 internal TNC digis. "Hachi" ,JF1AJE
|
||||
APAXxx AFilterX.
|
||||
APAHxx AHub
|
||||
APAND1 APRSdroid (replaced by APDRxx
|
||||
APAND1 APRSdroid (pre-release) http://aprsdroid.org/
|
||||
APAMxx Altus Metrum GPS trackers
|
||||
APATAR ATA-R APRS Digipeater by TA7W/OH2UDS and TA6AEU
|
||||
APAT8x for Anytone. 81 for 878 HT
|
||||
APAT51 for Anytone AT-D578UV APRS mobile radio
|
||||
APAVT5 SainSonic AP510 which is a 1watt tracker
|
||||
APAWxx AGWPE
|
||||
APB APBxxx Beacons or Rabbit TCPIP micros?
|
||||
APB2MF DL2MF - MF2APRS Radiosonde for balloons
|
||||
APBLxx BigRedBee BeeLine
|
||||
APBLO MOdel Rocketry K7RKT
|
||||
APBPQx John G8BPQ Digipeater/IGate
|
||||
APBKxx PY5BK Bravo Tracker in Brazil
|
||||
APBPQx John G8BPQ Digipeater/IGate
|
||||
APBMxx BrandMeister DMR Server for R3ABM
|
||||
APBSDx HamBSD https://hambsd.org/
|
||||
APBT62 BTech DMR 6x2
|
||||
APC APCxxx Cellular applications
|
||||
APCBBx for VE7UDP Blackberry Applications
|
||||
APCBBx VE7UDP Blackberry Applications
|
||||
APCDS0 Leon Lessing ZS6LMG's cell tracker
|
||||
APCLEY EYTraker GPRS/GSM tracker by ZS6EY
|
||||
APCLWX EYWeather GPRS/GSM WX station by ZS6EY
|
||||
APCLEZ Telit EZ10 GSM application ZS6CEY
|
||||
APCLUB Brazil APRS network
|
||||
APCLWX EYWeather GPRS/GSM WX station by ZS6EY
|
||||
APCNxx for carNET by DG5OAW
|
||||
APCSMS for Cosmos (used for sending commands @USNA)
|
||||
APCSS for AMSAT cubesats https://cubesatsim.org
|
||||
APCWP8 John GM7HHB, WinphoneAPRS
|
||||
APCYxx Cybiko applications
|
||||
APD APD4xx UP4DAR platform
|
||||
|
@ -74,66 +98,121 @@ a TOCALL number series:
|
|||
APDGxx D-Star Gateways by G4KLX ircDDB
|
||||
APDHxx WinDV (DUTCH*Star DV Node for Windows)
|
||||
APDInn DIXPRS - Bela, HA5DI
|
||||
APDIGI Used by PSAT2 to indicate the digi is ON
|
||||
APDIGI digi ON for PSAT2 and QIKCOM-2
|
||||
APDKxx KI4LKF g2_ircddb Dstar gateway software
|
||||
APDNOx APRSduino by DO3SWW
|
||||
APDOxx ON8JL Standalone DStar Node
|
||||
APDPRS D-Star originated posits
|
||||
APDRxx APrsDRoid replaces old APAND1.
|
||||
APDRxx APRSdroid Android App http://aprsdroid.org/
|
||||
APDSXX SP9UOB for dsDigi and ds-tracker
|
||||
APDTxx APRStouch Tone (DTMF)
|
||||
APDTMF digi off mode on QIKCOM2 and DTMF ON
|
||||
APDUxx U2APRS by JA7UDE
|
||||
APDVxx OE6PLD's SSTV with APRS status exchange
|
||||
APDWxx DireWolf, WB2OSZ
|
||||
APE APExxx Telemetry devices
|
||||
APE2Ax VA3NNW's Email-2-APRS ap
|
||||
APECAN Pecan Pico APRS Balloon Tracker
|
||||
APELKx WB8ELK balloons
|
||||
APERXQ Experimental tracker by PE1RXQ
|
||||
APERSx Runner tracking by Jason,KG7YKZ
|
||||
APESPG ESP SmartBeacon APRS-IS Client
|
||||
APESPW ESP Weather Station APRS-IS Client
|
||||
APF APFxxx Firenet
|
||||
APFGxx Flood Gage (KP4DJT)
|
||||
APFIxx for APRS.FI OH7LZB, Hessu
|
||||
APFPRS for FreeDV by Jeroen PE1RXQ
|
||||
APG APGxxx Gates, etc
|
||||
APGOxx for AA3NJ PDA application
|
||||
APGBLN for NW5W's GoBalloon
|
||||
APGDTx for VK4FAST's Graphic Data Terminal
|
||||
APH APHKxx for LA1BR tracker/digipeater
|
||||
APHAXn SM2APRS by PY2UEP
|
||||
API APICQx for ICQ
|
||||
APICxx for HA9MCQ Pic IGate
|
||||
APJ APJAxx JavAPRS
|
||||
APHBLx for DMR Gateway by Eric - KF7EEL
|
||||
APHTxx HMTracker by IU0AAC
|
||||
APHWxx for use in "HamWAN
|
||||
API API282 for ICOM IC-2820
|
||||
API31 for ICOM ID-31
|
||||
API410 for ICOM ID-4100
|
||||
API51 for ICOM ID-51
|
||||
API510 for ICOM ID-5100
|
||||
API710 for ICOM IC-7100
|
||||
API80 for ICOM IC-80
|
||||
API880 for ICOM ID-880
|
||||
API910 for ICOM IC-9100
|
||||
API92 for ICOM IC-92
|
||||
API970 for ICOM 9700
|
||||
APICQx for ICQ
|
||||
APICxx HA9MCQ's Pic IGate
|
||||
APIExx W7KMV's PiAPRS system
|
||||
APINxx PinPoint by AB0WV
|
||||
APIZCI hymTR IZCI Tracker by TA7W/OH2UDS and TA6AEU
|
||||
APJ APJ8xx Jordan / KN4CRD JS8Call application
|
||||
APJAxx JavAPRS
|
||||
APJExx JeAPRS
|
||||
APJIxx jAPRSIgate
|
||||
APJSxx javAPRSSrvr
|
||||
APJYnn KA2DDO Yet another APRS system
|
||||
APK APK0xx Kenwood TH-D7's
|
||||
APK003 Kenwood TH-D72
|
||||
APK004 Kenwood TH-D74
|
||||
APK005 Kenwood TH-D75
|
||||
APK1xx Kenwood D700's
|
||||
APK102 Kenwood D710
|
||||
APKRAM KRAMstuff.com - Mark. G7LEU
|
||||
APL APLQRU Charlie - QRU Server
|
||||
APL APLCxx APRScube by DL3DCW
|
||||
APLGxx LoRa Gateway/Digipeater OE5BPA
|
||||
APLIGx LightAPRS - TA2MUN and TA9OHC
|
||||
APLOxx LoRa KISS TNC/Tracker
|
||||
APLQRU Charlie - QRU Server
|
||||
APLMxx WA0TQG transceiver controller
|
||||
APLSxx SARIMESH ( http://www.sarimesh.net )
|
||||
APLTxx LoRa Tracker - OE5BPA
|
||||
APM APMxxx MacAPRS,
|
||||
APMGxx MiniGate - Alex, AB0TJ
|
||||
APMGxx PiCrumbs and MiniGate - Alex, AB0TJ
|
||||
APMIxx SQ3PLX http://microsat.com.pl/
|
||||
APMPAD DF1JSL's WXBot clone and extension
|
||||
APMQxx Ham Radio of Things WB2OSZ
|
||||
APMTxx LZ1PPL for tracker
|
||||
APN APNxxx Network nodes, digis, etc
|
||||
APN2xx NOSaprs for JNOS 2.0 - VE4KLM
|
||||
APN3xx Kantronics KPC-3 rom versions
|
||||
APN9xx Kantronics KPC-9612 Roms
|
||||
APNAxx WB6ZSU's APRServe
|
||||
APNDxx DIGI_NED
|
||||
APNICx SQ5EKU http://sq5eku.blogspot.com/
|
||||
APNK01 Kenwood D700 (APK101) type
|
||||
APNK80 KAM version 8.0
|
||||
APNKMP KAM+
|
||||
APNKMX KAM-XL
|
||||
APNMxx MJF TNC roms
|
||||
APNPxx Paccom TNC roms
|
||||
APNTxx SV2AGW's TNT tnc as a digi
|
||||
APNUxx UIdigi
|
||||
APNVxx SQ8L's VP digi and Nodes
|
||||
APNXxx TNC-X (K6DBG)
|
||||
APNWxx SQ3FYK.com WX/Digi and SQ3PLX http://microsat.com.pl/
|
||||
APO APRSpoint
|
||||
APOFF Used by PSAT and PSAT2 to indicate the digi is OFF
|
||||
APOLUx for OSCAR satellites for AMSAT-LU by LU9DO
|
||||
APOAxx OpenAPRS - Greg Carter
|
||||
APOTxx Open Track
|
||||
APOCSG For N0AGI's APRS to POCSAG project
|
||||
APOD1w Open Track with 1 wire WX
|
||||
APOSBx openSPOT3 by HA2NON at sharkrf.com
|
||||
APOSWx openSPOT2
|
||||
APOTxx Open Track
|
||||
APOU2k Open Track for Ultimeter
|
||||
APOZxx www.KissOZ.dk Tracker. OZ1EKD and OZ7HVO
|
||||
APP APPTxx KetaiTracker by JF6LZE, Takeki (msg capable)
|
||||
APP APP6xx for APRSlib
|
||||
APPICx DB1NTO' PicoAPRS
|
||||
APPMxx DL1MX's RTL-SDR pytohon Igate
|
||||
APPTxx KetaiTracker by JF6LZE, Takeki (msg capable)
|
||||
APQ APQxxx Earthquake data
|
||||
APQTHx W8WJB's QTH.app
|
||||
APR APR8xx APRSdos versions 800+
|
||||
APR2MF DL2MF - MF2APRS Radiosonde WX reporting
|
||||
APRARX VK5QI's radiosonde tracking
|
||||
APRDxx APRSdata, APRSdr
|
||||
APRGxx aprsg igate software, OH2GVE
|
||||
APRHH2 HamHud 2
|
||||
|
@ -141,23 +220,32 @@ a TOCALL number series:
|
|||
APRNOW W5GGW ipad application
|
||||
APRRTx RPC electronics
|
||||
APRS Generic, (obsolete. Digis should use APNxxx instead)
|
||||
APRSON Used by PSAT to indicate the DIGI is ON
|
||||
APRXxx >40 APRSmax
|
||||
APRXxx <39 for OH2MQK's RX-igate
|
||||
APRXxx <39 for OH2MQK's igate
|
||||
APRTLM used in MIM's and Mic-lites, etc
|
||||
APRtfc APRStraffic
|
||||
APRSTx APRStt (Touch tone)
|
||||
APS APSxxx APRS+SA, etc
|
||||
APSARx ZL4FOX's SARTRACK
|
||||
APSAT digi ON for QIKCOM-1
|
||||
APSCxx aprsc APRS-IS core server (OH7LZB, OH2MQK)
|
||||
APSFxx F5OPV embedded devices - was APZ40
|
||||
APSK63 APRS Messenger -over-PSK63
|
||||
APSK25 APRS Messenger GMSK-250
|
||||
APSMSx Paul Defrusne's SMS gateway
|
||||
APSMSx Paul Dufresne's SMSGTE - SMS Gateway
|
||||
APSTMx for W7QO's Balloon trackers
|
||||
APT APTIGR TigerTrack
|
||||
APTTxx Tiny Track
|
||||
APT2xx Tiny Track II
|
||||
APSTPO for N0AGI Satellite Tracking and Operations
|
||||
APT APT2xx Tiny Track II
|
||||
APT3xx Tiny Track III
|
||||
APTAxx K4ATM's tiny track
|
||||
APTBxx TinyAPRS by BG5HHP Was APTAxx till Sep 2017
|
||||
APTCHE PU3IKE in Brazil TcheTracker/Tcheduino
|
||||
APTCMA CAPI tracker - PU1CMA Brazil
|
||||
APTIGR TigerTrack
|
||||
APTKPT TrackPoint N0LP
|
||||
APTPNx TARPN Packet Node Tracker by KN4ORB http://tarpn.net/
|
||||
APTTxx Tiny Track
|
||||
APTWxx Byons WXTrac
|
||||
APTVxx for ATV/APRN and SSTV applications
|
||||
APU APU1xx UIview 16 bit applications
|
||||
|
@ -165,36 +253,47 @@ a TOCALL number series:
|
|||
APU3xx UIview terminal program
|
||||
APUDRx NW Digital Radio's UDR (APRS/Dstar)
|
||||
APV APVxxx Voice over Internet applications
|
||||
APVMxx DRCC-DVM Digital Voice (Digital Radio China Club)
|
||||
APVRxx for IRLP
|
||||
APVLxx for I-LINK
|
||||
APVExx for ECHO link
|
||||
APW APWxxx WinAPRS, etc
|
||||
APW9xx 9A9Y Weather Tracker
|
||||
APWAxx APRSISCE Android version
|
||||
APWSxx DF4IAN's WS2300 WX station
|
||||
APWMxx APRSISCE KJ4ERJ
|
||||
APWWxx APRSISCE win32 version
|
||||
APX APXnnn Xastir
|
||||
APXRnn Xrouter
|
||||
APY APYxxx Yeasu
|
||||
APY APYxxx Yaesu Radios
|
||||
APY008 Yaesu VX-8 series
|
||||
APY350 Yaesu FTM-350 series
|
||||
APYTxx for YagTracker
|
||||
APY01D Yaesu FT1D series
|
||||
APY02D Yaesu FT2D series
|
||||
APY03D Yaesu FT3D series
|
||||
APY05D Yaesu FT5D series
|
||||
APY100 Yaesu FTM-100D series
|
||||
APY300 Yaesu FTM-300D series
|
||||
APY350 Yaesu FTM-350 series
|
||||
APY400 Yaesu FTM-400D series
|
||||
APZ APZxxx Experimental
|
||||
APZ200 old versions of JNOS
|
||||
APZ247 for UPRS NR0Q
|
||||
APZ0xx Xastir (old versions. See APX)
|
||||
APZMAJ Martyn M1MAJ DeLorme inReach Tracker
|
||||
APZMDM github/codec2_talkie - product code not registered
|
||||
APZMDR for HaMDR trackers - hessu * hes.iki.fi]
|
||||
APZPAD Smart Palm
|
||||
APZTKP TrackPoint, Nick N0LP (Balloon tracking)
|
||||
APZTKP TrackPoint, Nick N0LP (Balloon tracking)(depricated)
|
||||
APZWIT MAP27 radio (Mountain Rescue) EI7IG
|
||||
APZWKR GM1WKR NetSked application
|
||||
</tocalls>
|
||||
<notes>
|
||||
|
||||
Authors with similar alphabetic requirements are encouraged to share
|
||||
their address space with other software. Work out agreements amongst
|
||||
yourselves and keep me informed.
|
||||
</notes>
|
||||
<altnets>
|
||||
|
||||
|
||||
REGISTERED ALTNETS:
|
||||
-------------------
|
||||
REGISTERED TOCALL ALTNETS:
|
||||
--------------------------
|
||||
|
||||
ALTNETS are uses of the AX-25 tocall to distinguish specialized
|
||||
traffic that may be flowing on the APRS-IS, but that are not intended
|
||||
|
@ -217,9 +316,11 @@ The following is a list of ALTNETS that may be of interest to other
|
|||
users. This list is by no means complete, since ANY combination of
|
||||
characters other than APxxxx are considered an ALTNET. But this list
|
||||
can give consisntecy to ALTNETS that may be using the global APRS-IS
|
||||
and need some special recognition:
|
||||
and need some special recognition. Here are some ideas:
|
||||
</altnets>
|
||||
<altnet_list>
|
||||
|
||||
TEST - A generic ALTNET for use during testing
|
||||
PSKAPR - PSKmail . But it is not AX.25 anyway
|
||||
|
||||
de WB4APR, Bob
|
||||
SATERN - Salvation Army Altnet
|
||||
AFMARS - Airforce Mars
|
||||
AMARS - Army Mars
|
||||
</altnet_list>
|
|
@ -0,0 +1,5 @@
|
|||
In order to start direwolf as a service the configuration file
|
||||
/etc/direwolf.conf needs to exist. Otherwise attempting to start the service
|
||||
returns an 'Assertion failed' error. An example configuration file which may be
|
||||
used as a model can be found in
|
||||
/usr/share/doc/direwolf/examples/direwolf.conf.gz
|
|
@ -0,0 +1 @@
|
|||
../CHANGES.md
|
|
@ -0,0 +1 @@
|
|||
10
|
|
@ -0,0 +1,30 @@
|
|||
Source: direwolf
|
||||
Maintainer: Debian Hamradio Maintainers <debian-hams@lists.debian.org>
|
||||
Uploaders: Iain R. Learmonth <irl@debian.org>
|
||||
Section: hamradio
|
||||
Priority: optional
|
||||
Build-Depends: debhelper (>= 9),
|
||||
libasound2-dev,
|
||||
libgps-dev,
|
||||
libhamlib-dev,
|
||||
dh-systemd
|
||||
Standards-Version: 4.1.0
|
||||
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-hamradio/direwolf.git/
|
||||
Vcs-Git: https://anonscm.debian.org/git/pkg-hamradio/direwolf.git
|
||||
Homepage: https://github.com/wb2osz/direwolf
|
||||
|
||||
Package: direwolf
|
||||
Architecture: alpha amd64 arm64 armel armhf i386 mipsel ppc64el sh4 x32
|
||||
Depends: ${shlibs:Depends},
|
||||
${misc:Depends},
|
||||
adduser,
|
||||
libhamlib2
|
||||
Suggests: gpsd, libhamlib-utils
|
||||
Breaks: direwolf-docs (<< 1.1-1)
|
||||
Replaces: direwolf-docs (<< 1.1-1)
|
||||
Description: Soundcard TNC for APRS
|
||||
Dire Wolf is a software "soundcard" modem/TNC and APRS encoder/decoder. It can
|
||||
be used stand-alone to receive APRS messages, as a digipeater, APRStt gateway,
|
||||
or Internet Gateway (IGate). It can also be used as a virtual TNC for other
|
||||
applications such as APRSIS32, UI-View32, Xastir, APRS-TW, YAAC, UISS, Linux
|
||||
AX25, SARTrack, and many others.
|
|
@ -0,0 +1,176 @@
|
|||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: direwolf
|
||||
Files-Excluded: doc/*.pdf
|
||||
Source: https://github.com/wb2osz/direwolf
|
||||
Comment:
|
||||
The files in misc/ are copied directly from the Cygwin source code. These are
|
||||
listed here as dual licensed as they are both part of the Cygwin distribution
|
||||
and originally part of BSD. See misc/README-dire-wolf.txt for more information.
|
||||
.
|
||||
Please see ftp-master's comments on this here:
|
||||
https://lists.debian.org/debian-hams/2014/09/msg00063.html
|
||||
https://lists.debian.org/debian-hams/2014/10/msg00003.html
|
||||
|
||||
Files: *
|
||||
Copyright: (C) 2011-2014 John Langner WB2OSZ
|
||||
License: GPL-2+
|
||||
|
||||
Files: geotranz/*
|
||||
Copyright: National Geospatial-Intelligence Agency
|
||||
License: Permissive-NGA
|
||||
|
||||
Files: regex/*
|
||||
Copyright: (C) 2002, 2003, 2005 Free Software Foundation, Inc.
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: misc/strcasestr.c
|
||||
Copyright:
|
||||
(C) 1990, 1993 The Regents of the University of California
|
||||
(C) RedHat
|
||||
License: BSD-4-clause or GPL-2+
|
||||
|
||||
Files: misc/strtok_r.c misc/strsep.c
|
||||
Copyright:
|
||||
(C) 1988 Regents of the University of California
|
||||
(C) RedHat
|
||||
License: BSD-3-clause or GPL-2+
|
||||
|
||||
Files: debian/*
|
||||
Copyright: (C) 2014 Iain R. Learmonth <irl@fsfe.org>
|
||||
License: GPL-2+
|
||||
|
||||
License: BSD-3-clause
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
.
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
.
|
||||
3. Neither the name of the University nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
License: BSD-4-clause
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
.
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
.
|
||||
3. All advertising materials mentioning features or use of this software
|
||||
must display the following acknowledgement:
|
||||
This product includes software developed by the University of
|
||||
California, Berkeley and its contributors.
|
||||
.
|
||||
4. Neither the name of the University nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
License: GPL-2+
|
||||
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
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
.
|
||||
On Debian systems, a copy of the full license text is available in
|
||||
/usr/share/common-licenses/GPL-2.
|
||||
|
||||
License: LGPL-2.1+
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
.
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
.
|
||||
On Debian systems, a copy of the full license text is available in
|
||||
/usr/share/common-licenses/LGPL-2.1.
|
||||
|
||||
License: Permissive-NGA
|
||||
1. The GEOTRANS source code ("the software") is provided free of charge by the
|
||||
National Geospatial-Intelligence Agency (NGA) of the United States Department
|
||||
of Defense. Although NGA makes no copyright claim under Title 17 U.S.C., NGA
|
||||
claims copyrights in the source code under other legal regimes. NGA hereby
|
||||
grants to each user of the software a license to use and distribute the
|
||||
software, and develop derivative works.
|
||||
.
|
||||
2. NGA requests that products developed using the software credit the source of
|
||||
the software with the following statement, "The product was developed using
|
||||
GEOTRANS, a product of the National Geospatial-Intelligence Agency (NGA) and
|
||||
U.S. Army Engineering Research and Development Center." Do not use the name
|
||||
GEOTRANS for any derived work.
|
||||
.
|
||||
3. Warranty Disclaimer: The software was developed to meet only the internal
|
||||
requirements of the National Geospatial-Intelligence Agency (NGA). The software
|
||||
is provided "as is," and no warranty, express or implied, including but not
|
||||
limited to the implied warranties of merchantability and fitness for particular
|
||||
purpose or arising by statute or otherwise in law or from a course of dealing
|
||||
or usage in trade, is made by NGA as to the accuracy and functioning of the
|
||||
software.
|
||||
.
|
||||
4. NGA and its personnel are not required to provide technical support or
|
||||
general assistance with respect to public use of the software. Government
|
||||
customers may contact NGA.
|
||||
.
|
||||
5. Neither NGA nor its personnel will be liable for any claims, losses, or
|
||||
damages arising from or connected with the use of the software. The user agrees
|
||||
to hold harmless the United States National Geospatial-Intelligence Agency
|
||||
(NGA). The user's sole and exclusive remedy is to stop using the software.
|
||||
.
|
||||
6. Please be advised that pursuant to the United States Code, 10 U.S.C. 425,
|
||||
the name of the National Geospatial-Intelligence Agency, the initials "NGA",
|
||||
the seal of the National Geospatial-Intelligence Agency, or any colorable
|
||||
imitation thereof shall not be used to imply approval, endorsement, or
|
||||
authorization of a product without prior written permission from United States
|
||||
Secretary of Defense. Do not create the impression that NGA, the Secretary of
|
||||
Defense or the Director of National Intelligence has endorsed any product
|
||||
derived from GEOTRANS.
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
. /usr/share/debconf/confmodule
|
||||
|
||||
add_group_if_missing() {
|
||||
if ! getent group direwolf >/dev/null; then
|
||||
addgroup --system --force-badname direwolf || true
|
||||
fi
|
||||
}
|
||||
|
||||
add_user_if_missing() {
|
||||
if ! id -u direwolf > /dev/null 2>&1; then
|
||||
mkdir -m 02750 -p /var/lib/direwolf
|
||||
adduser --system --home /var/lib/direwolf \
|
||||
--disabled-password \
|
||||
--force-badname direwolf \
|
||||
--ingroup direwolf
|
||||
adduser direwolf dialout
|
||||
chown direwolf:direwolf /var/lib/direwolf
|
||||
fi
|
||||
}
|
||||
|
||||
add_group_if_missing
|
||||
add_user_if_missing
|
||||
|
||||
db_stop
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
purge)
|
||||
rm -rf /var/lib/direwolf/
|
||||
;;
|
||||
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||
;;
|
||||
*)
|
||||
echo "postrm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
%:
|
||||
dh $@ --parallel
|
||||
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- -DFORCE_SSE=1
|
|
@ -0,0 +1 @@
|
|||
3.0 (quilt)
|
527
demod_9600.c
527
demod_9600.c
|
@ -1,527 +0,0 @@
|
|||
//
|
||||
// This file is part of Dire Wolf, an amateur radio packet TNC.
|
||||
//
|
||||
// Copyright (C) 2011, 2012, 2013, 2015 John Langner, WB2OSZ
|
||||
//
|
||||
// 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
|
||||
// the Free Software Foundation, either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
// #define DEBUG5 1 /* capture 9600 output to log files */
|
||||
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Module: demod_9600.c
|
||||
*
|
||||
* Purpose: Demodulator for scrambled baseband encoding.
|
||||
*
|
||||
* Input: Audio samples from either a file or the "sound card."
|
||||
*
|
||||
* Outputs: Calls hdlc_rec_bit() for each bit demodulated.
|
||||
*
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "direwolf.h"
|
||||
#include "tune.h"
|
||||
#include "fsk_demod_state.h"
|
||||
#include "hdlc_rec.h"
|
||||
#include "demod_9600.h"
|
||||
#include "textcolor.h"
|
||||
#include "dsp.h"
|
||||
|
||||
|
||||
static float slice_point[MAX_SUBCHANS];
|
||||
|
||||
|
||||
/* Add sample to buffer and shift the rest down. */
|
||||
|
||||
__attribute__((hot))
|
||||
static inline void push_sample (float val, float *buff, int size)
|
||||
{
|
||||
memmove(buff+1,buff,(size-1)*sizeof(float));
|
||||
buff[0] = val;
|
||||
}
|
||||
|
||||
|
||||
/* FIR filter kernel. */
|
||||
|
||||
__attribute__((hot))
|
||||
static inline float convolve (const float *__restrict__ data, const float *__restrict__ filter, int filter_size)
|
||||
{
|
||||
float sum = 0.0f;
|
||||
int j;
|
||||
|
||||
#if 0
|
||||
// As suggested here, http://locklessinc.com/articles/vectorize/
|
||||
// Unfortunately, older compilers don't recognize it.
|
||||
|
||||
// Get more information by using -ftree-vectorizer-verbose=5
|
||||
|
||||
float *d = __builtin_assume_aligned(data, 16);
|
||||
float *f = __builtin_assume_aligned(filter, 16);
|
||||
|
||||
for (j=0; j<filter_size; j++) {
|
||||
sum += f[j] * d[j];
|
||||
}
|
||||
#else
|
||||
for (j=0; j<filter_size; j++) {
|
||||
sum += filter[j] * data[j];
|
||||
}
|
||||
#endif
|
||||
return (sum);
|
||||
}
|
||||
|
||||
/* Automatic gain control. */
|
||||
/* Result should settle down to 1 unit peak to peak. i.e. -0.5 to +0.5 */
|
||||
|
||||
__attribute__((hot))
|
||||
static inline float agc (float in, float fast_attack, float slow_decay, float *ppeak, float *pvalley)
|
||||
{
|
||||
if (in >= *ppeak) {
|
||||
*ppeak = in * fast_attack + *ppeak * (1. - fast_attack);
|
||||
}
|
||||
else {
|
||||
*ppeak = in * slow_decay + *ppeak * (1. - slow_decay);
|
||||
}
|
||||
|
||||
if (in <= *pvalley) {
|
||||
*pvalley = in * fast_attack + *pvalley * (1. - fast_attack);
|
||||
}
|
||||
else {
|
||||
*pvalley = in * slow_decay + *pvalley * (1. - slow_decay);
|
||||
}
|
||||
|
||||
if (*ppeak > *pvalley) {
|
||||
return ((in - 0.5 * (*ppeak + *pvalley)) / (*ppeak - *pvalley));
|
||||
}
|
||||
return (0.0);
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Name: demod_9600_init
|
||||
*
|
||||
* Purpose: Initialize the 9600 baud demodulator.
|
||||
*
|
||||
* Inputs: samples_per_sec - Number of samples per second.
|
||||
* Might be upsampled in hopes of
|
||||
* reducing the PLL jitter.
|
||||
*
|
||||
* baud - Data rate in bits per second.
|
||||
*
|
||||
* D - Address of demodulator state.
|
||||
*
|
||||
* Returns: None
|
||||
*
|
||||
*----------------------------------------------------------------*/
|
||||
|
||||
void demod_9600_init (int samples_per_sec, int baud, struct demodulator_state_s *D)
|
||||
{
|
||||
float fc;
|
||||
int j;
|
||||
|
||||
memset (D, 0, sizeof(struct demodulator_state_s));
|
||||
|
||||
//dw_printf ("demod_9600_init(rate=%d, baud=%d, D ptr)\n", samples_per_sec, baud);
|
||||
|
||||
D->pll_step_per_sample =
|
||||
(int) round(TICKS_PER_PLL_CYCLE * (double) baud / (double)samples_per_sec);
|
||||
|
||||
D->lp_filter_len_bits = 72 * 9600.0 / (44100.0 * 2.0);
|
||||
D->lp_filter_size = (int) (( D->lp_filter_len_bits * (float)samples_per_sec / baud) + 0.5);
|
||||
D->lp_window = BP_WINDOW_HAMMING;
|
||||
D->lpf_baud = 0.59;
|
||||
|
||||
D->agc_fast_attack = 0.080;
|
||||
D->agc_slow_decay = 0.00012;
|
||||
|
||||
D->pll_locked_inertia = 0.88;
|
||||
D->pll_searching_inertia = 0.67;
|
||||
|
||||
|
||||
#ifdef TUNE_LP_WINDOW
|
||||
D->lp_window = TUNE_LP_WINDOW;
|
||||
#endif
|
||||
|
||||
#if TUNE_LP_FILTER_SIZE
|
||||
D->lp_filter_size = TUNE_LP_FILTER_SIZE;
|
||||
#endif
|
||||
|
||||
#ifdef TUNE_LPF_BAUD
|
||||
D->lpf_baud = TUNE_LPF_BAUD;
|
||||
#endif
|
||||
|
||||
#ifdef TUNE_AGC_FAST
|
||||
D->agc_fast_attack = TUNE_AGC_FAST;
|
||||
#endif
|
||||
|
||||
#ifdef TUNE_AGC_SLOW
|
||||
D->agc_slow_decay = TUNE_AGC_SLOW;
|
||||
#endif
|
||||
|
||||
#if defined(TUNE_PLL_LOCKED) && defined(TUNE_PLL_SEARCHING)
|
||||
D->pll_locked_inertia = TUNE_PLL_LOCKED;
|
||||
D->pll_searching_inertia = TUNE_PLL_SEARCHING;
|
||||
#endif
|
||||
|
||||
fc = (float)baud * D->lpf_baud / (float)samples_per_sec;
|
||||
|
||||
//dw_printf ("demod_9600_init: call gen_lowpass(fc=%.2f, , size=%d, )\n", fc, D->lp_filter_size);
|
||||
|
||||
gen_lowpass (fc, D->lp_filter, D->lp_filter_size, D->lp_window);
|
||||
|
||||
/* Version 1.2: Experiment with different slicing levels. */
|
||||
|
||||
for (j = 0; j < MAX_SUBCHANS; j++) {
|
||||
slice_point[j] = 0.02 * (j - 0.5 * (MAX_SUBCHANS-1));
|
||||
//dw_printf ("slice_point[%d] = %+5.2f\n", j, slice_point[j]);
|
||||
}
|
||||
|
||||
} /* end fsk_demod_init */
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: demod_9600_process_sample
|
||||
*
|
||||
* Purpose: (1) Filter & slice the signal.
|
||||
* (2) Descramble it.
|
||||
* (2) Recover clock and data.
|
||||
*
|
||||
* Inputs: chan - Audio channel. 0 for left, 1 for right.
|
||||
*
|
||||
* sam - One sample of audio.
|
||||
* Should be in range of -32768 .. 32767.
|
||||
*
|
||||
* Returns: None
|
||||
*
|
||||
* Descripion: "9600 baud" packet is FSK for an FM voice transceiver.
|
||||
* By the time it gets here, it's really a baseband signal.
|
||||
* At one extreme, we could have a 4800 Hz square wave.
|
||||
* A the other extreme, we could go a considerable number
|
||||
* of bit times without any transitions.
|
||||
*
|
||||
* The trick is to extract the digital data which has
|
||||
* been distorted by going thru voice transceivers not
|
||||
* intended to pass this sort of "audio" signal.
|
||||
*
|
||||
* Data is "scrambled" to reduce the amount of DC bias.
|
||||
* The data stream must be unscrambled at the receiving end.
|
||||
*
|
||||
* We also have a digital phase locked loop (PLL)
|
||||
* to recover the clock and pick out data bits at
|
||||
* the proper rate.
|
||||
*
|
||||
* For each recovered data bit, we call:
|
||||
*
|
||||
* hdlc_rec (channel, demodulated_bit);
|
||||
*
|
||||
* to decode HDLC frames from the stream of bits.
|
||||
*
|
||||
* Future: This could be generalized by passing in the name
|
||||
* of the function to be called for each bit recovered
|
||||
* from the demodulator. For now, it's simply hard-coded.
|
||||
*
|
||||
* References: 9600 Baud Packet Radio Modem Design
|
||||
* http://www.amsat.org/amsat/articles/g3ruh/109.html
|
||||
*
|
||||
* The KD2BD 9600 Baud Modem
|
||||
* http://www.amsat.org/amsat/articles/kd2bd/9k6modem/
|
||||
*
|
||||
* 9600 Baud Packet Handbook
|
||||
* ftp://ftp.tapr.org/general/9600baud/96man2x0.txt
|
||||
*
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
static void nudge_pll (int chan, int subchan, int demod_data, struct demodulator_state_s *D);
|
||||
|
||||
__attribute__((hot))
|
||||
void demod_9600_process_sample (int chan, int sam, struct demodulator_state_s *D)
|
||||
{
|
||||
|
||||
float fsam;
|
||||
float abs_fsam;
|
||||
float amp;
|
||||
float demod_out;
|
||||
|
||||
#if DEBUG5
|
||||
static FILE *demod_log_fp = NULL;
|
||||
static int seq = 0; /* for log file name */
|
||||
#endif
|
||||
|
||||
int j;
|
||||
int subchan = 0;
|
||||
int demod_data; /* Still scrambled. */
|
||||
|
||||
|
||||
assert (chan >= 0 && chan < MAX_CHANS);
|
||||
assert (subchan >= 0 && subchan < MAX_SUBCHANS);
|
||||
|
||||
|
||||
/*
|
||||
* Filters use last 'filter_size' samples.
|
||||
*
|
||||
* First push the older samples down.
|
||||
*
|
||||
* Finally, put the most recent at the beginning.
|
||||
*
|
||||
* Future project? Rather than shifting the samples,
|
||||
* it might be faster to add another variable to keep
|
||||
* track of the most recent sample and change the
|
||||
* indexing in the later loops that multipy and add.
|
||||
*/
|
||||
|
||||
/* Scale to nice number for convenience. */
|
||||
/* Consistent with the AFSK demodulator, we'd like to use */
|
||||
/* only half of the dynamic range to have some headroom. */
|
||||
/* i.e. input range +-16k becomes +-1 here and is */
|
||||
/* displayed in the heard line as audio level 100. */
|
||||
|
||||
fsam = sam / 16384.0;
|
||||
|
||||
push_sample (fsam, D->raw_cb, D->lp_filter_size);
|
||||
|
||||
/*
|
||||
* Low pass filter to reduce noise yet pass the data.
|
||||
*/
|
||||
|
||||
amp = convolve (D->raw_cb, D->lp_filter, D->lp_filter_size);
|
||||
|
||||
|
||||
/*
|
||||
* Version 1.2: Capture the post-filtering amplitude for display.
|
||||
* This is similar to the AGC without the normalization step.
|
||||
* We want decay to be substantially slower to get a longer
|
||||
* range idea of the received audio.
|
||||
* For AFSK, we keep mark and space amplitudes.
|
||||
* Here we keep + and - peaks because there could be a DC bias.
|
||||
*/
|
||||
|
||||
if (amp >= D->alevel_mark_peak) {
|
||||
D->alevel_mark_peak = amp * D->quick_attack + D->alevel_mark_peak * (1. - D->quick_attack);
|
||||
}
|
||||
else {
|
||||
D->alevel_mark_peak = amp * D->sluggish_decay + D->alevel_mark_peak * (1. - D->sluggish_decay);
|
||||
}
|
||||
|
||||
if (amp <= D->alevel_space_peak) {
|
||||
D->alevel_space_peak = amp * D->quick_attack + D->alevel_space_peak * (1. - D->quick_attack);
|
||||
}
|
||||
else {
|
||||
D->alevel_space_peak = amp * D->sluggish_decay + D->alevel_space_peak * (1. - D->sluggish_decay);
|
||||
}
|
||||
|
||||
/*
|
||||
* The input level can vary greatly.
|
||||
* More importantly, there could be a DC bias which we need to remove.
|
||||
*
|
||||
* Normalize the signal with automatic gain control (AGC).
|
||||
* This works by looking at the minimum and maximum signal peaks
|
||||
* and scaling the results to be roughly in the -1.0 to +1.0 range.
|
||||
*/
|
||||
|
||||
demod_out = agc (amp, D->agc_fast_attack, D->agc_slow_decay, &(D->m_peak), &(D->m_valley));
|
||||
|
||||
|
||||
// TODO: There is potential for multiple decoders with one filter.
|
||||
|
||||
//dw_printf ("peak=%.2f valley=%.2f amp=%.2f norm=%.2f\n", D->m_peak, D->m_valley, amp, norm);
|
||||
|
||||
/* Throw in a little Hysteresis??? */
|
||||
/* (Not to be confused with Hysteria.) */
|
||||
/* Doesn't seem to have any value. */
|
||||
/* Using a level of .02 makes things worse. */
|
||||
/* Might want to experiment with this again someday. */
|
||||
|
||||
|
||||
// if (demod_out > 0.03) {
|
||||
// demod_data = 1;
|
||||
// }
|
||||
// else if (demod_out < -0.03) {
|
||||
// demod_data = 0;
|
||||
// }
|
||||
// else {
|
||||
// demod_data = D->slicer[subchan].prev_demod_data;
|
||||
// }
|
||||
|
||||
if (D->num_slicers <= 1) {
|
||||
|
||||
/* Normal case of one demodulator to one HDLC decoder. */
|
||||
/* Demodulator output is difference between response from two filters. */
|
||||
/* AGC should generally keep this around -1 to +1 range. */
|
||||
|
||||
demod_data = demod_out > 0;
|
||||
|
||||
nudge_pll (chan, subchan, demod_data, D);
|
||||
}
|
||||
else {
|
||||
int s;
|
||||
|
||||
assert (subchan == 0);
|
||||
|
||||
/* Multiple slicers each feeding its own HDLC decoder. */
|
||||
|
||||
for (s=0; s<D->num_slicers; s++) {
|
||||
demod_data = demod_out > slice_point[s];
|
||||
nudge_pll (chan, s, demod_data, D);
|
||||
}
|
||||
}
|
||||
|
||||
} /* end demod_9600_process_sample */
|
||||
|
||||
|
||||
__attribute__((hot))
|
||||
static void nudge_pll (int chan, int subchan, int demod_data, struct demodulator_state_s *D)
|
||||
{
|
||||
int descram; /* Data bit de-scrambled. */
|
||||
|
||||
/*
|
||||
* Next, a PLL is used to sample near the centers of the data bits.
|
||||
*
|
||||
* D->data_clock_pll is a SIGNED 32 bit variable.
|
||||
* When it overflows from a large positive value to a negative value, we
|
||||
* sample a data bit from the demodulated signal.
|
||||
*
|
||||
* Ideally, the the demodulated signal transitions should be near
|
||||
* zero we we sample mid way between the transitions.
|
||||
*
|
||||
* Nudge the PLL by removing some small fraction from the value of
|
||||
* data_clock_pll, pushing it closer to zero.
|
||||
*
|
||||
* This adjustment will never change the sign so it won't cause
|
||||
* any erratic data bit sampling.
|
||||
*
|
||||
* If we adjust it too quickly, the clock will have too much jitter.
|
||||
* If we adjust it too slowly, it will take too long to lock on to a new signal.
|
||||
*
|
||||
* I don't think the optimal value will depend on the audio sample rate
|
||||
* because this happens for each transition from the demodulator.
|
||||
*
|
||||
* This was optimized for 1200 baud AFSK. There might be some opportunity
|
||||
* for improvement here.
|
||||
*/
|
||||
D->slicer[subchan].prev_d_c_pll = D->slicer[subchan].data_clock_pll;
|
||||
D->slicer[subchan].data_clock_pll += D->pll_step_per_sample;
|
||||
|
||||
if (D->slicer[subchan].data_clock_pll < 0 && D->slicer[subchan].prev_d_c_pll > 0) {
|
||||
|
||||
/* Overflow. */
|
||||
|
||||
/*
|
||||
* At this point, we need to descramble the data as
|
||||
* in hardware based designs by G3RUH and K9NG.
|
||||
*
|
||||
* Future Idea: allow unscrambled baseband data.
|
||||
*
|
||||
* http://www.amsat.org/amsat/articles/g3ruh/109/fig03.gif
|
||||
*/
|
||||
|
||||
//assert (modem.modem_type[chan] == MODEM_SCRAMBLE);
|
||||
|
||||
//if (modem.modem_type[chan] == MODEM_SCRAMBLE) {
|
||||
|
||||
|
||||
descram = descramble (demod_data, &(D->slicer[subchan].lfsr));
|
||||
|
||||
hdlc_rec_bit (chan, subchan, demod_data, 1, D->slicer[subchan].lfsr);
|
||||
|
||||
//D->prev_descram = descram;
|
||||
//}
|
||||
//else {
|
||||
/* Baseband signal for completeness - not in common use. */
|
||||
//hdlc_rec_bit (chan, subchan, demod_data);
|
||||
//}
|
||||
}
|
||||
|
||||
if (demod_data != D->slicer[subchan].prev_demod_data) {
|
||||
|
||||
// Note: Test for this demodulator, not overall for channel.
|
||||
|
||||
if (hdlc_rec_gathering (chan, subchan)) {
|
||||
D->slicer[subchan].data_clock_pll = (int)(D->slicer[subchan].data_clock_pll * D->pll_locked_inertia);
|
||||
}
|
||||
else {
|
||||
D->slicer[subchan].data_clock_pll = (int)(D->slicer[subchan].data_clock_pll * D->pll_searching_inertia);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if DEBUG5
|
||||
|
||||
//if (chan == 0) {
|
||||
if (hdlc_rec_gathering (chan,subchan)) {
|
||||
|
||||
char fname[30];
|
||||
|
||||
|
||||
if (demod_log_fp == NULL) {
|
||||
seq++;
|
||||
sprintf (fname, "demod96/%04d.csv", seq);
|
||||
if (seq == 1) mkdir ("demod96"
|
||||
#ifndef __WIN32__
|
||||
, 0777
|
||||
#endif
|
||||
);
|
||||
|
||||
demod_log_fp = fopen (fname, "w");
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("Starting 9600 decoder log file %s\n", fname);
|
||||
fprintf (demod_log_fp, "Audio, Peak, Valley, Demod, SData, Descram, Clock\n");
|
||||
}
|
||||
fprintf (demod_log_fp, "%.3f, %.3f, %.3f, %.3f, %.2f, %.2f, %.2f\n",
|
||||
0.5 * fsam + 3.5,
|
||||
0.5 * D->m_peak + 3.5,
|
||||
0.5 * D->m_valley + 3.5,
|
||||
0.5 * demod_out + 2.0,
|
||||
demod_data ? 1.35 : 1.0,
|
||||
descram ? .9 : .55,
|
||||
(D->data_clock_pll & 0x80000000) ? .1 : .45);
|
||||
}
|
||||
else {
|
||||
if (demod_log_fp != NULL) {
|
||||
fclose (demod_log_fp);
|
||||
demod_log_fp = NULL;
|
||||
}
|
||||
}
|
||||
//}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Remember demodulator output (pre-descrambling) so we can compare next time
|
||||
* for the DPLL sync.
|
||||
*/
|
||||
D->slicer[subchan].prev_demod_data = demod_data;
|
||||
|
||||
} /* end nudge_pll */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* end demod_9600.c */
|
1143
demod_afsk.c
1143
demod_afsk.c
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
1044
direwolf.c
1044
direwolf.c
File diff suppressed because it is too large
Load Diff
458
direwolf.conf
458
direwolf.conf
|
@ -1,458 +0,0 @@
|
|||
#############################################################
|
||||
# #
|
||||
# Configuration file for Dire Wolf #
|
||||
# #
|
||||
# Linux version #
|
||||
# #
|
||||
#############################################################
|
||||
#
|
||||
# Consult the User Guide for more details on configuration options.
|
||||
#
|
||||
#
|
||||
# These are the most likely settings you might change:
|
||||
#
|
||||
# (1) MYCALL - call sign and SSID for your station.
|
||||
#
|
||||
# Look for lines starting with MYCALL and
|
||||
# change NOCALL to your own.
|
||||
#
|
||||
# (2) PBEACON - enable position beaconing.
|
||||
#
|
||||
# Look for lines starting with PBEACON and
|
||||
# modify for your call, location, etc.
|
||||
#
|
||||
# (3) DIGIPEATER - configure digipeating rules.
|
||||
#
|
||||
# Look for lines starting with DIGIPEATER.
|
||||
# Most people will probably use the given example.
|
||||
# Just remove the "#" from the start of the line
|
||||
# to enable it.
|
||||
#
|
||||
# (4) IGSERVER, IGLOGIN - IGate server and login
|
||||
#
|
||||
# Configure an IGate client to relay messages between
|
||||
# radio and internet servers.
|
||||
#
|
||||
#
|
||||
# The default location is "direwolf.conf" in the current working directory.
|
||||
# On Linux, the user's home directory will also be searched.
|
||||
# An alternate configuration file location can be specified with the "-c" command line option.
|
||||
#
|
||||
# As you probably guessed by now, # indicates a comment line.
|
||||
#
|
||||
# Remove the # at the beginning of a line if you want to use a sample
|
||||
# configuration that is currently commented out.
|
||||
#
|
||||
# Commands are a keyword followed by parameters.
|
||||
#
|
||||
# Command key words are case insensitive. i.e. upper and lower case are equivalent.
|
||||
#
|
||||
# Command parameters are generally case sensitive. i.e. upper and lower case are different.
|
||||
#
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# FIRST AUDIO DEVICE PROPERTIES #
|
||||
# (Channel 0 + 1 if in stereo) #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#
|
||||
# Many people will simply use the default sound device.
|
||||
# Some might want to use an alternative device by chosing it here.
|
||||
#
|
||||
# Linux ALSA is complicated. See User Guide for discussion.
|
||||
# To use something other than the default, generally use plughw
|
||||
# and a card number reported by "arecord -l" command. Example:
|
||||
|
||||
# ADEVICE plughw:1,0
|
||||
|
||||
# Starting with version 1.0, you can also use "-" or "stdin" to
|
||||
# pipe stdout from some other application such as a software defined
|
||||
# radio. You can also specify "UDP:" and an optional port for input.
|
||||
# Something different must be specified for output.
|
||||
|
||||
# ADEVICE - plughw:1,0
|
||||
# ADEVICE UDP:7355 default
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Number of audio channels for this souncard: 1 or 2.
|
||||
#
|
||||
|
||||
ACHANNELS 1
|
||||
#ACHANNELS 2
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# SECOND AUDIO DEVICE PROPERTIES #
|
||||
# (Channel 2 + 3 if in stereo) #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#ADEVICE1 ...
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# THIRD AUDIO DEVICE PROPERTIES #
|
||||
# (Channel 4 + 5 if in stereo) #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#ADEVICE2 ...
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# CHANNEL 0 PROPERTIES #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
CHANNEL 0
|
||||
|
||||
#
|
||||
# The following MYCALL, MODEM, PTT, etc. configuration items
|
||||
# apply to the most recent CHANNEL.
|
||||
#
|
||||
|
||||
#
|
||||
# Station identifier for this channel.
|
||||
# Multiple channels can have the same or different names.
|
||||
#
|
||||
# It can be up to 6 letters and digits with an optional ssid.
|
||||
# The APRS specification requires that it be upper case.
|
||||
#
|
||||
# Example (don't use this unless you are me): MYCALL WB2OSZ-5
|
||||
#
|
||||
|
||||
MYCALL N0CALL
|
||||
|
||||
#
|
||||
# Pick a suitable modem speed based on your situation.
|
||||
# 1200 Most common for VHF/UHF. Default if not specified.
|
||||
# 300 Low speed for HF SSB.
|
||||
# 9600 High speed - Can't use Microphone and Speaker connections.
|
||||
#
|
||||
# In the simplest form, just specify the speed.
|
||||
#
|
||||
|
||||
MODEM 1200
|
||||
#MODEM 300
|
||||
#MODEM 9600
|
||||
|
||||
#
|
||||
# These are the defaults should be fine for most cases. In special situations,
|
||||
# you might want to specify different AFSK tones or the baseband mode which does
|
||||
# not use AFSK.
|
||||
#
|
||||
#MODEM 1200 1200:2200
|
||||
#MODEM 300 1600:1800
|
||||
#MODEM 9600 0:0
|
||||
#
|
||||
#
|
||||
# On HF SSB, you might want to use multiple demodulators on slightly different
|
||||
# frequencies to compensate for stations off frequency. Here we have 7 different
|
||||
# demodulators at 30 Hz intervals. This takes a lot of CPU power so you will
|
||||
# probably need to reduce the audio sampling rate with the /n option.
|
||||
|
||||
#MODEM 300 1600:1800 7@30 /4
|
||||
|
||||
|
||||
#
|
||||
# Uncomment line below to enable the DTMF decoder for this channel.
|
||||
#
|
||||
|
||||
#DTMF
|
||||
|
||||
#
|
||||
# If not using a VOX circuit, the transmitter Push to Talk (PTT)
|
||||
# control is usually wired to a serial port with a suitable interface circuit.
|
||||
# DON'T connect it directly!
|
||||
#
|
||||
# For the PTT command, specify the device and either RTS or DTR.
|
||||
# RTS or DTR may be preceded by "-" to invert the signal.
|
||||
# Both can be used for interfaces that want them driven with opposite polarity.
|
||||
#
|
||||
# COM1 can be used instead of /dev/ttyS0, COM2 for /dev/ttyS1, and so on.
|
||||
#
|
||||
|
||||
#PTT COM1 RTS
|
||||
#PTT COM1 RTS -DTR
|
||||
#PTT /dev/ttyUSB0 RTS
|
||||
|
||||
#
|
||||
# On Linux, you can also use general purpose I/O pins if
|
||||
# your system is configured for user access to them.
|
||||
# This would apply mostly to microprocessor boards, not a regular PC.
|
||||
# See separate Raspberry Pi document for more details.
|
||||
# The number may be preceded by "-" to invert the signal.
|
||||
#
|
||||
|
||||
#PTT GPIO 25
|
||||
|
||||
# The Data Carrier Detect (DCD) signal can be sent to the same places
|
||||
# as the PTT signal. This could be used to light up an LED like a normal TNC.
|
||||
|
||||
#DCD COM1 -DTR
|
||||
#DCD GPIO 24
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# CHANNEL 1 PROPERTIES #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#CHANNEL 1
|
||||
|
||||
#
|
||||
# Specify MYCALL, MODEM, PTT, etc. configuration items for
|
||||
# CHANNEL 1. Repeat for any other channels.
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# TEXT TO SPEECH COMMAND FILE #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#SPEECH dwespeak.sh
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# VIRTUAL TNC SERVER PROPERTIES #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#
|
||||
# Dire Wolf acts as a virtual TNC and can communicate with
|
||||
# client applications by different protocols:
|
||||
#
|
||||
# - the "AGW TCPIP Socket Interface" - default port 8000
|
||||
# - KISS protocol over TCP socket - default port 8001
|
||||
# - KISS TNC via pseudo terminal (-p command line option)
|
||||
#
|
||||
|
||||
AGWPORT 8000
|
||||
KISSPORT 8001
|
||||
|
||||
#
|
||||
# It is sometimes possible to recover frames with a bad FCS.
|
||||
# This applies to all channels.
|
||||
#
|
||||
# 0 [NONE] - Don't try to repair.
|
||||
# 1 [SINGLE] - Attempt to fix single bit error. (default)
|
||||
# 2 [DOUBLE] - Also attempt to fix two adjacent bits.
|
||||
# ... see User Guide for more values and in-depth discussion.
|
||||
#
|
||||
|
||||
#FIX_BITS 0
|
||||
|
||||
#
|
||||
#############################################################
|
||||
# #
|
||||
# BEACONING PROPERTIES #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
|
||||
#
|
||||
# Beaconing is configured with these two commands:
|
||||
#
|
||||
# PBEACON - for a position report (usually yourself)
|
||||
# OBEACON - for an object report (usually some other entity)
|
||||
#
|
||||
# Each has a series of keywords and values for options.
|
||||
# See User Guide for details.
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# This results in a broadcast once every 10 minutes.
|
||||
# Every half hour, it can travel via two digipeater hops.
|
||||
# The others are kept local.
|
||||
#
|
||||
|
||||
#PBEACON delay=1 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA" via=WIDE1-1,WIDE2-1
|
||||
#PBEACON delay=11 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
#PBEACON delay=21 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
|
||||
|
||||
# With UTM coordinates instead of latitude and longitude.
|
||||
|
||||
#PBEACON delay=1 every=10 overlay=S symbol="digi" zone=19T easting=307477 northing=4720178
|
||||
|
||||
|
||||
#
|
||||
# When the destination field is set to "SPEECH" the information part is
|
||||
# converted to speech rather than transmitted as a data frame.
|
||||
#
|
||||
|
||||
#CBEACON dest="SPEECH" info="Club meeting tonight at 7 pm."
|
||||
|
||||
|
||||
#
|
||||
# Modify for your particular situation before removing
|
||||
# the # comment character from the beginning of appropriate lines above.
|
||||
#
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# DIGIPEATER PROPERTIES #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#
|
||||
# For most common situations, use something like this by removing
|
||||
# the "#" from the beginning of the line below.
|
||||
#
|
||||
|
||||
#DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$|^TEST$ ^WIDE[12]-[12]$ TRACE
|
||||
|
||||
# See User Guide for more explanation of what this means and how
|
||||
# it can be customized for your particular needs.
|
||||
|
||||
# Filtering can be used to limit was is digipeated.
|
||||
# For example, only weather weather reports, received on channel 0,
|
||||
# will be retransmitted on channel 1.
|
||||
#
|
||||
|
||||
#FILTER 0 1 t/wn
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# INTERNET GATEWAY #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
# First you need to specify the name of a Tier 2 server.
|
||||
# The current preferred way is to use one of these regional rotate addresses:
|
||||
|
||||
# noam.aprs2.net - for North America
|
||||
# soam.aprs2.net - for South America
|
||||
# euro.aprs2.net - for Europe and Africa
|
||||
# asia.aprs2.net - for Asia
|
||||
# aunz.aprs2.net - for Oceania
|
||||
|
||||
#IGSERVER noam.aprs2.net
|
||||
|
||||
# You also need to specify your login name and passcode.
|
||||
# Contact the author if you can't figure out how to generate the passcode.
|
||||
|
||||
#IGLOGIN WB2OSZ-5 123456
|
||||
|
||||
# That's all you need for a receive only IGate which relays
|
||||
# messages from the local radio channel to the global servers.
|
||||
|
||||
# Some might want to send an IGate client position directly to a server
|
||||
# without sending it over the air and relying on someone else to
|
||||
# forward it to an IGate server. This is done by using sendto=IG rather
|
||||
# than a radio channel number. Overlay R for receive only, T for two way.
|
||||
|
||||
#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=R lat=42^37.14N long=071^20.83W
|
||||
#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=T lat=42^37.14N long=071^20.83W
|
||||
|
||||
|
||||
# To relay messages from the Internet to radio, you need to add
|
||||
# one more option with the transmit channel number and a VIA path.
|
||||
|
||||
#IGTXVIA 0 WIDE1-1
|
||||
|
||||
# You might want to apply a filter for what packets will be obtained from the server.
|
||||
# Read about filters here: http://www.aprs-is.net/javaprsfilter.aspx
|
||||
# Example, positions and objects within 50 km of my location:
|
||||
|
||||
#IGFILTER m/50
|
||||
|
||||
# That is known as a server-side filter. It is processed by the IGate server.
|
||||
# You can also apply local filtering to limit what will be transmitted on the
|
||||
# RF side. For example, transmit only "messages" on channel 0 and weather
|
||||
# reports on channel 1.
|
||||
|
||||
#FILTER IG 0 t/m
|
||||
#FILTER IG 1 t/wn
|
||||
|
||||
# Finally, we don't want to flood the radio channel.
|
||||
# The IGate function will limit the number of packets transmitted
|
||||
# during 1 minute and 5 minute intervals. If a limit would
|
||||
# be exceeded, the packet is dropped and message is displayed in red.
|
||||
|
||||
IGTXLIMIT 6 10
|
||||
|
||||
|
||||
#############################################################
|
||||
# #
|
||||
# APRStt GATEWAY #
|
||||
# #
|
||||
#############################################################
|
||||
|
||||
#
|
||||
# Dire Wolf can receive DTMF (commonly known as Touch Tone)
|
||||
# messages and convert them to packet objects.
|
||||
#
|
||||
# See separate "APRStt-Implementation-Notes" document for details.
|
||||
#
|
||||
|
||||
#
|
||||
# Sample gateway configuration based on:
|
||||
#
|
||||
# http://www.aprs.org/aprstt/aprstt-coding24.txt
|
||||
# http://www.aprs.org/aprs-jamboree-2013.html
|
||||
#
|
||||
|
||||
# Define specific points.
|
||||
|
||||
TTPOINT B01 37^55.37N 81^7.86W
|
||||
TTPOINT B7495088 42.605237 -71.34456
|
||||
TTPOINT B934 42.605237 -71.34456
|
||||
|
||||
TTPOINT B901 42.661279 -71.364452
|
||||
TTPOINT B902 42.660411 -71.364419
|
||||
TTPOINT B903 42.659046 -71.364452
|
||||
TTPOINT B904 42.657578 -71.364602
|
||||
|
||||
|
||||
# For location at given bearing and distance from starting point.
|
||||
|
||||
TTVECTOR B5bbbddd 37^55.37N 81^7.86W 0.01 mi
|
||||
|
||||
# For location specified by x, y coordinates.
|
||||
|
||||
TTGRID Byyyxxx 37^50.00N 81^00.00W 37^59.99N 81^09.99W
|
||||
|
||||
# UTM location for Lowell-Dracut-Tyngsborough State Forest.
|
||||
|
||||
TTUTM B6xxxyyy 19T 10 300000 4720000
|
||||
|
||||
|
||||
|
||||
# Location for the corral.
|
||||
|
||||
TTCORRAL 37^55.50N 81^7.00W 0^0.02N
|
||||
|
||||
# Compact messages - Fixed locations xx and object yyy where
|
||||
# Object numbers 100 - 199 = bicycle
|
||||
# Object numbers 200 - 299 = fire truck
|
||||
# Others = dog
|
||||
|
||||
TTMACRO xx1yy B9xx*AB166*AA2B4C5B3B0A1yy
|
||||
TTMACRO xx2yy B9xx*AB170*AA3C4C7C3B0A2yy
|
||||
TTMACRO xxyyy B9xx*AB180*AA3A6C4A0Ayyy
|
||||
|
||||
TTMACRO z Cz
|
||||
|
||||
# Receive on channel 0, Transmit object reports on channel 1 with optional via path.
|
||||
|
||||
#TTOBJ 0 1 WIDE1-1
|
||||
|
||||
# Advertise gateway position with beacon.
|
||||
|
||||
# OBEACON DELAY=0:15 EVERY=10:00 VIA=WIDE1-1 OBJNAME=WB2OSZ-tt SYMBOL=APRStt LAT=42^37.14N LONG=71^20.83W COMMENT="APRStt Gateway"
|
||||
|
||||
|
161
direwolf.h
161
direwolf.h
|
@ -1,161 +0,0 @@
|
|||
|
||||
#ifndef DIREWOLF_H
|
||||
#define DIREWOLF_H 1
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Previously, we could handle only a single audio device.
|
||||
* This meant we could have only two radio channels.
|
||||
* In version 1.2, we relax this restriction and allow more audio devices.
|
||||
* Three is probably adequate for standard version.
|
||||
* Larger reasonable numbers should also be fine.
|
||||
*/
|
||||
|
||||
#define MAX_ADEVS 3
|
||||
|
||||
|
||||
/*
|
||||
* Maximum number of radio channels.
|
||||
* Note that there could be gaps.
|
||||
* Suppose audio device 0 was in mono mode and audio device 1 was stereo.
|
||||
* The channels available would be:
|
||||
*
|
||||
* ADevice 0: channel 0
|
||||
* ADevice 1: left = 2, right = 3
|
||||
*
|
||||
* TODO1.2: Look for any places that have
|
||||
* for (ch=0; ch<MAX_CHANS; ch++) ...
|
||||
* and make sure they handle undefined channels correctly.
|
||||
*/
|
||||
|
||||
#define MAX_CHANS ((MAX_ADEVS) * 2)
|
||||
|
||||
/*
|
||||
* Get audio device number for given channel.
|
||||
* and first channel for given device.
|
||||
*/
|
||||
|
||||
#define ACHAN2ADEV(n) ((n)>>1)
|
||||
#define ADEVFIRSTCHAN(n) ((n) * 2)
|
||||
|
||||
/*
|
||||
* Maximum number of modems per channel.
|
||||
* I called them "subchannels" (in the code) because
|
||||
* it is short and unambiguous.
|
||||
* Nothing magic about the number. Could be larger
|
||||
* but CPU demands might be overwhelming.
|
||||
*/
|
||||
|
||||
#define MAX_SUBCHANS 9
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
#include <windows.h>
|
||||
#define SLEEP_SEC(n) Sleep((n)*1000)
|
||||
#define SLEEP_MS(n) Sleep(n)
|
||||
#else
|
||||
#define SLEEP_SEC(n) sleep(n)
|
||||
#define SLEEP_MS(n) usleep((n)*1000)
|
||||
#endif
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
#define PTW32_STATIC_LIB
|
||||
#include "pthreads/pthread.h"
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Not sure where to put these. */
|
||||
|
||||
/* Prefix with DW_ because /usr/include/gps.h uses a couple of these names. */
|
||||
|
||||
|
||||
#define DW_METERS_TO_FEET(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 3.2808399)
|
||||
#define DW_FEET_TO_METERS(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.3048)
|
||||
#define DW_KM_TO_MILES(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.621371192)
|
||||
|
||||
#define DW_KNOTS_TO_MPH(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 1.15077945)
|
||||
#define DW_KNOTS_TO_METERS_PER_SEC(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.51444444444)
|
||||
#define DW_MPH_TO_KNOTS(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.868976)
|
||||
#define DW_MPH_TO_METERS_PER_SEC(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.44704)
|
||||
|
||||
#define DW_MBAR_TO_INHG(x) ((x) == G_UNKNOWN ? G_UNKNOWN : (x) * 0.0295333727)
|
||||
|
||||
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
|
||||
typedef CRITICAL_SECTION dw_mutex_t;
|
||||
|
||||
#define dw_mutex_init(x) \
|
||||
InitializeCriticalSection (x)
|
||||
|
||||
/* This one waits for lock. */
|
||||
|
||||
#define dw_mutex_lock(x) \
|
||||
EnterCriticalSection (x)
|
||||
|
||||
/* Returns non-zero if lock was obtained. */
|
||||
|
||||
#define dw_mutex_try_lock(x) \
|
||||
TryEnterCriticalSection (x)
|
||||
|
||||
#define dw_mutex_unlock(x) \
|
||||
LeaveCriticalSection (x)
|
||||
|
||||
|
||||
#else
|
||||
|
||||
typedef pthread_mutex_t dw_mutex_t;
|
||||
|
||||
#define dw_mutex_init(x) pthread_mutex_init (x, NULL)
|
||||
|
||||
/* this one will wait. */
|
||||
|
||||
#define dw_mutex_lock(x) \
|
||||
{ \
|
||||
int err; \
|
||||
err = pthread_mutex_lock (x); \
|
||||
if (err != 0) { \
|
||||
text_color_set(DW_COLOR_ERROR); \
|
||||
dw_printf ("INTERNAL ERROR %s %d pthread_mutex_lock returned %d", __FILE__, __LINE__, err); \
|
||||
exit (1); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* This one returns true if lock successful, false if not. */
|
||||
/* pthread_mutex_trylock returns 0 for success. */
|
||||
|
||||
#define dw_mutex_try_lock(x) \
|
||||
({ \
|
||||
int err; \
|
||||
err = pthread_mutex_trylock (x); \
|
||||
if (err != 0 && err != EBUSY) { \
|
||||
text_color_set(DW_COLOR_ERROR); \
|
||||
dw_printf ("INTERNAL ERROR %s %d pthread_mutex_trylock returned %d", __FILE__, __LINE__, err); \
|
||||
exit (1); \
|
||||
} ; \
|
||||
! err; \
|
||||
})
|
||||
|
||||
#define dw_mutex_unlock(x) \
|
||||
{ \
|
||||
int err; \
|
||||
err = pthread_mutex_unlock (x); \
|
||||
if (err != 0) { \
|
||||
text_color_set(DW_COLOR_ERROR); \
|
||||
dw_printf ("INTERNAL ERROR %s %d pthread_mutex_unlock returned %d", __FILE__, __LINE__, err); \
|
||||
exit (1); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* ifndef DIREWOLF_H */
|
|
@ -1,62 +0,0 @@
|
|||
Name: direwolf
|
||||
Version: 1.1b1
|
||||
Release: 1%{?dist}
|
||||
Summary: Soundcard based AX.25 TNC
|
||||
|
||||
Group: Applications/Communications
|
||||
License: GPLv2
|
||||
URL: http://home.comcast.net/~wb2osz
|
||||
Source0: http://home.comcast.net/~wb2osz/Version%201.1/direwolf-%{version}.tgz
|
||||
Packager: David Ranch (KI6ZHD) <dranch@trinnet.net>
|
||||
Distribution: RedHat Linux
|
||||
|
||||
Patch0: direwolf-makefile7.patch
|
||||
|
||||
BuildRequires: automake
|
||||
BuildRequires: alsa-lib-devel
|
||||
|
||||
|
||||
%description
|
||||
Dire Wolf is a software "soundcard" modem/TNC and APRS encoder/decoder. It can
|
||||
be used stand-alone to receive APRS messages, as a digipeater, APRStt gateway,
|
||||
or Internet Gateway (IGate). It can also be used as a virtual TNC for other
|
||||
applications such as APRSIS32, UI-View32, Xastir, APRS-TW, YAAC, UISS,
|
||||
Linux AX25, SARTrack, RMS Express, and many others.
|
||||
|
||||
%prep
|
||||
|
||||
%setup -q -n %{name}-%{version}
|
||||
%patch0 -p0
|
||||
|
||||
%build
|
||||
make -f Makefile.linux tocalls-symbols
|
||||
make %{?_smp_mflags} -f Makefile.linux
|
||||
|
||||
|
||||
%install
|
||||
make -f Makefile.linux install DESTDIR=$RPM_BUILD_ROOT
|
||||
make -f Makefile.linux install-conf DESTDIR=$RPM_BUILD_ROOT
|
||||
|
||||
# Install icon
|
||||
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/pixmaps/
|
||||
cp dw-icon.png ${RPM_BUILD_ROOT}%{_datadir}/pixmaps/
|
||||
mv symbols-new.txt ${RPM_BUILD_ROOT}%{_docdir}/%{name}/
|
||||
mv symbolsX.txt ${RPM_BUILD_ROOT}%{_docdir}/%{name}/
|
||||
mv tocalls.txt ${RPM_BUILD_ROOT}%{_docdir}/%{name}/
|
||||
desktop-file-install \
|
||||
--dir=${RPM_BUILD_ROOT}%{_datadir}/applications direwolf.desktop
|
||||
|
||||
|
||||
%files
|
||||
%{_sysconfdir}/ax25/direwolf.conf
|
||||
%{_bindir}/*
|
||||
%{_datadir}/pixmaps/dw-icon.png
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_datadir}/direwolf/*
|
||||
%{_docdir}/%{name}/*
|
||||
|
||||
|
||||
|
||||
%changelog
|
||||
* Sat Dec 20 2014 David Ranch <dranch@trinnet.net> - 1.1b1-1
|
||||
- new spec file
|
532
direwolf.txt
532
direwolf.txt
|
@ -1,532 +0,0 @@
|
|||
C#############################################################
|
||||
C# #
|
||||
C# Configuration file for Dire Wolf #
|
||||
C# #
|
||||
L# Linux version #
|
||||
W# Windows version #
|
||||
C# #
|
||||
C#############################################################
|
||||
R
|
||||
R
|
||||
R The sample config file was getting pretty messy
|
||||
R with the Windows and Linux differences.
|
||||
R It would be a maintenance burden to keep most of
|
||||
R two different versions in sync.
|
||||
R This common source is now used to generate the
|
||||
R two different variations while having only a single
|
||||
R copy of the common parts.
|
||||
R
|
||||
R The first column contains one of the following:
|
||||
R
|
||||
R R remark which is discarded.
|
||||
R C common to both versions.
|
||||
R W Windows version only.
|
||||
R L Linux version only.
|
||||
R
|
||||
C#
|
||||
C# Consult the User Guide for more details on configuration options.
|
||||
C#
|
||||
C#
|
||||
C# These are the most likely settings you might change:
|
||||
C#
|
||||
C# (1) MYCALL - call sign and SSID for your station.
|
||||
C#
|
||||
C# Look for lines starting with MYCALL and
|
||||
C# change NOCALL to your own.
|
||||
C#
|
||||
C# (2) PBEACON - enable position beaconing.
|
||||
C#
|
||||
C# Look for lines starting with PBEACON and
|
||||
C# modify for your call, location, etc.
|
||||
C#
|
||||
C# (3) DIGIPEATER - configure digipeating rules.
|
||||
C#
|
||||
C# Look for lines starting with DIGIPEATER.
|
||||
C# Most people will probably use the given example.
|
||||
C# Just remove the "#" from the start of the line
|
||||
C# to enable it.
|
||||
C#
|
||||
C# (4) IGSERVER, IGLOGIN - IGate server and login
|
||||
C#
|
||||
C# Configure an IGate client to relay messages between
|
||||
C# radio and internet servers.
|
||||
C#
|
||||
C#
|
||||
C# The default location is "direwolf.conf" in the current working directory.
|
||||
L# On Linux, the user's home directory will also be searched.
|
||||
C# An alternate configuration file location can be specified with the "-c" command line option.
|
||||
C#
|
||||
C# As you probably guessed by now, # indicates a comment line.
|
||||
C#
|
||||
C# Remove the # at the beginning of a line if you want to use a sample
|
||||
C# configuration that is currently commented out.
|
||||
C#
|
||||
C# Commands are a keyword followed by parameters.
|
||||
C#
|
||||
C# Command key words are case insensitive. i.e. upper and lower case are equivalent.
|
||||
C#
|
||||
C# Command parameters are generally case sensitive. i.e. upper and lower case are different.
|
||||
C#
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# FIRST AUDIO DEVICE PROPERTIES #
|
||||
C# (Channel 0 + 1 if in stereo) #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#
|
||||
C# Many people will simply use the default sound device.
|
||||
C# Some might want to use an alternative device by chosing it here.
|
||||
C#
|
||||
W# When the Windows version starts up, it displays something like
|
||||
W# this with the available sound devices and capabilities:
|
||||
W#
|
||||
W# Available audio input devices for receive (*=selected):
|
||||
W# * 0: Microphone (C-Media USB Headpho (channel 2)
|
||||
W# 1: Microphone (Bluetooth SCO Audio
|
||||
W# 2: Microphone (Bluetooth AV Audio)
|
||||
W# * 3: Microphone (Realtek High Defini (channels 0 & 1)
|
||||
W# Available audio output devices for transmit (*=selected):
|
||||
W# * 0: Speakers (C-Media USB Headphone (channel 2)
|
||||
W# 1: Speakers (Bluetooth SCO Audio)
|
||||
W# 2: Realtek Digital Output(Optical)
|
||||
W# 3: Speakers (Bluetooth AV Audio)
|
||||
W# * 4: Speakers (Realtek High Definiti (channels 0 & 1)
|
||||
W# 5: Realtek Digital Output (Realtek
|
||||
W#
|
||||
W# Example: To use the microphone and speaker connections on the
|
||||
W# system board, either of these forms can be used:
|
||||
W
|
||||
W#ADEVICE High
|
||||
W#ADEVICE 3 4
|
||||
W
|
||||
W
|
||||
W# Example: To use the USB Audio, use a command like this with
|
||||
W# the input and output device numbers. (Remove the # comment character.)
|
||||
W#ADEVICE USB
|
||||
W
|
||||
W# The position in the list can change when devices (e.g. USB) are added and removed.
|
||||
W# You can also specify devices by using part of the name.
|
||||
W# Here is an example of specifying the USB Audio device.
|
||||
W# This is case-sensitive. Upper and lower case are not treated the same.
|
||||
W
|
||||
W#ADEVICE USB
|
||||
W
|
||||
W
|
||||
L# Linux ALSA is complicated. See User Guide for discussion.
|
||||
L# To use something other than the default, generally use plughw
|
||||
L# and a card number reported by "arecord -l" command. Example:
|
||||
L
|
||||
L# ADEVICE plughw:1,0
|
||||
L
|
||||
L# Starting with version 1.0, you can also use "-" or "stdin" to
|
||||
L# pipe stdout from some other application such as a software defined
|
||||
L# radio. You can also specify "UDP:" and an optional port for input.
|
||||
L# Something different must be specified for output.
|
||||
L
|
||||
W# ADEVICE - 0
|
||||
W# ADEVICE UDP:7355 0
|
||||
L# ADEVICE - plughw:1,0
|
||||
L# ADEVICE UDP:7355 default
|
||||
L
|
||||
L
|
||||
C
|
||||
C#
|
||||
C# Number of audio channels for this souncard: 1 or 2.
|
||||
C#
|
||||
C
|
||||
CACHANNELS 1
|
||||
C#ACHANNELS 2
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# SECOND AUDIO DEVICE PROPERTIES #
|
||||
C# (Channel 2 + 3 if in stereo) #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#ADEVICE1 ...
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# THIRD AUDIO DEVICE PROPERTIES #
|
||||
C# (Channel 4 + 5 if in stereo) #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#ADEVICE2 ...
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# CHANNEL 0 PROPERTIES #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
CCHANNEL 0
|
||||
C
|
||||
C#
|
||||
C# The following MYCALL, MODEM, PTT, etc. configuration items
|
||||
C# apply to the most recent CHANNEL.
|
||||
C#
|
||||
C
|
||||
C#
|
||||
C# Station identifier for this channel.
|
||||
C# Multiple channels can have the same or different names.
|
||||
C#
|
||||
C# It can be up to 6 letters and digits with an optional ssid.
|
||||
C# The APRS specification requires that it be upper case.
|
||||
C#
|
||||
C# Example (don't use this unless you are me): MYCALL WB2OSZ-5
|
||||
C#
|
||||
C
|
||||
CMYCALL N0CALL
|
||||
C
|
||||
C#
|
||||
C# Pick a suitable modem speed based on your situation.
|
||||
C# 1200 Most common for VHF/UHF. Default if not specified.
|
||||
C# 300 Low speed for HF SSB.
|
||||
C# 9600 High speed - Can't use Microphone and Speaker connections.
|
||||
C#
|
||||
C# In the simplest form, just specify the speed.
|
||||
C#
|
||||
C
|
||||
CMODEM 1200
|
||||
C#MODEM 300
|
||||
C#MODEM 9600
|
||||
C
|
||||
C#
|
||||
C# These are the defaults should be fine for most cases. In special situations,
|
||||
C# you might want to specify different AFSK tones or the baseband mode which does
|
||||
C# not use AFSK.
|
||||
C#
|
||||
C#MODEM 1200 1200:2200
|
||||
C#MODEM 300 1600:1800
|
||||
C#MODEM 9600 0:0
|
||||
C#
|
||||
C#
|
||||
C# On HF SSB, you might want to use multiple demodulators on slightly different
|
||||
C# frequencies to compensate for stations off frequency. Here we have 7 different
|
||||
C# demodulators at 30 Hz intervals. This takes a lot of CPU power so you will
|
||||
C# probably need to reduce the audio sampling rate with the /n option.
|
||||
C
|
||||
C#MODEM 300 1600:1800 7@30 /4
|
||||
C
|
||||
C
|
||||
C#
|
||||
C# Uncomment line below to enable the DTMF decoder for this channel.
|
||||
C#
|
||||
C
|
||||
C#DTMF
|
||||
C
|
||||
C#
|
||||
C# If not using a VOX circuit, the transmitter Push to Talk (PTT)
|
||||
C# control is usually wired to a serial port with a suitable interface circuit.
|
||||
C# DON'T connect it directly!
|
||||
C#
|
||||
C# For the PTT command, specify the device and either RTS or DTR.
|
||||
C# RTS or DTR may be preceded by "-" to invert the signal.
|
||||
C# Both can be used for interfaces that want them driven with opposite polarity.
|
||||
C#
|
||||
L# COM1 can be used instead of /dev/ttyS0, COM2 for /dev/ttyS1, and so on.
|
||||
L#
|
||||
C
|
||||
C#PTT COM1 RTS
|
||||
C#PTT COM1 RTS -DTR
|
||||
L#PTT /dev/ttyUSB0 RTS
|
||||
C
|
||||
L#
|
||||
L# On Linux, you can also use general purpose I/O pins if
|
||||
L# your system is configured for user access to them.
|
||||
L# This would apply mostly to microprocessor boards, not a regular PC.
|
||||
L# See separate Raspberry Pi document for more details.
|
||||
L# The number may be preceded by "-" to invert the signal.
|
||||
L#
|
||||
L
|
||||
L#PTT GPIO 25
|
||||
L
|
||||
C# The Data Carrier Detect (DCD) signal can be sent to the same places
|
||||
C# as the PTT signal. This could be used to light up an LED like a normal TNC.
|
||||
C
|
||||
C#DCD COM1 -DTR
|
||||
L#DCD GPIO 24
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# CHANNEL 1 PROPERTIES #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#CHANNEL 1
|
||||
C
|
||||
C#
|
||||
C# Specify MYCALL, MODEM, PTT, etc. configuration items for
|
||||
C# CHANNEL 1. Repeat for any other channels.
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# TEXT TO SPEECH COMMAND FILE #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
W#SPEECH dwespeak.bat
|
||||
L#SPEECH dwespeak.sh
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# VIRTUAL TNC SERVER PROPERTIES #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#
|
||||
C# Dire Wolf acts as a virtual TNC and can communicate with
|
||||
C# client applications by different protocols:
|
||||
C#
|
||||
C# - the "AGW TCPIP Socket Interface" - default port 8000
|
||||
C# - KISS protocol over TCP socket - default port 8001
|
||||
W# - KISS TNC via serial port
|
||||
L# - KISS TNC via pseudo terminal (-p command line option)
|
||||
C#
|
||||
C
|
||||
CAGWPORT 8000
|
||||
CKISSPORT 8001
|
||||
C
|
||||
W#
|
||||
W# Some applications are designed to operate with only a physical
|
||||
W# TNC attached to a serial port. For these, we provide a virtual serial
|
||||
W# port that appears to be connected to a TNC.
|
||||
W#
|
||||
W# Take a look at the User Guide for instructions to set up
|
||||
W# two virtual serial ports named COM3 and COM4 connected by
|
||||
W# a null modem.
|
||||
W#
|
||||
W# Using the configuration described, Dire Wolf will connect to
|
||||
W# COM3 and the client application will use COM4.
|
||||
W#
|
||||
W# Uncomment following line to use this feature.
|
||||
W
|
||||
W#NULLMODEM COM3
|
||||
W
|
||||
W
|
||||
C#
|
||||
C# It is sometimes possible to recover frames with a bad FCS.
|
||||
C# This applies to all channels.
|
||||
C#
|
||||
C# 0 [NONE] - Don't try to repair.
|
||||
C# 1 [SINGLE] - Attempt to fix single bit error. (default)
|
||||
C# 2 [DOUBLE] - Also attempt to fix two adjacent bits.
|
||||
C# ... see User Guide for more values and in-depth discussion.
|
||||
C#
|
||||
C
|
||||
C#FIX_BITS 0
|
||||
C
|
||||
C#
|
||||
C#############################################################
|
||||
C# #
|
||||
C# BEACONING PROPERTIES #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C
|
||||
C#
|
||||
C# Beaconing is configured with these two commands:
|
||||
C#
|
||||
C# PBEACON - for a position report (usually yourself)
|
||||
C# OBEACON - for an object report (usually some other entity)
|
||||
C#
|
||||
C# Each has a series of keywords and values for options.
|
||||
C# See User Guide for details.
|
||||
C#
|
||||
C# Example:
|
||||
C#
|
||||
C# This results in a broadcast once every 10 minutes.
|
||||
C# Every half hour, it can travel via two digipeater hops.
|
||||
C# The others are kept local.
|
||||
C#
|
||||
C
|
||||
C#PBEACON delay=1 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA" via=WIDE1-1,WIDE2-1
|
||||
C#PBEACON delay=11 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
C#PBEACON delay=21 every=30 overlay=S symbol="digi" lat=42^37.14N long=071^20.83W power=50 height=20 gain=4 comment="Chelmsford MA"
|
||||
C
|
||||
C
|
||||
C# With UTM coordinates instead of latitude and longitude.
|
||||
C
|
||||
C#PBEACON delay=1 every=10 overlay=S symbol="digi" zone=19T easting=307477 northing=4720178
|
||||
C
|
||||
C
|
||||
C#
|
||||
C# When the destination field is set to "SPEECH" the information part is
|
||||
C# converted to speech rather than transmitted as a data frame.
|
||||
C#
|
||||
C
|
||||
C#CBEACON dest="SPEECH" info="Club meeting tonight at 7 pm."
|
||||
C
|
||||
C
|
||||
C#
|
||||
C# Modify for your particular situation before removing
|
||||
C# the # comment character from the beginning of appropriate lines above.
|
||||
C#
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# DIGIPEATER PROPERTIES #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#
|
||||
C# For most common situations, use something like this by removing
|
||||
C# the "#" from the beginning of the line below.
|
||||
C#
|
||||
C
|
||||
C#DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$|^TEST$ ^WIDE[12]-[12]$ TRACE
|
||||
C
|
||||
C# See User Guide for more explanation of what this means and how
|
||||
C# it can be customized for your particular needs.
|
||||
C
|
||||
C# Filtering can be used to limit was is digipeated.
|
||||
C# For example, only weather weather reports, received on channel 0,
|
||||
C# will be retransmitted on channel 1.
|
||||
C#
|
||||
C
|
||||
C#FILTER 0 1 t/wn
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# INTERNET GATEWAY #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C# First you need to specify the name of a Tier 2 server.
|
||||
C# The current preferred way is to use one of these regional rotate addresses:
|
||||
C
|
||||
C# noam.aprs2.net - for North America
|
||||
C# soam.aprs2.net - for South America
|
||||
C# euro.aprs2.net - for Europe and Africa
|
||||
C# asia.aprs2.net - for Asia
|
||||
C# aunz.aprs2.net - for Oceania
|
||||
C
|
||||
C#IGSERVER noam.aprs2.net
|
||||
C
|
||||
C# You also need to specify your login name and passcode.
|
||||
C# Contact the author if you can't figure out how to generate the passcode.
|
||||
C
|
||||
C#IGLOGIN WB2OSZ-5 123456
|
||||
C
|
||||
C# That's all you need for a receive only IGate which relays
|
||||
C# messages from the local radio channel to the global servers.
|
||||
C
|
||||
C# Some might want to send an IGate client position directly to a server
|
||||
C# without sending it over the air and relying on someone else to
|
||||
C# forward it to an IGate server. This is done by using sendto=IG rather
|
||||
C# than a radio channel number. Overlay R for receive only, T for two way.
|
||||
C
|
||||
C#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=R lat=42^37.14N long=071^20.83W
|
||||
C#PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=T lat=42^37.14N long=071^20.83W
|
||||
C
|
||||
C
|
||||
C# To relay messages from the Internet to radio, you need to add
|
||||
C# one more option with the transmit channel number and a VIA path.
|
||||
C
|
||||
C#IGTXVIA 0 WIDE1-1
|
||||
C
|
||||
C# You might want to apply a filter for what packets will be obtained from the server.
|
||||
C# Read about filters here: http://www.aprs-is.net/javaprsfilter.aspx
|
||||
C# Example, positions and objects within 50 km of my location:
|
||||
C
|
||||
C#IGFILTER m/50
|
||||
C
|
||||
C# That is known as a server-side filter. It is processed by the IGate server.
|
||||
C# You can also apply local filtering to limit what will be transmitted on the
|
||||
C# RF side. For example, transmit only "messages" on channel 0 and weather
|
||||
C# reports on channel 1.
|
||||
C
|
||||
C#FILTER IG 0 t/m
|
||||
C#FILTER IG 1 t/wn
|
||||
C
|
||||
C# Finally, we don't want to flood the radio channel.
|
||||
C# The IGate function will limit the number of packets transmitted
|
||||
C# during 1 minute and 5 minute intervals. If a limit would
|
||||
C# be exceeded, the packet is dropped and message is displayed in red.
|
||||
C
|
||||
CIGTXLIMIT 6 10
|
||||
C
|
||||
C
|
||||
C#############################################################
|
||||
C# #
|
||||
C# APRStt GATEWAY #
|
||||
C# #
|
||||
C#############################################################
|
||||
C
|
||||
C#
|
||||
C# Dire Wolf can receive DTMF (commonly known as Touch Tone)
|
||||
C# messages and convert them to packet objects.
|
||||
C#
|
||||
C# See separate "APRStt-Implementation-Notes" document for details.
|
||||
C#
|
||||
C
|
||||
C#
|
||||
C# Sample gateway configuration based on:
|
||||
C#
|
||||
C# http://www.aprs.org/aprstt/aprstt-coding24.txt
|
||||
C# http://www.aprs.org/aprs-jamboree-2013.html
|
||||
C#
|
||||
C
|
||||
C# Define specific points.
|
||||
C
|
||||
CTTPOINT B01 37^55.37N 81^7.86W
|
||||
CTTPOINT B7495088 42.605237 -71.34456
|
||||
CTTPOINT B934 42.605237 -71.34456
|
||||
C
|
||||
CTTPOINT B901 42.661279 -71.364452
|
||||
CTTPOINT B902 42.660411 -71.364419
|
||||
CTTPOINT B903 42.659046 -71.364452
|
||||
CTTPOINT B904 42.657578 -71.364602
|
||||
C
|
||||
C
|
||||
C# For location at given bearing and distance from starting point.
|
||||
C
|
||||
CTTVECTOR B5bbbddd 37^55.37N 81^7.86W 0.01 mi
|
||||
C
|
||||
C# For location specified by x, y coordinates.
|
||||
C
|
||||
CTTGRID Byyyxxx 37^50.00N 81^00.00W 37^59.99N 81^09.99W
|
||||
C
|
||||
C# UTM location for Lowell-Dracut-Tyngsborough State Forest.
|
||||
C
|
||||
CTTUTM B6xxxyyy 19T 10 300000 4720000
|
||||
C
|
||||
C
|
||||
C
|
||||
C# Location for the corral.
|
||||
C
|
||||
CTTCORRAL 37^55.50N 81^7.00W 0^0.02N
|
||||
C
|
||||
C# Compact messages - Fixed locations xx and object yyy where
|
||||
C# Object numbers 100 - 199 = bicycle
|
||||
C# Object numbers 200 - 299 = fire truck
|
||||
C# Others = dog
|
||||
C
|
||||
CTTMACRO xx1yy B9xx*AB166*AA2B4C5B3B0A1yy
|
||||
CTTMACRO xx2yy B9xx*AB170*AA3C4C7C3B0A2yy
|
||||
CTTMACRO xxyyy B9xx*AB180*AA3A6C4A0Ayyy
|
||||
C
|
||||
CTTMACRO z Cz
|
||||
C
|
||||
C# Receive on channel 0, Transmit object reports on channel 1 with optional via path.
|
||||
C
|
||||
C#TTOBJ 0 1 WIDE1-1
|
||||
C
|
||||
C# Advertise gateway position with beacon.
|
||||
C
|
||||
C# OBEACON DELAY=0:15 EVERY=10:00 VIA=WIDE1-1 OBJNAME=WB2OSZ-tt SYMBOL=APRStt LAT=42^37.14N LONG=71^20.83W COMMENT="APRStt Gateway"
|
||||
C
|
||||
C
|
630
dlq.c
630
dlq.c
|
@ -1,630 +0,0 @@
|
|||
|
||||
//
|
||||
// This file is part of Dire Wolf, an amateur radio packet TNC.
|
||||
//
|
||||
// Copyright (C) 2014, 2015 John Langner, WB2OSZ
|
||||
//
|
||||
// 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
|
||||
// the Free Software Foundation, either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Module: dlq.c
|
||||
*
|
||||
* Purpose: Received frame queue.
|
||||
*
|
||||
* Description: In previous versions, the main thread read from the
|
||||
* audio device and performed the receive demodulation/decoding.
|
||||
* In version 1.2 we now have a seprate receive thread
|
||||
* for each audio device. This queue is used to collect
|
||||
* received frames from all channels and process them
|
||||
* serially.
|
||||
*
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "direwolf.h"
|
||||
#include "ax25_pad.h"
|
||||
#include "textcolor.h"
|
||||
#include "audio.h"
|
||||
#include "dlq.h"
|
||||
#include "dedupe.h"
|
||||
|
||||
|
||||
/* The queue is a linked list of these. */
|
||||
|
||||
struct dlq_item_s {
|
||||
|
||||
struct dlq_item_s *nextp; /* Next item in queue. */
|
||||
|
||||
dlq_type_t type; /* Type of item. */
|
||||
/* Only received frames at this time. */
|
||||
|
||||
int chan; /* Radio channel of origin. */
|
||||
|
||||
int subchan; /* Winning "subchannel" when using multiple */
|
||||
/* decoders on one channel. */
|
||||
/* Special case, -1 means DTMF decoder. */
|
||||
/* Maybe we should have a different type in this case? */
|
||||
|
||||
packet_t pp; /* Pointer to frame structure. */
|
||||
|
||||
alevel_t alevel; /* Audio level. */
|
||||
|
||||
retry_t retries; /* Effort expended to get a valid CRC. */
|
||||
|
||||
char spectrum[MAX_SUBCHANS+1]; /* "Spectrum" display for multi-decoders. */
|
||||
|
||||
};
|
||||
|
||||
|
||||
static struct dlq_item_s *queue_head = NULL; /* Head of linked list for queue. */
|
||||
|
||||
#if __WIN32__
|
||||
|
||||
// TODO1.2: use dw_mutex_t
|
||||
|
||||
static CRITICAL_SECTION dlq_cs; /* Critical section for updating queues. */
|
||||
|
||||
static HANDLE wake_up_event; /* Notify received packet processing thread when queue not empty. */
|
||||
|
||||
#else
|
||||
|
||||
static pthread_mutex_t dlq_mutex; /* Critical section for updating queues. */
|
||||
|
||||
static pthread_cond_t wake_up_cond; /* Notify received packet processing thread when queue not empty. */
|
||||
|
||||
static pthread_mutex_t wake_up_mutex; /* Required by cond_wait. */
|
||||
|
||||
static int recv_thread_is_waiting = 0;
|
||||
|
||||
#endif
|
||||
|
||||
static int dlq_is_empty (void);
|
||||
|
||||
static int was_init = 0; /* was initialization performed? */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: dlq_init
|
||||
*
|
||||
* Purpose: Initialize the queue.
|
||||
*
|
||||
* Inputs: None.
|
||||
*
|
||||
* Outputs:
|
||||
*
|
||||
* Description: Initialize the queue to be empty and set up other
|
||||
* mechanisms for sharing it between different threads.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
|
||||
void dlq_init (void)
|
||||
{
|
||||
int c, p;
|
||||
int err;
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_init ( )\n");
|
||||
#endif
|
||||
|
||||
queue_head = NULL;
|
||||
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_init: pthread_mutex_init...\n");
|
||||
#endif
|
||||
|
||||
#if __WIN32__
|
||||
InitializeCriticalSection (&dlq_cs);
|
||||
#else
|
||||
err = pthread_mutex_init (&wake_up_mutex, NULL);
|
||||
err = pthread_mutex_init (&dlq_mutex, NULL);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_init: pthread_mutex_init err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_init: pthread_cond_init...\n");
|
||||
#endif
|
||||
|
||||
#if __WIN32__
|
||||
|
||||
wake_up_event = CreateEvent (NULL, 0, 0, NULL);
|
||||
|
||||
if (wake_up_event == NULL) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_init: pthread_cond_init: can't create receive wake up event");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
#else
|
||||
err = pthread_cond_init (&wake_up_cond, NULL);
|
||||
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_init: pthread_cond_init returns %d\n", err);
|
||||
#endif
|
||||
|
||||
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_init: pthread_cond_init err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
recv_thread_is_waiting = 0;
|
||||
#endif
|
||||
|
||||
was_init = 1;
|
||||
|
||||
} /* end dlq_init */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: dlq_append
|
||||
*
|
||||
* Purpose: Add a packet to the end of the specified receive queue.
|
||||
*
|
||||
* Inputs: type - One of the following:
|
||||
*
|
||||
* DLQ_REC_FRAME - Frame received from radio.
|
||||
*
|
||||
* chan - Channel, 0 is first.
|
||||
*
|
||||
* subchan - Which modem caught it.
|
||||
* Special case -1 for APRStt gateway.
|
||||
*
|
||||
* pp - Address of packet object.
|
||||
* Caller should NOT make any references to
|
||||
* it after this point because it could
|
||||
* be deleted at any time.
|
||||
*
|
||||
* alevel - Audio level, range of 0 - 100.
|
||||
* (Special case, use negative to skip
|
||||
* display of audio level line.
|
||||
* Use -2 to indicate DTMF message.)
|
||||
*
|
||||
* retries - Level of bit correction used.
|
||||
*
|
||||
* spectrum - Display of how well multiple decoders did.
|
||||
*
|
||||
*
|
||||
* Outputs: Information is appended to queue.
|
||||
*
|
||||
* Description: Add item to end of linked list.
|
||||
* Signal the receive processing thread if the queue was formerly empty.
|
||||
*
|
||||
* IMPORTANT! Don't make an further references to the packet object after
|
||||
* giving it to dlq_append.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
void dlq_append (dlq_type_t type, int chan, int subchan, packet_t pp, alevel_t alevel, retry_t retries, char *spectrum)
|
||||
{
|
||||
|
||||
struct dlq_item_s *pnew;
|
||||
struct dlq_item_s *plast;
|
||||
int err;
|
||||
int queue_length = 0;
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_append (type=%d, chan=%d, pp=%p, ...)\n", type, chan, pp);
|
||||
#endif
|
||||
|
||||
if ( ! was_init) {
|
||||
dlq_init ();
|
||||
}
|
||||
|
||||
#if AX25MEMDEBUG
|
||||
|
||||
if (ax25memdebug_get()) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_append (type=%d, chan=%d.%d, seq=%d, ...)\n", type, chan, subchan, ax25memdebug_seq(pp));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Allocate a new queue item. */
|
||||
|
||||
pnew = (struct dlq_item_s *) calloc (sizeof(struct dlq_item_s), 1);
|
||||
|
||||
pnew->nextp = NULL;
|
||||
pnew->type = type;
|
||||
pnew->chan = chan;
|
||||
pnew->subchan = subchan;
|
||||
pnew->pp = pp;
|
||||
pnew->alevel = alevel;
|
||||
pnew->retries = retries;
|
||||
if (spectrum == NULL)
|
||||
strcpy(pnew->spectrum, "");
|
||||
else
|
||||
strcpy(pnew->spectrum, spectrum);
|
||||
|
||||
#if DEBUG1
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_append: enter critical section\n");
|
||||
#endif
|
||||
#if __WIN32__
|
||||
EnterCriticalSection (&dlq_cs);
|
||||
#else
|
||||
err = pthread_mutex_lock (&dlq_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_append: pthread_mutex_lock err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (queue_head == NULL) {
|
||||
queue_head = pnew;
|
||||
queue_length = 1;
|
||||
}
|
||||
else {
|
||||
queue_length = 2; /* head + new one */
|
||||
plast = queue_head;
|
||||
while (plast->nextp != NULL) {
|
||||
plast = plast->nextp;
|
||||
queue_length++;
|
||||
}
|
||||
plast->nextp = pnew;
|
||||
}
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
LeaveCriticalSection (&dlq_cs);
|
||||
#else
|
||||
err = pthread_mutex_unlock (&dlq_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_append: pthread_mutex_unlock err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
#endif
|
||||
#if DEBUG1
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_append: left critical section\n");
|
||||
dw_printf ("dlq_append (): about to wake up recv processing thread.\n");
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Bug: June 2015, version 1.2
|
||||
*
|
||||
* It has long been known that we will eventually block trying to write to a
|
||||
* pseudo terminal if nothing is reading from the other end. There is even
|
||||
* a warning at start up time:
|
||||
*
|
||||
* Virtual KISS TNC is available on /dev/pts/2
|
||||
* WARNING - Dire Wolf will hang eventually if nothing is reading from it.
|
||||
* Created symlink /tmp/kisstnc -> /dev/pts/2
|
||||
*
|
||||
* In earlier versions, where the audio input and demodulation was in the main
|
||||
* thread, that would stop and it was pretty obvious something was wrong.
|
||||
* In version 1.2, the audio in / demodulating was moved to a device specific
|
||||
* thread. Packet objects are appended to this queue.
|
||||
*
|
||||
* The main thread should wake up and process them which includes printing and
|
||||
* forwarding to clients over multiple protocols and transport methods.
|
||||
* Just before the 1.2 release someone reported a memory leak which only showed
|
||||
* up after about 20 hours. It happened to be on a Cubie Board 2, which shouldn't
|
||||
* make a difference unless there was some operating system difference.
|
||||
* (cubieez 2.0 is based on Debian wheezy, just like Raspian.)
|
||||
*
|
||||
* The debug output revealed:
|
||||
*
|
||||
* It was using AX.25 for Linux (not APRS).
|
||||
* The pseudo terminal KISS interface was being used.
|
||||
* Transmitting was continuing fine. (So something must be writing to the other end.)
|
||||
* Frames were being received and appended to this queue.
|
||||
* They were not coming out of the queue.
|
||||
*
|
||||
* My theory is that writing to the the pseudo terminal is blocking so the
|
||||
* main thread is stopped. It's not taking anything from this queue and we detect
|
||||
* it as a memory leak.
|
||||
*
|
||||
* Add a new check here and complain if the queue is growing too large.
|
||||
* That will get us a step closer to the root cause.
|
||||
* This has been documented in the User Guide and the CHANGES.txt file which is
|
||||
* a minimal version of Release Notes.
|
||||
* The proper fix will be somehow avoiding or detecting the pseudo terminal filling up
|
||||
* and blocking on a write.
|
||||
*/
|
||||
|
||||
if (queue_length > 10) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("Received frame queue is out of control. Length=%d.\n", queue_length);
|
||||
dw_printf ("Reader thread is probably frozen.\n");
|
||||
dw_printf ("This can be caused by using a pseudo terminal (direwolf -p) where another\n");
|
||||
dw_printf ("application is not reading the frames from the other side.\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
SetEvent (wake_up_event);
|
||||
#else
|
||||
if (recv_thread_is_waiting) {
|
||||
|
||||
err = pthread_mutex_lock (&wake_up_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_append: pthread_mutex_lock wu err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
err = pthread_cond_signal (&wake_up_cond);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_append: pthread_cond_signal err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
err = pthread_mutex_unlock (&wake_up_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_append: pthread_mutex_unlock wu err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: dlq_wait_while_empty
|
||||
*
|
||||
* Purpose: Sleep while the received data queue is empty rather than
|
||||
* polling periodically.
|
||||
*
|
||||
* Inputs: None.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
|
||||
void dlq_wait_while_empty (void)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
||||
#if DEBUG1
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_wait_while_empty () \n");
|
||||
#endif
|
||||
|
||||
if ( ! was_init) {
|
||||
dlq_init ();
|
||||
}
|
||||
|
||||
|
||||
if (queue_head == NULL) {
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_wait_while_empty (): prepare to SLEEP - about to call cond wait\n");
|
||||
#endif
|
||||
|
||||
|
||||
#if __WIN32__
|
||||
WaitForSingleObject (wake_up_event, INFINITE);
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_wait_while_empty (): returned from wait\n");
|
||||
#endif
|
||||
|
||||
#else
|
||||
err = pthread_mutex_lock (&wake_up_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_wait_while_empty: pthread_mutex_lock wu err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
recv_thread_is_waiting = 1;
|
||||
err = pthread_cond_wait (&wake_up_cond, &wake_up_mutex);
|
||||
recv_thread_is_waiting = 0;
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_wait_while_empty (): WOKE UP - returned from cond wait, err = %d\n", err);
|
||||
#endif
|
||||
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_wait_while_empty: pthread_cond_wait err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
err = pthread_mutex_unlock (&wake_up_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_wait_while_empty: pthread_mutex_unlock wu err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_wait_while_empty () returns\n");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: dlq_remove
|
||||
*
|
||||
* Purpose: Remove an item from the head of the queue.
|
||||
*
|
||||
* Inputs: None.
|
||||
*
|
||||
* Outputs: type - type of queue entry.
|
||||
*
|
||||
* chan - channel of received frame.
|
||||
* subchan - which modem caught it.
|
||||
*
|
||||
* pp - pointer to packet object when type is DLQ_REC_FRAME.
|
||||
* Caller should destroy it with ax25_delete when finished with it.
|
||||
*
|
||||
* Returns: 1 for success.
|
||||
* 0 if queue is empty.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
int dlq_remove (dlq_type_t *type, int *chan, int *subchan, packet_t *pp, alevel_t *alevel, retry_t *retries, char *spectrum)
|
||||
{
|
||||
|
||||
struct dlq_item_s *phead;
|
||||
int result;
|
||||
int err;
|
||||
|
||||
#if DEBUG1
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_remove() enter critical section\n");
|
||||
#endif
|
||||
|
||||
if ( ! was_init) {
|
||||
dlq_init ();
|
||||
}
|
||||
|
||||
#if __WIN32__
|
||||
EnterCriticalSection (&dlq_cs);
|
||||
#else
|
||||
err = pthread_mutex_lock (&dlq_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_remove: pthread_mutex_lock err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (queue_head == NULL) {
|
||||
|
||||
*type = -1;
|
||||
*chan = -1;
|
||||
*subchan = -1;
|
||||
*pp = NULL;
|
||||
|
||||
memset (alevel, 0xff, sizeof(*alevel));
|
||||
|
||||
*retries = -1;
|
||||
strcpy(spectrum,"");
|
||||
result = 0;
|
||||
}
|
||||
else {
|
||||
|
||||
phead = queue_head;
|
||||
queue_head = queue_head->nextp;
|
||||
|
||||
*type = phead->type;
|
||||
*chan = phead->chan;
|
||||
*subchan = phead->subchan;
|
||||
*pp = phead->pp;
|
||||
*alevel = phead->alevel;
|
||||
*retries = phead->retries;
|
||||
strcpy (spectrum, phead->spectrum);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
#if __WIN32__
|
||||
LeaveCriticalSection (&dlq_cs);
|
||||
#else
|
||||
err = pthread_mutex_unlock (&dlq_mutex);
|
||||
if (err != 0) {
|
||||
text_color_set(DW_COLOR_ERROR);
|
||||
dw_printf ("dlq_remove: pthread_mutex_unlock err=%d", err);
|
||||
perror ("");
|
||||
exit (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_remove() returns type=%d, chan=%d\n", (int)(*type), *chan);
|
||||
#endif
|
||||
|
||||
#if AX25MEMDEBUG
|
||||
|
||||
if (ax25memdebug_get() && result) {
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dlq_remove (type=%d, chan=%d.%d, seq=%d, ...)\n", *type, *chan, *subchan, ax25memdebug_seq(*pp));
|
||||
}
|
||||
#endif
|
||||
if (result) {
|
||||
free (phead);
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------
|
||||
*
|
||||
* Name: dlq_is_empty
|
||||
*
|
||||
* Purpose: Test whether queue is empty.
|
||||
*
|
||||
* Inputs: None
|
||||
*
|
||||
* Returns: True if nothing in the queue.
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
|
||||
#if 0
|
||||
static int dlq_is_empty (void)
|
||||
{
|
||||
if (queue_head == NULL) {
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
|
||||
} /* end dlq_is_empty */
|
||||
#endif
|
||||
|
||||
/* end dlq.c */
|
30
dlq.h
30
dlq.h
|
@ -1,30 +0,0 @@
|
|||
|
||||
/*------------------------------------------------------------------
|
||||
*
|
||||
* Module: dlq.h
|
||||
*
|
||||
*---------------------------------------------------------------*/
|
||||
|
||||
#ifndef DLQ_H
|
||||
#define DLQ_H 1
|
||||
|
||||
#include "ax25_pad.h"
|
||||
#include "audio.h"
|
||||
|
||||
|
||||
void dlq_init (void);
|
||||
|
||||
/* Types of things that can be in queue. */
|
||||
|
||||
typedef enum dlq_type_e {DLQ_REC_FRAME} dlq_type_t;
|
||||
|
||||
void dlq_append (dlq_type_t type, int chan, int subchan, packet_t pp, alevel_t alevel, retry_t retries, char *spectrum);
|
||||
|
||||
void dlq_wait_while_empty (void);
|
||||
|
||||
int dlq_remove (dlq_type_t *type, int *chan, int *subchan, packet_t *pp, alevel_t *alevel, retry_t *retries, char *spectrum);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/* end dlq.h */
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,21 @@
|
|||
|
||||
install(FILES "${CUSTOM_DOC_DIR}/README.md" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/2400-4800-PSK-for-APRS-Packet-Radio.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/AIS-Reception.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/APRS-Telemetry-Toolkit.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/APRStt-Implementation-Notes.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/APRStt-interface-for-SARTrack.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/APRStt-Listening-Example.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/AX25_plus_FEC_equals_FX25.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Bluetooth-KISS-TNC.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Going-beyond-9600-baud.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Raspberry-Pi-APRS.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Raspberry-Pi-APRS-Tracker.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Raspberry-Pi-SDR-IGate.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Successful-APRS-IGate-Operation.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/User-Guide.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/WA8LMF-TNC-Test-CD-Results.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
||||
install(FILES "${CUSTOM_DOC_DIR}/Why-is-9600-only-twice-as-fast-as-1200.pdf" DESTINATION ${INSTALL_DOC_DIR})
|
Binary file not shown.
|
@ -0,0 +1,178 @@
|
|||
# Documentation for Dire Wolf #
|
||||
|
||||
Click on the document name to view in your web browser or the link following to download the PDF file.
|
||||
|
||||
|
||||
## Slide Show ##
|
||||
|
||||
Brief summary of packet radio / APRS history and the capbilities of Dire Wolf.
|
||||
|
||||
[Power Point presentation](https://github.com/wb2osz/direwolf-presentation) -- Why not give a talk at a local club meeting?
|
||||
|
||||
## Essential Reading ##
|
||||
|
||||
- [**User Guide**](User-Guide.pdf) [ [*download*](../../../raw/master/doc/User-Guide.pdf) ]
|
||||
|
||||
This is your primary source of information about installation, operation, and configuration.
|
||||
|
||||
- [**Raspberry Pi APRS**](Raspberry-Pi-APRS.pdf) [ [*download*](../../../raw/master/doc/Raspberry-Pi-APRS.pdf) ]
|
||||
|
||||
The Raspberry Pi has some special considerations that
|
||||
make it different from other generic Linux systems.
|
||||
Start here if using the Raspberry Pi, Beaglebone Black, cubieboard2, or similar single board computers.
|
||||
|
||||
|
||||
## Application Notes ##
|
||||
|
||||
These dive into more detail for specialized topics or typical usage scenarios.
|
||||
|
||||
|
||||
|
||||
- [**AX.25 + FEC = FX.25**](AX25_plus_FEC_equals_FX25.pdf) [ [*download*](../../../raw/dev/doc/AX25_plus_FEC_equals_FX25.pdf) ]
|
||||
|
||||
What can you do if your radio signal isn’t quite strong enough to get through reliably? Move to higher ground? Get a better antenna? More power? Use very narrow bandwidth and very slow data?
|
||||
|
||||
Sometimes those are not options. Another way to improve communication reliability is to add redundant information so the message will still get through even if small parts are missing. FX.25 adds forward error correction (FEC) which maintaining complete compatibility with older equipment.
|
||||
|
||||
|
||||
- [**AX.25 Throughput: Why is 9600 bps Packet Radio only twice as fast as 1200?**](Why-is-9600-only-twice-as-fast-as-1200.pdf) [ [*download*](../../../raw/dev/doc/Why-is-9600-only-twice-as-fast-as-1200.pdf) ]
|
||||
|
||||
Simply switching to a higher data rate will probably result in great disappointment. You might expect it to be 8 times faster but it can turn out to be only twice as fast.
|
||||
|
||||
In this document, we look at why a large increase in data bit rate can produce a much smaller increase in throughput. We will explore techniques that can be used to make large improvements and drastically speed up large data transfer.
|
||||
|
||||
|
||||
|
||||
|
||||
- [**Successful APRS IGate Operation**](Successful-APRS-IGate-Operation.pdf) [ [*download*](../../../raw/dev/doc/Successful-APRS-IGate-Operation.pdf) ]
|
||||
|
||||
|
||||
Dire Wolf can serve as a gateway between the APRS radio network and APRS-IS servers on the Internet.
|
||||
|
||||
This explains how it all works, proper configuration, and troubleshooting.
|
||||
|
||||
- [**Bluetooth KISS TNC**](Bluetooth-KISS-TNC.pdf) [ [*download*](../../../raw/master/doc/Bluetooth-KISS-TNC.pdf) ]
|
||||
|
||||
Eliminate the cable between your TNC and application. Use Bluetooth instead.
|
||||
|
||||
- [**APRStt Implementation Notes**](APRStt-Implementation-Notes.pdf) [ [*download*](../../../raw/master/doc/APRStt-Implementation-Notes.pdf) ]
|
||||
|
||||
Very few hams have portable equipment for APRS but nearly everyone has a handheld radio that can send DTMF tones. APRStt allows a user, equipped with only DTMF (commonly known as Touch Tone) generation capability, to enter information into the global APRS data network.
|
||||
This document explains how the APRStt concept was implemented in the Dire Wolf application.
|
||||
|
||||
- [**APRStt Interface for SARTrack**](APRStt-interface-for-SARTrack.pdf) [ [*download*](../../../raw/master/doc/APRStt-interface-for-SARTrack.pdf) ]
|
||||
|
||||
This example illustrates how APRStt can be integrated with other applications such as SARTrack, APRSISCE/32, YAAC, or Xastir.
|
||||
|
||||
- [**APRStt Listening Example**](APRStt-Listening-Example.pdf) [ [*download*](../../../raw/master/doc/APRStt-Listening-Example.pdf) ]
|
||||
|
||||
|
||||
WB4APR described a useful application for the [QIKCOM-2 Satallite Transponder](http://www.tapr.org/pipermail/aprssig/2015-November/045035.html).
|
||||
|
||||
Don’t have your own QIKCOM-2 Satellite Transponder? No Problem. You can do the same thing with an ordinary computer and the APRStt gateway built into Dire Wolf. Here’s how.
|
||||
|
||||
- [**Raspberry Pi APRS Tracker**](Raspberry-Pi-APRS-Tracker.pdf) [ [*download*](../../../raw/master/doc/Raspberry-Pi-APRS-Tracker.pdf) ]
|
||||
|
||||
Build a tracking device which transmits position from a GPS receiver.
|
||||
|
||||
- [**Raspberry Pi SDR IGate**](Raspberry-Pi-SDR-IGate.pdf) [ [*download*](../../../raw/master/doc/Raspberry-Pi-SDR-IGate.pdf) ]
|
||||
|
||||
It's easy to build a receive-only APRS Internet Gateway (IGate) with only a Raspberry Pi and a software defined radio (RTL-SDR) dongle. Here’s how.
|
||||
|
||||
- [**APRS Telemetry Toolkit**](APRS-Telemetry-Toolkit.pdf) [ [*download*](../../../raw/master/doc/APRS-Telemetry-Toolkit.pdf) ]
|
||||
|
||||
Describes scripts and methods to generate telemetry.
|
||||
Includes a complete example of attaching an analog to
|
||||
digital converter to a Raspberry Pi and transmitting
|
||||
a measured voltage.
|
||||
|
||||
|
||||
|
||||
- [**2400 & 4800 bps PSK for APRS / Packet Radio**](2400-4800-PSK-for-APRS-Packet-Radio.pdf) [ [*download*](../../../raw/master/doc/2400-4800-PSK-for-APRS-Packet-Radio.pdf) ]
|
||||
|
||||
|
||||
Double or quadruple your data rate by sending multiple bits at the same time.
|
||||
|
||||
- [**Going beyond 9600 baud**](Going-beyond-9600-baud.pdf) [ [*download*](../../../raw/master/doc/Going-beyond-9600-baud.pdf) ]
|
||||
|
||||
|
||||
Why stop at 9600 baud? Go faster if your soundcard and radio can handle it.
|
||||
|
||||
- [**AIS Reception**](AIS-Reception.pdf) [ [*download*](../../../raw/dev/doc/AIS-Reception.pdf) ]
|
||||
|
||||
|
||||
AIS is an international tracking system for ships. Messages can contain position, speed, course, name, destination, status, vessel dimensions, and many other types of information. Learn how to receive these signals with an ordindary ham transceiver and display the ship locations with APRS applications or [OpenCPN](https://opencpn.org).
|
||||
|
||||
- **[EAS to APRS message converter](https://github.com/wb2osz/eas2aprs)**
|
||||
|
||||
|
||||
The [U.S. National Weather Service](https://www.weather.gov/nwr/) (NWS) operates more than 1,000 VHF FM radio stations that continuously transmit weather information. These stations also transmit special warnings about severe weather, disasters (natural & manmade), and public safety.
|
||||
|
||||
Alerts are sent in a digital form known as Emergency Alert System (EAS) Specific Area Message Encoding (SAME). [You can hear a sample here](https://en.wikipedia.org/wiki/Specific_Area_Message_Encoding).
|
||||
|
||||
It is possible to buy radios that decode these messages but what fun is that? We are ham radio operators so we want to build our own from stuff that we already have sitting around.
|
||||
|
||||
|
||||
## Miscellaneous ##
|
||||
|
||||
- **[Ham Radio of Things (HRoT)](https://github.com/wb2osz/hrot)**
|
||||
|
||||
|
||||
Now that billions of computers and mobile phones (which are handheld computers) are all connected by the Internet, the large growth is expected from the “Internet of Things.” What is a “thing?” It could be a temperature sensor, garage door opener, motion detector, flood water level, smoke alarm, antenna rotator, coffee maker, lights, home thermostat, …, just about anything you might want to monitor or control.
|
||||
|
||||
There have been other occasional mentions of merging Ham Radio with the Internet of Things but only ad hoc incompatible narrowly focused applications. Here is a proposal for a standardized more flexible method so different systems can communicate with each other.
|
||||
|
||||
- [**A Better APRS Packet Demodulator, part 1, 1200 baud**](A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf) [ [*download*](../../../raw/master/doc/A-Better-APRS-Packet-Demodulator-Part-1-1200-baud.pdf) ]
|
||||
|
||||
Sometimes it's a little mystifying why an
|
||||
APRS / AX.25 Packet TNC will decode some signals
|
||||
and not others. A weak signal, buried in static,
|
||||
might be fine while a nice strong clean sounding
|
||||
signal is not decoded. Here we will take a brief
|
||||
look at what could cause this perplexing situation
|
||||
and a couple things that can be done about it.
|
||||
|
||||
|
||||
|
||||
- [**A Better APRS Packet Demodulator, part 2, 9600 baud**](A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf) [ [*download*](../../../raw/master/doc/A-Better-APRS-Packet-Demodulator-Part-2-9600-baud.pdf) ]
|
||||
|
||||
In the first part of this series we discussed 1200 baud audio frequency shift keying (AFSK). The mismatch
|
||||
between FM transmitter pre-emphasis and the
|
||||
receiver de-emphasis will
|
||||
cause the amplitudes of the two tones to be different.
|
||||
This makes it more difficult to demodulate them accurately.
|
||||
9600 baud operation is an entirely different animal. ...
|
||||
|
||||
- [**WA8LMF TNC Test CD Results a.k.a. Battle of the TNCs**](WA8LMF-TNC-Test-CD-Results.pdf) [ [*download*](../../../raw/master/doc/WA8LMF-TNC-Test-CD-Results.pdf) ]
|
||||
|
||||
How can we compare how well the TNCs perform under real world conditions?
|
||||
The de facto standard of measurement is the number of packets decoded from [WA8LMF’s TNC Test CD](http://wa8lmf.net/TNCtest/index.htm).
|
||||
Many have published the number of packets they have been able to decode from this test. Here they are, all gathered in one place, for your reading pleasure.
|
||||
|
||||
- [**A Closer Look at the WA8LMF TNC Test CD**](A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf) [ [*download*](../../../raw/master/doc/A-Closer-Look-at-the-WA8LMF-TNC-Test-CD.pdf) ]
|
||||
|
||||
Here, we take a closer look at some of the frames on the TNC Test CD in hopes of gaining some insights into why some are easily decoded and others are more difficult.
|
||||
There are a lot of ugly signals out there. Many can be improved by decreasing the transmit volume. Others are just plain weird and you have to wonder how they are being generated.
|
||||
|
||||
|
||||
## Additional Documentation for Dire Wolf Software TNC #
|
||||
|
||||
|
||||
When there was little documentation, it was all added to the source code repository [https://github.com/wb2osz/direwolf/tree/master/doc](https://github.com/wb2osz/direwolf/tree/master/doc)
|
||||
|
||||
The growing number of documentation files and revisions are making the source code repository very large which means long download times. Additional documentation, not tied to a specific release, is now being added to [https://github.com/wb2osz/direwolf-doc](https://github.com/wb2osz/direwolf-doc)
|
||||
|
||||
## Questions? Experiences to share? ##
|
||||
|
||||
Here are some good places to ask questions and share your experiences:
|
||||
|
||||
- [Dire Wolf Software TNC](https://groups.io/g/direwolf)
|
||||
|
||||
- [Raspberry Pi 4 Ham Radio](https://groups.io/g/RaspberryPi-4-HamRadio)
|
||||
|
||||
- [linuxham](https://groups.io/g/linuxham)
|
||||
|
||||
- [TAPR aprssig](http://www.tapr.org/pipermail/aprssig/)
|
||||
|
||||
|
||||
The github "issues" section is for reporting software defects and enhancement requests. It is NOT a place to ask questions or have general discussions. Please use one of the locations above.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
10
dsp.h
10
dsp.h
|
@ -1,10 +0,0 @@
|
|||
|
||||
/* dsp.h */
|
||||
|
||||
// TODO: put prefixes on these names.
|
||||
|
||||
float window (bp_window_t type, int size, int j);
|
||||
|
||||
void gen_lowpass (float fc, float *lp_filter, int filter_size, bp_window_t wtype);
|
||||
|
||||
void gen_bandpass (float f1, float f2, float *bp_filter, int filter_size, bp_window_t wtype);
|
52
dtime_now.c
52
dtime_now.c
|
@ -1,52 +0,0 @@
|
|||
|
||||
|
||||
#include "textcolor.h"
|
||||
#include "dtime_now.h"
|
||||
|
||||
|
||||
/* Current time in seconds but more resolution than time(). */
|
||||
|
||||
/* We don't care what date a 0 value represents because we */
|
||||
/* only use this to calculate elapsed real time. */
|
||||
|
||||
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#if __WIN32__
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
double dtime_now (void)
|
||||
{
|
||||
double result;
|
||||
|
||||
#if __WIN32__
|
||||
/* 64 bit integer is number of 100 nanosecond intervals from Jan 1, 1601. */
|
||||
|
||||
FILETIME ft;
|
||||
|
||||
GetSystemTimeAsFileTime (&ft);
|
||||
|
||||
result = ((( (double)ft.dwHighDateTime * (256. * 256. * 256. * 256.) +
|
||||
(double)ft.dwLowDateTime ) / 10000000.) - 11644473600.);
|
||||
#else
|
||||
/* tv_sec is seconds from Jan 1, 1970. */
|
||||
|
||||
struct timespec ts;
|
||||
|
||||
clock_gettime (CLOCK_REALTIME, &ts);
|
||||
|
||||
result = ((double)(ts.tv_sec) + (double)(ts.tv_nsec) * 0.000000001);
|
||||
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
text_color_set(DW_COLOR_DEBUG);
|
||||
dw_printf ("dtime_now() returns %.3f\n", result );
|
||||
#endif
|
||||
|
||||
return (result);
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
|
||||
|
||||
extern double dtime_now (void);
|
12
dtmf.h
12
dtmf.h
|
@ -1,12 +0,0 @@
|
|||
/* dtmf.h */
|
||||
|
||||
|
||||
#include "audio.h"
|
||||
|
||||
void dtmf_init (struct audio_s *p_audio_config);
|
||||
|
||||
char dtmf_sample (int c, float input);
|
||||
|
||||
|
||||
/* end dtmf.h */
|
||||
|
|
@ -1 +0,0 @@
|
|||
MAINICON ICON "dw-icon.ico"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue