LINK / RELAIS / HOTSPOT **SPOTNIK **

J’ai décidé de proposer un hardware permettant de faire un

 LINK, RELAIS ou Hot-Spot avec un Orange Pi Zéro ,

ce dernier disposant du Wifi , de l’Ethernet , et d’une carte son intégrée.

 

Ce HotSpot a pour nom de code :

« Spotnik « 

 

Il suffit d’y adjoindre un  TX et  une antenne .

(pour le Spotnik Rasberry, voir en bas de la page),

Il permet de se connecter aux réseaux FON , RRF, réseaux populaire en France .

 

Pourquoi utiliser un spotnik ?

  1. C’est de la radio !!
  2. Il supporte actuellement 3 protocoles : Echolink , SvxReflector, Free-Radio-Network.
  3. Il permet de créer facilement un point d’accès radio/Relais ou un hot-spot.
  4. Il est pré-configuré sur les 3 réseaux majeurs Francophone RRF , FON , EchoLink , beaucoup d’étapes ont été automatisée pour simplifier la configuration.
  5. C’est le seul hot-spot aujourd’hui supportant le protocole SvxReflector.
  6. Il dispose d’une interface graphique web pour la configuration et visualisation.
  7. Son prix est abordable.
  8. Il permet de converser avec un Talkie depuis son canapé avec les  radioamateurs à travers le monde.
  9. Il consomme très peu par rapport à un PC sur Echolink .
  10. Il ne nécessite pas d’ouvrir de port sur la box (sécurité) .
  11. Il fonctionne en Wifi, Ethernet, 3G/4G, via le partage d’une connexion sur le téléphone.
  12. Il est petit, transportable, universel.
  13. Il est Open-Source GPL v3, vous pouvez le faire vous-même, ou le modifier.
  14. facile a scripter et modifier, il peut devenir un « Link »,  un « Relais »,  un « Transpondeur »,  un « Relais-Perroquet » ….
  15. Sont inclus un module météo, un moniteur de propagation, un relais-perroquet simplex .

Quels sont les avantages du protocole SvxReflector ?

  1. Un codec des plus moderne et de très bonne qualité (opus).
  2. Utilisation d’un seul port : le 5300 en UDP.
  3. Il n’est pas nécessaire d’ouvrir un port sur la box ou routeur.
  4. Fonctionnement correct en 3g/4g via un partage de connexion.
  5. Heartbeat est l’idéal en connexion 3G/4G quand la liaison internet est moyenne.
  6. pas besoin de proxy .

Une version logicielle en évolution :

(actuellement version 1.8)

  1. Certaine fonctionnalités ne sont pas encore implémentées dans cette version, ou nécessitent une configuration manuelle comme l’automatisation de la détection du proxy pour Echolink, il faut passer par la ligne de commande .
  2. les icônes des différents réseaux ne sont pas disponible dans la page d’accueil
  3. la visualisation sur l’interface graphique pour Echolink et le Free Radio Network ne sont pas encore fonctionnels.
  4. La mise à jour vers la version finale pourra être faite simplement.

Documentation Complète du Spotnik

Une excellente documentation à téléchargé  en PDF

Le tuto est à lire au moins une fois !!

Le projet est hébergé sur github.com/spotnik-ham .

Les « Spotnik » n’ont pas d’écran ,

on les configure via un PC avec Putty, Ssh Juice, ou à l’aide d’un navigateur web sur smartphone, Tablette, PC, Mac…

Une application graphique en Javascript « web » est installée sur le spotnik  . Il se connecte au réseau internet via Wifi ou Ethernet.

Une fois que tout est paramétré,  la seule chose restant à effectuer est le changement de réseaux RRF / FON / EchoLink / Free Radio Network :

Le basculement se fait, soit via l’application « web », soit en DTMF, à partir d’un Talkie ou en mode console.

 

Les menus sont simples et permettent de changer de réseaux, régler le wifi, paramétrer le spotnik , naviguer sur le net , configurer le mail pour le moniteur de propagation…

Dans le cas de l’utilisation du « Spotnik » avec le protocole EchoLink, Un script permets de tester et de choisir le meilleur proxy disponible, merci Michel F1TZO pour ce script.

Ci dessous quelques copie d’écran en mode « texte » et via l’interface.

Pour les configurations plus « poussées », en mode EXPERT,

ou pour changer la fréquence sur la version Delta,

il faudra passer par la ligne de commande via SSH.

 

Les différentes interfaces :

(schéma disponible sur le ftp)

Interface Gamma : universelle Raspberry / OrangePi / BananaPi etc …

Interface Beta :  pour OrangePi0, nécessite l’ajout d’un TX .

Interface Delta :pour OrangePi0, TX UHF embarqué ( HotSpot) 0,5W .

Interface Epsilon : Relais UHF et voie VHF 1w HF en cours de développent / test

L’information « Squelch » est disponible dans pratiquement tous les TX , elle est positive ou négative, sur le module SA818 ou DRA818 celle-ci est négative.

 

« DIY » –  Si vous souhaiter faire vous-même votre « Spotnik » :

Téléchargement de l’image :

L’image de la carte SD de la distribution, est Open Source en GPL V3 ainsi que le logiciel « spotnik gui » et les scripts.

Elle est téléchargeable sur le FTP

3 images sont actuellement disponibles :

Spotnik_1.8_opi.img.7z : pour Orange Pi 0, en mode texte

Xspotnik_1.8_opi.img.7z : pour Orange Pi 0, en mode fenêtré (« X-window »)

Spotnik-raspi_1.7.img.7z : pour Raspberry, en  mode texte

 

(ces 3 images contiennent l’interface Web, accessible à distance via http://adresse_IP)

Installation de l’image :

Les images sont compressées en fichiers de type « 7zip ».

Sous Windows vous pouvez utiliser 7-zip .

Pour installer l’image sur une carte micro SD, il existe plusieurs solutions :

  • Sous Windows : avec Win32DiskImager, se reporter à la documentation
  • Sous Linux : dd if=spotnik_1.8_opi.img of=/dev/mmcblk0
    (exemple pour l’Orange Pi 0 si votre carte SD s’appelle mmcblk0)

Vous pouvez participer financièrement au développement de spotnik en versant quelques Euros, Dollars , Pesos à mon adresse jp@piers.tv sur Paypal .

Le mot de passe « root » est « spotnik » il est bien sûr à changer!!

Brochage du Spotnik Béta

téléchargement

 

 

 

Spotnik Rasberry : 

La nouvelle version pour raspberry est disponible , l’interface graphique est en version béta , l’interface ssh est toujours disponible.

il faut utiliser l’image spotnik-raspi_1.7.img.7z

Commercialisation : voir La boutique 

Cordiale 73″ des développeurs.

adresse mail : contact@spotnik.org

  • Application Web , design , logos : Sonny Piers / Isabelle F4GBV
  • Hardware F1EVM JeanFrançois , F5NLG JeanPhilippe
  • Low Level Script F1EVM JeanFrançois , F5NLG JeanPhilippe
  • Distrib and packaging F5NLG JeanPhilippe

 

Publicités

SvxReflector

Une nouvelle façon d’interconnecter des répéteurs ou Nodes entre eux :

SvxReflector

 

Pour cela, il vous faut la toute dernière version de Svxlink .

Pour l’installer :

useradd -c « Echolink user » -G audio -d /home/svxlink -m -s /sbin/nologin svxlink.daemon

apt-get install cmake libsigc++-2.0-dev libasound2-dev libpopt-dev libgcrypt11-dev tk-dev libgsm1-dev libspeex-dev libopus-dev groff build-essential git libfftw3-dev libusb-1.0-0-dev opus-tools

cd /usr/src

wget https://github.com/sm0svx/svxlink/archive/svxreflector.zip
unzip svxreflector.zip
rm svxreflector.zip
cd /usr/src/svxlink-svxreflector/src/
mkdir build

 

Pour l’OrangePi,  modifier :
/usr/src/svxlink-svxreflector/src/svxlink/trx/PttGpio.cpp
/usr/src/svxlink-svxreflector/src/svxlink/trx/SquelchGpio.cpp

cd build

cmake -DCMAKE_INSTALL_PREFIX=/usr -DSYSCONF_INSTALL_DIR=/etc -DLOCAL_STATE_DIR=/var -DUSE_OSS=NO -DUSE_QT=NO ..

make && make doc && make install

—————– côté « client » Svxlink.conf ——————-

###############################################################################
# #
# Configuration file for MAISON – IN88GN SvxLink #
# #
###############################################################################

[GLOBAL]

MODULE_PATH=/usr/lib/arm-linux-gnueabihf/svxlink
LOGICS=432Logic,ReflectorLogic
LINKS=ALLlink

CFG_DIR=svxlink.d
TIMESTAMP_FORMAT= »%c »
CARD_SAMPLE_RATE=48000
# à configurer précisemment à la fin du fichier sinon laisser désactivé
#LOCATION_INFO=LocationInfo

# —————- Logic Simplex pour Node / Link —————————

[432Logic]
# type de la logique
TYPE=Simplex
RX=Rx1
TX=Tx1
MODULES=ModuleHelp,ModuleMetarInfo
# Mettez votre indicatif
CALLSIGN=F5XYZ
SHORT_IDENT_INTERVAL=15
LONG_IDENT_INTERVAL=60
# joue sur le SHORT IDENT ne se fera que si il y a eu X passages en TX
IDENT_ONLY_AFTER_TX=40
EXEC_CMD_ON_SQL_CLOSE=500
EVENT_HANDLER=/usr/share/svxlink/events.tcl
DEFAULT_LANG=fr_FR
RGR_SOUND_DELAY=0
REPORT_CTCSS=71.9
FX_GAIN_NORMAL=-6
FX_GAIN_LOW=-12
ONLINE_CMD=43200
MUTE_RX_ON_TX=1
MUTE_TX_ON_RX=1

[ReflectorLogic]
TYPE=Reflector
HOST=hote.example.com
CALLSIGN=F5XYZ
AUTH_KEY= »SuperMotdePasseMegaComplique@ »
AUDIO_CODEC=OPUS
#JITTER_BUFFER_DELAY=0

[ALLlink]
CONNECT_LOGICS=432Logic:432MHZ:945,ReflectorLogic:L0gic:930

DEFAULT_ACTIVE=1
TIMEOUT=0

#————— Configuration de la partie RADIO ——————

[Rx1]
# RADIO 1 #
TYPE=Local
AUDIO_DEV=alsa:plughw:2
AUDIO_CHANNEL=0
#tyde de detection VOX,CTCSS,SERIAL,EVDEV,SIGLEV,GPIO
#SQL_DET=CTCSS
SQL_DET=GPIO
GPIO_PATH=/sys/class/gpio_sw
GPIO_SQL_PIN=PC4
SQL_START_DELAY=0
SQL_DELAY=0
SQL_HANGTIME=0
#SQL_EXTENDED_HANGTIME=1000
#SQL_EXTENDED_HANGTIME_THRESH=15
SQL_TIMEOUT=300
SQL_TAIL_ELIM=0
VOX_FILTER_DEPTH=20
VOX_THRESH=2000
CTCSS_MODE=2
CTCSS_FQ=71.9
#CTCSS_SNR_OFFSET=0
CTCSS_OPEN_THRESH=9
CTCSS_CLOSE_THRESH=4
CTCSS_BPF_LOW=60
CTCSS_BPF_HIGH=270
DEEMPHASIS=0
PREAMP=0
PEAK_METER=0
DTMF_DEC_TYPE=INTERNAL
DTMF_MUTING=1
DTMF_HANGTIME=100
1750_MUTING=0

[Tx1]
# RADIO 1 #
TYPE=Local
AUDIO_DEV=alsa:plughw:2
AUDIO_CHANNEL=0
PTT_TYPE=GPIO
GPIO_PATH=/sys/class/gpio_sw
PTT_PIN=PD14
TIMEOUT=300
TX_DELAY=3
PREEMPHASIS=0
DTMF_TONE_LENGTH=100
DTMF_TONE_SPACING=50
DTMF_DIGIT_PWR=-18

————————– Partie « Serveur » Hôte —————————

——————- Svxlink.conf——————

#########################################################################
# #
# Configuration file for F6XYZ – SvxLink #
# #
###############################################################################

[GLOBAL]

MODULE_PATH=/usr/lib/x86_64-linux-gnu/svxlink
LOGICS=432Logic,ReflectorLogic
LINKS=ALLlink

CFG_DIR=svxlink.d
TIMESTAMP_FORMAT= »%c »
CARD_SAMPLE_RATE=48000
#LOCATION_INFO=LocationInfo

[432Logic]
# type de la logique
TYPE=Simplex
RX=NONE
TX=TxStream
MODULES=ModuleEchoLink
# Mettez votre indicatif
CALLSIGN=F6XYZ
LONG_IDENT_INTERVAL=60
#IDENT_ONLY_AFTER_TX=40
#EXEC_CMD_ON_SQL_CLOSE=500
#ACTIVATE_MODULE_ON_LONG_CMD=2:EchoLink
EVENT_HANDLER=/usr/share/svxlink/events.tcl
DEFAULT_LANG=fr_FR
RGR_SOUND_DELAY=-1
REPORT_CTCSS=71.9
FX_GAIN_NORMAL=-80
FX_GAIN_LOW=-80
ONLINE_CMD=43200
#MUTE_RX_ON_TX=1

[ReflectorLogic]
TYPE=Reflector
HOST=MonIp
CALLSIGN=F6XYZ
AUTH_KEY= »SuperMotdePasseMegaComplique@ »
AUDIO_CODEC=OPUS

[ALLlink]
CONNECT_LOGICS=432Logic:432MHZ:945,ReflectorLogic
DEFAULT_ACTIVE=1
TIMEOUT=0

[TxStream]
TYPE=Local
AUDIO_DEV=alsa:hw:Loopback,0,2
AUDIO_CHANNEL=0
PTT_TYPE=NONE
TIMEOUT=7200
TX_DELAY=0
PREEMPHASIS=0

——————– svxreflector.conf ————————

[GLOBAL]
TIMESTAMP_FORMAT= »%c »
LISTEN_PORT=5300
AUTH_KEY= »SuperMotdePasseMegaComplique@ »
SQL_TIMEOUT=600
SQL_TIMEOUT_BLOCKTIME=60

C’est tout …

Le Roger Beep fonctionne si un module est lancé comme PropagationMonitor , Help ou MetarInformation.

Relais VHF sans duplexeur

Ceci est une configuration particulière qui nécessite quelques pré-requis :

  • Disposer de 2 sites pas trop éloignés et équipés tous les 2 d’internet à des altitudes semblable.
  • chaque site sera équipé d’un Raspberry ou Orange Pi , et d’une interface + TX antenne  …
  • un site, appelons le A,  sera le récepteur , le second, B l’émetteur .
  • ils communiquent tous les 2 via RemoteTRX
  • cette configuration peut être doublée pour faire un relais bi-bande par exemple VHF et 29MHz. ce qui est le cas de F5ZJX.

dans mon exemple , le site récepteur, A, utilise une configuration un peu particulière de Svxlink.conf : l’émetteur est déporté et passe par un RemoteTrx

relais-f5zjx

################################################################
# Configuration file for Relais VHF 2 sites svxLink.conf  Site A Récepteur
################################################################[GLOBAL]

MODULE_PATH=/usr/lib/arm-linux-gnueabihf/svxlink
LOGICS=RptLogic145
CFG_DIR=svxlink.d
TIMESTAMP_FORMAT= »%c »
CARD_SAMPLE_RATE=48000
#LINKS=ALLlink

[RptLogic145]
# Toujours Repeater
TYPE=Repeater
RX=145rx
TX=145nettx
MODULES=ModuleHelp,ModuleMetarInfo,ModuleEchoLink
CALLSIGN=F5XYZ
SHORT_IDENT_INTERVAL=15
LONG_IDENT_INTERVAL=60
IDENT_ONLY_AFTER_TX=10
EVENT_HANDLER=/usr/share/svxlink/events.tcl
DEFAULT_LANG=fr_FR
EXEC_CMD_ON_SQL_CLOSE=500
ACTIVATE_MODULE_ON_LONG_CMD=2:EchoLink
RGR_SOUND_DELAY=0
REPORT_CTCSS=71.9
TX_CTCSS=ALWAYS
MACROS=Macros
FX_GAIN_NORMAL=-9
FX_GAIN_LOW=-12
NO_REPEAT=0
# relais ouvert 10secondes
IDLE_TIMEOUT=10
OPEN_ON_1750=500
#OPEN_ON_CTCSS=71.9:200
#OPEN_ON_DTMF=*
OPEN_ON_SQL=200
#OPEN_ON_SEL5=01234
OPEN_SQL_FLANK=CLOSE
OPEN_ON_SQL_AFTER_RPT_CLOSE=45
# petit son strident de signalisation tous les X ms 0 le désactive
IDLE_SOUND_INTERVAL=5000
# verifie si une ouverture trop courte du squelch ( parasite ) perturbe le relais
SQL_FLAP_SUP_MIN_TIME=2000
# nombre de fois qu’une transmission trop courte , parasite est entendue le compteur arrete le relais
SQL_FLAP_SUP_MAX_COUNT=10
# demande aux utilisateurs du relais de s’identifier au bout de X secondes
#IDENT_NAG_TIMEOUT=4
# si la transmission dure plus de X ms on considère que c’est une identification
#IDENT_NAG_MIN_TIME=5000
# +0 coupe la logique, le nombre +1 active la logique
ONLINE_CMD=145650

[145rx]
# on reçois via la carte son #
TYPE=Local
AUDIO_DEV=alsa:plughw:2
AUDIO_CHANNEL=0
SQL_DET=CTCSS
SQL_START_DELAY=0
SQL_DELAY=0
SQL_HANGTIME=500
SQL_TIMEOUT=300
VOX_FILTER_DEPTH=20
VOX_THRESH=800
CTCSS_FQ=71.9
DEEMPHASIS=0
SQL_TAIL_ELIM=20
PREAMP=-6
PEAK_METER=1
DTMF_DEC_TYPE=INTERNAL
DTMF_MUTING=1
DTMF_HANGTIME=100
1750_MUTING=1

[145nettx]
# 145MHZ #
# vers SITE B Émetteur #
TYPE=Net
HOST=LE_Host_Distant
TCP_PORT=5210
AUTH_KEY= »Mot_de_passe »
CODEC=S16

Le site émetteur B ne fait pas tourner Svxlink , mais RemoteTrx , seul le port 5210 doit être ouvert sur la BOX:

################################################################
# Configuration file for the RemoteTrx  Site Émetteur B
################################################################

[GLOBAL]
TRXS=NetUplinkTrx
#CFG_DIR=remotetrx.d
TIMESTAMP_FORMAT= »%c »
#CARD_SAMPLE_RATE=48000
#CARD_CHANNELS=1

[NetUplinkTrx]
TYPE=Net
TX=Tx145
LISTEN_PORT=5210
FALLBACK_REPEATER=0
AUTH_KEY= »Mot_De_Passe »
#MUTE_TX_ON_RX=1000

[Tx145]

TYPE=Local
AUDIO_DEV=alsa:plughw:0
AUDIO_CHANNEL=0
PTT_TYPE=GPIO
PTT_PIN=gpio17
TIMEOUT=300
TX_DELAY=10
CTCSS_FQ=71.9
CTCSS_LEVEL=9
PREEMPHASIS=0
DTMF_TONE_LENGTH=100
DTMF_TONE_SPACING=50
DTMF_DIGIT_PWR=-15
#MASTER_GAIN=0.0

 

Exemple de configuration d’un Link ( ou relais) en SvxServer

Seul le Svxlink.conf est à configurer , pas d’accès au directory EchoLink , le Link (ou relais) est considéré par le système comme un RX et un TX distant du point central , c’est ce qui est utilisé a mon domicile.

Le point Central F5NLG-R est hébergé sur un serveur OVH , dont l’accès nous est généreusement offert par F4MZI que je remercie ici.

Cette solution a été retenue car la bande passante est élevé chez ce fournisseur d’hébergement Web.

###############################################################################
# #
# Configuration file for MAISON – IN88GN SvxLink #
# #
###############################################################################

[GLOBAL]

MODULE_PATH=/usr/lib/arm-linux-gnueabihf/svxlink
# 145Logic,432Logic, ou RepeaterLogic on en choisit deux une repéteur et une Net
LOGICS=432Logic,NetLogic_splx
LINKS=ALLlink

CFG_DIR=svxlink.d
TIMESTAMP_FORMAT= »%c »
CARD_SAMPLE_RATE=48000
# à configuré précisemment à la fin du fichier sinon laisser désactivé
# LOCATION_INFO=LocationInfo

# —————- Logic Simplex pour Node / Link —————————

[432Logic]
# type de la logique
TYPE=Simplex
RX=Rx1
TX=Tx1
MODULES=ModuleHelp
# Mettez votre indicatif
CALLSIGN=F5XYZ
SHORT_IDENT_INTERVAL=15
LONG_IDENT_INTERVAL=60
# joue sur le SHORT IDENT ne se fera que si il y a eu X passages en TX
IDENT_ONLY_AFTER_TX=4
EXEC_CMD_ON_SQL_CLOSE=500
#ACTIVATE_MODULE_ON_LONG_CMD=2:EchoLink
EVENT_HANDLER=/usr/share/svxlink/events.tcl
DEFAULT_LANG=fr_FR
RGR_SOUND_DELAY=0
REPORT_CTCSS=71.9
#MACROS=Macros
FX_GAIN_NORMAL=-6
FX_GAIN_LOW=-12
ONLINE_CMD=43200
MUTE_RX_ON_TX=1

[NetLogic_splx]
TYPE=Simplex
TX=Net1Tx
RX=Net1Rx
CALLSIGN=NONE
RGR_SOUND_DELAY=-1
EVENT_HANDLER=/usr/share/svxlink/events.tcl
DEFAULT_LANG=fr_FR
OPEN_ON_SQL=50
OPEN_SQL_FLANK=OPEN
NO_REPEAT=1
FX_GAIN_NORMAL=-80
FX_GAIN_LOW=-80
IDLE_TIMEOUT=30

# on active les 2 logiques « net » et « radio » en permanence.
[ALLlink]
CONNECT_LOGICS=432Logic:432MHZ:945,NetLogic_splx:430MHZ:930
DEFAULT_ACTIVE=1
TIMEOUT=0

#————— Configuration de la partie RADIO ——————

[Rx1]
# RADIO 1 #
TYPE=Local
AUDIO_DEV=alsa:plughw:2
AUDIO_CHANNEL=0
#type de detection VOX,CTCSS,SERIAL,EVDEV,SIGLEV,GPIO
#SQL_DET=CTCSS
SQL_DET=GPIO
GPIO_SQL_PIN=PC4
# début du squelch
SQL_START_DELAY=0
# retard de détection 20 -100ms
SQL_DELAY=0
# fin de détection
SQL_HANGTIME=0
# extension utile sur signaux faibles en général 1000ms
SQL_EXTENDED_HANGTIME=1000
SQL_EXTENDED_HANGTIME_THRESH=15
SQL_TIMEOUT=300
SQL_TAIL_ELIM=0
VOX_FILTER_DEPTH=20
VOX_THRESH=2000
CTCSS_MODE=2
CTCSS_FQ=71.9
#CTCSS_SNR_OFFSET=0
CTCSS_OPEN_THRESH=9
CTCSS_CLOSE_THRESH=4
CTCSS_BPF_LOW=60
CTCSS_BPF_HIGH=270
DEEMPHASIS=0
PREAMP=0
PEAK_METER=0
DTMF_DEC_TYPE=INTERNAL
DTMF_MUTING=1
DTMF_HANGTIME=100
1750_MUTING=1

[Tx1]
# RADIO 1 #
TYPE=Local
AUDIO_DEV=alsa:plughw:2
AUDIO_CHANNEL=0
PTT_TYPE=GPIO
PTT_PIN=PD14
# coupe l’émetteur en cas d’émission permanente
TIMEOUT=300
# temps avant l’envoi de la BF une fois le PTT activé
TX_DELAY=3
PREEMPHASIS=0
DTMF_TONE_LENGTH=100
DTMF_TONE_SPACING=50
DTMF_DIGIT_PWR=-18
[Net1Tx]
TYPE=Net
HOST=AdresseIP ou Résolution de Nom
TCP_PORT=xxxx
AUTH_KEY= »Mot_de_Passe »
CODEC=S16

[Net1Rx]
TYPE=Net
HOST=AdresseIP ou Résolution de Nom
TCP_PORT=xxxx
AUTH_KEY= »Mot_de_Passe »
CODEC=S16

et voilà c’est tout , le système, en cas de Relais ou Link ( sans intérêt ), est autonome , et fonctionne en interconnexion via le système Nodal.

73″ F5NLG / Jean-Philippe

« Développeur » ou modifs intéréssantes

la 1ère modif nous viens du site de SvxCard :

rajouter un équaliseur sur les sorties audio

Installation d’un équaliseur


 

la 2ème est un anti bavard , un K en voie radio , un bip sur les connexion internet , la diffusion du CTCSS dans les balises F5VMR et F5NLG

###############################################################################
#
# Generic Logic event handlers
#
###############################################################################

#
# This is the namespace in which all functions and variables below will exist.
#
namespace eval Logic {
#
# A variable used to store a timestamp for the last identification.
#
variable prev_ident 0;

#
# A constant that indicates the minimum time in seconds to wait between two
# identifications. Manual and long identifications is not affected.
#
variable min_time_between_ident 120;

#
# Short and long identification intervals. They are setup from config
# variables below.
#
variable short_ident_interval 0;
variable long_ident_interval 0;
#
# The ident_only_after_tx variable indicates if identification is only to
# occur after the node has transmitted. The variable is setup below from the
# configuration variable with the same name.
# The need_ident variable indicates if identification is needed.
#
variable ident_only_after_tx 0;
variable need_ident 0;

#
# A list of functions that should be called once every whole minute
#
variable timer_tick_subscribers [list];

#
###### Anti-Bavard – Timeout advisor ###########
#
variable start_of_transmission 0;
variable length_of_transmission 0;
#
# Contains the ID of the last receiver that indicated squelch activity
#
variable sql_rx_id 0;

#
# Executed when the SvxLink software is started
#
proc startup {} {
#playMsg « Core » « online »
#send_short_ident
}
#
# Executed when a specified module could not be found
# module_id – The numeric ID of the module
#
proc no_such_module {module_id} {
playMsg « Core » « no_such_module »;
playNumber $module_id;
}
#
# Executed when a manual identification is initiated with the * DTMF code
#
proc manual_identification {} {
global mycall;
global report_ctcss;
global active_module;
global loaded_modules;
variable CFG_TYPE;
variable prev_ident;

set epoch [clock seconds];
set hour [clock format $epoch -format « %k »];
regexp {([1-5]?\d)$} [clock format $epoch -format « %M »] -> minute;
set prev_ident $epoch;

playMsg « Core » « online »;
spellWord $mycall;
if {$CFG_TYPE == « Repeater »} {
playMsg « Core » « repeater »;
}
playSilence 250;
playMsg « Core » « the_time_is »;
playTime $hour $minute;
playSilence 250;
if {$report_ctcss > 0} {
playMsg « Core » « pl_is »;
playNumber $report_ctcss;
playMsg « Core » « hz »;
playSilence 300;
}
if {$active_module != «  »} {
playMsg « Core » « active_module »;
playMsg $active_module « name »;
playSilence 250;
set func « :: »;
append func $active_module « ::status_report »;
if {« [info procs $func] » ne «  »} {
$func;
}
} else {
foreach module [split $loaded_modules  » « ] {
set func « :: »;
append func $module « ::status_report »;
if {« [info procs $func] » ne «  »} {
$func;
}
}
}
playMsg « Default » « press_0_for_help »
playSilence 250;
}
#
# Executed when a short identification should be sent
# hour – The hour on which this identification occur
# minute – The hour on which this identification occur
#
proc send_short_ident {{hour -1} {minute -1}} {
global mycall;

global report_ctcss;
variable CFG_TYPE;

spellWord $mycall;
if {$CFG_TYPE == « Repeater »} {
playMsg « Core » « repeater »;
}

playSilence 200;

if {$report_ctcss > 0} {
playMsg « Core » « pl_is »;
playNumber $report_ctcss;
playMsg « Core » « hz »;
playSilence 300;
}
}
#
# Executed when a long identification (e.g. hourly) should be sent
# hour – The hour on which this identification occur
# minute – The hour on which this identification occur
#
proc send_long_ident {hour minute} {
global mycall;

global report_ctcss;
global loaded_modules;
global active_module;
variable CFG_TYPE;

spellWord $mycall;
if {$CFG_TYPE == « Repeater »} {
playMsg « Core » « repeater »;
}
playSilence 200;

if {$report_ctcss > 0} {
playMsg « Core » « pl_is »;
playNumber $report_ctcss;
playMsg « Core » « hz »;
playSilence 300;
}

playMsg « Core » « the_time_is »;
playSilence 100;
playTime $hour $minute;
playSilence 500;

# Call the « status_report » function in all modules if no module is active
if {$active_module == «  »} {
foreach module [split $loaded_modules  » « ] {
set func « :: »;
append func $module « ::status_report »;
if {« [info procs $func] » ne «  »} {
$func;
}
}
}

playSilence 500;
}
#
# Executed when the squelch just have closed and the RGR_SOUND_DELAY timer has
# expired.
#

#### modifié anti bavard

proc send_rgr_sound {} {
variable sql_rx_id;
variable length_of_transmission;
if {$length_of_transmission > 180000 } {
set talkTime 3;

playMsg « MetarInfo » « maximum »;
playNumber $talkTime;
playSilence 100;
playMsg « Core » « minutes »;
playSilence 200;
CW::play  » HI HI »;
set length_of_transmission 0;
} else {
CW::play  » K »;
playSilence 200;
}
for {set i 0} {$i < $sql_rx_id} {incr i 1} {
CW::play  » I »;
playSilence 50;
}
playSilence 100;
}
#
# Executed when an empty macro command (i.e. D#) has been entered.
#
proc macro_empty {} {
playMsg « Core » « operation_failed »;
}
#
# Executed when an entered macro command could not be found
#
proc macro_not_found {} {
playMsg « Core » « operation_failed »;
}
#
# Executed when a macro syntax error occurs (configuration error).
#
proc macro_syntax_error {} {
playMsg « Core » « operation_failed »;
}
#
# Executed when the specified module in a macro command is not found
# (configuration error).
#
proc macro_module_not_found {} {
playMsg « Core » « operation_failed »;
}
#
# Executed when the activation of the module specified in the macro command
# failed.
#
proc macro_module_activation_failed {} {
playMsg « Core » « operation_failed »;
}
#
# Executed when a macro command is executed that requires a module to
# be activated but another module is already active.
#
proc macro_another_active_module {} {
global active_module;

playMsg « Core » « operation_failed »;
playMsg « Core » « active_module »;
playMsg $active_module « name »;
}
#
# Executed when an unknown DTMF command is entered
# cmd – The command string
#
proc unknown_command {cmd} {
spellWord $cmd;
playMsg « Core » « unknown_command »;
}
#
# Executed when an entered DTMF command failed
# cmd – The command string
#
proc command_failed {cmd} {
spellWord $cmd;
playMsg « Core » « operation_failed »;
}
#
# Executed when a link to another logic core is activated.
# name – The name of the link
#
proc activating_link {name} {
if {[string length $name] > 0} {
playMsg « Core » « activating_link_to »;
spellWord $name;
}
}
#
# Executed when a link to another logic core is deactivated.
# name – The name of the link
#
proc deactivating_link {name} {
if {[string length $name] > 0} {
playMsg « Core » « deactivating_link_to »;
spellWord $name;
}
}
#
# Executed when trying to deactivate a link to another logic core but the
# link is not currently active.
# name – The name of the link
#
proc link_not_active {name} {
if {[string length $name] > 0} {
playMsg « Core » « link_not_active_to »;
spellWord $name;
}
}
#
# Executed when trying to activate a link to another logic core but the
# link is already active.
# name – The name of the link
#
proc link_already_active {name} {
if {[string length $name] > 0} {
playMsg « Core » « link_already_active_to »;
spellWord $name;
}
}
#
# Executed each time the transmitter is turned on or off
# is_on – Set to 1 if the transmitter is on or 0 if it’s off
#
proc transmit {is_on} {
#puts « Turning the transmitter $is_on »;
variable prev_ident;
variable need_ident;
if {$is_on && ([clock seconds] – $prev_ident > 5)} {
set need_ident 1;
}
}
#
# Executed each time the squelch is opened or closed modifié anti bavard
# rx_id – The ID of the RX that the squelch opened/closed on
# is_open – Set to 1 if the squelch is open or 0 if it’s closed
#
proc squelch_open {rx_id is_open} {
variable sql_rx_id;
variable start_of_transmission;
variable length_of_transmission;
#puts « The squelch is $is_open on RX $rx_id »;
set sql_rx_id $rx_id;
if {$is_open} {
set start_of_transmission [clock clicks -milliseconds];
} else {
set length_of_transmission [expr [clock clicks -milliseconds] – $start_of_transmission];
}
}
#
# Executed when a DTMF digit has been received
# digit – The detected DTMF digit
# duration – The duration, in milliseconds, of the digit
#
# Return 1 to hide the digit from further processing in SvxLink or
# return 0 to make SvxLink continue processing as normal.
#
proc dtmf_digit_received {digit duration} {
#puts « DTMF digit \ »$digit\ » detected with duration $duration ms »;
return 0;
}
#
# Executed when a DTMF command has been received
# cmd – The command
#
# Return 1 to hide the command from further processing is SvxLink or
# return 0 to make SvxLink continue processing as normal.
#
# This function can be used to implement your own custom commands or to disable
# DTMF commands that you do not want users to execute.
proc dtmf_cmd_received {cmd} {
#global active_module

# Example: Ignore all commands starting with 3 in the EchoLink module
#if {$active_module == « EchoLink »} {
# if {[string index $cmd 0] == « 3 »} {
# puts « Ignoring random connect command for module EchoLink: $cmd »
# return 1
# }
#}

# Handle the « force core command » mode where a command is forced to be
# executed by the core command processor instead of by an active module.
# The « force core command » mode is entered by prefixing a command by a star.
#if {$active_module != «  » && [string index $cmd 0] != « * »} {
# return 0
#}
#if {[string index $cmd 0] == « * »} {
# set cmd [string range $cmd 1 end]
#}

# Example: Custom command executed when DTMF 99 is received
#if {$cmd == « 99 »} {
# puts « Executing external command »
# playMsg « Core » « online »
# exec ls &
# return 1
#}

return 0
}
#
# Executed once every whole minute. Don’t put any code here directly
# Create a new function and add it to the timer tick subscriber list
# by using the function addTimerTickSubscriber.
#
proc every_minute {} {
variable timer_tick_subscribers;
#puts [clock format [clock seconds] -format « %Y-%m-%d %H:%M:%S »];
foreach subscriber $timer_tick_subscribers {
$subscriber;
}
}
#
# Use this function to add a function to the list of functions that
# should be executed once every whole minute. This is not an event
# function but rather a management function.
#
proc addTimerTickSubscriber {func} {
variable timer_tick_subscribers;
lappend timer_tick_subscribers $func;
}
#
# Should be executed once every whole minute to check if it is time to
# identify. Not exactly an event function. This function handle the
# identification logic and call the send_short_ident or send_long_ident
# functions when it is time to identify.
#
proc checkPeriodicIdentify {} {
variable prev_ident;
variable short_ident_interval;
variable long_ident_interval;
variable min_time_between_ident;
variable ident_only_after_tx;
variable need_ident;
global logic_name;

if {$short_ident_interval == 0} {
return;
}

set now [clock seconds];
set hour [clock format $now -format « %k »];
regexp {([1-5]?\d)$} [clock format $now -format « %M »] -> minute;

set short_ident_now \
[expr {($hour * 60 + $minute) % $short_ident_interval == 0}];
set long_ident_now 0;
if {$long_ident_interval != 0} {
set long_ident_now \
[expr {($hour * 60 + $minute) % $long_ident_interval == 0}];
}

if {$long_ident_now} {
puts « $logic_name: Sending long identification… »;
send_long_ident $hour $minute;
set prev_ident $now;
set need_ident 0;
} else {
if {$now – $prev_ident < $min_time_between_ident} {
return;
}
if {$ident_only_after_tx && !$need_ident} {
return;
}

if {$short_ident_now} {
puts « $logic_name: Sending short identification… »;
send_short_ident $hour $minute;
set prev_ident $now;
set need_ident 0;
}
}
}
#
# Executed when the QSO recorder is being activated
#
proc activating_qso_recorder {} {
playMsg « Core » « activating »;
playMsg « Core » « qso_recorder »;
}
#
# Executed when the QSO recorder is being deactivated
#
proc deactivating_qso_recorder {} {
playMsg « Core » « deactivating »;
playMsg « Core » « qso_recorder »;
}
#
# Executed when trying to deactivate the QSO recorder even though it’s
# not active
#
proc qso_recorder_not_active {} {
playMsg « Core » « qso_recorder »;
playMsg « Core » « not_active »;
}
#
# Executed when trying to activate the QSO recorder even though it’s
# already active
#
proc qso_recorder_already_active {} {
playMsg « Core » « qso_recorder »;
playMsg « Core » « already_active »;
}
#
# Executed when the timeout kicks in to activate the QSO recorder
#
proc qso_recorder_timeout_activate {} {
playMsg « Core » « timeout »
playMsg « Core » « activating »;
playMsg « Core » « qso_recorder »;
}
#
# Executed when the timeout kicks in to deactivate the QSO recorder
#
proc qso_recorder_timeout_deactivate {} {
playMsg « Core » « timeout »
playMsg « Core » « deactivating »;
playMsg « Core » « qso_recorder »;
}
#
# Executed when the user is requesting a language change
#
proc set_language {lang_code} {
global logic_name;
puts « $logic_name: Setting language $lang_code (NOT IMPLEMENTED) »;

}
#
# Executed when the user requests a list of available languages
#
proc list_languages {} {
global logic_name;
puts « $logic_name: Available languages: (NOT IMPLEMENTED) »;

}
#
# Executed when the node is being brought online or offline
#
proc logic_online {online} {
global mycall
variable CFG_TYPE

if {$online} {
playMsg « Core » « online »;
spellWord $mycall;
if {$CFG_TYPE == « Repeater »} {
playMsg « Core » « repeater »;
}
}
}
##############################################################################
#
# Main program
#
##############################################################################

if [info exists CFG_SHORT_IDENT_INTERVAL] {
if {$CFG_SHORT_IDENT_INTERVAL > 0} {
set short_ident_interval $CFG_SHORT_IDENT_INTERVAL;
}
}

if [info exists CFG_LONG_IDENT_INTERVAL] {
if {$CFG_LONG_IDENT_INTERVAL > 0} {
set long_ident_interval $CFG_LONG_IDENT_INTERVAL;
if {$short_ident_interval == 0} {
set short_ident_interval $long_ident_interval;
}
}
}

if [info exists CFG_IDENT_ONLY_AFTER_TX] {
if {$CFG_IDENT_ONLY_AFTER_TX > 0} {
set ident_only_after_tx $CFG_IDENT_ONLY_AFTER_TX;
}
}

# end of namespace
}

#
# This file has not been truncated
#

Postes Radios et branchements

Talco :

CS3 ou CS4 : Tous les signaux passent par la prise micro .

Les branchements sont disponibles sur la page de F4BQN .

Le CTCSS passe sans soucis le 71.9 Hz,

( sans la carte CTCSS dans le poste et sans la carte modem IMP50 ) .

Le niveau d’entrée micro est à 0 et la sortie audio à 100% ,

c’est ce qui est en service sur F5ZIN-R , F6KBO-L


Philips PRM80xx:

LA BF est filtrée, donc seul le 250.3 Hz passe,

Il faut rajouter dans la section RX :

PREAMP=10

Le branchement est indiqué ici : F4BQN  ,

Il doit être possible de passer sur la 15 broches, mais je n’ai pas testé,

le poste que j’ai eu à câbler n’avait rien de branché sur la 15 points .

Voir le site PRM Mods, c’est ce qui est en service sur le Node de F0GBY .


Baofeng UV3, UV5, BF888 :

Il est possible de sortir un fil de détection de Squelch sur le BF888 et sûrement sur les autres .

Aucune tonalité CTCSS ne passe par la prise HP, Il faut donc être en « VOX » ( beurk) ou « détection de Squelch » après modif .

En service sur F5NLG-L

 


Mororola GM340, 360, 380 :

Les signaux sont pris sur la prise 16 broches à l’arrière :

le CTCSS, la BF, sur la broche 11 ,

le micro sur la broche 2  ( et sur la partie RX DEEMPHASIS=1 )*

voir la page de F4BQN ,

en service sur son Node .


Yaesu FT1900 :

Le micro et le PTT passent par la RJ12

Le 82,5 Hz passe par le haut-parleur

( information de F4BQN )


Standard C-151, ADI AT-201, Yaesu FT23R, Yaesu FT73R …

le micro est connecté via une capacité de 0.47µf

le PTT via une résistance 2.2 k Ohms sur le jack 2.5mm ,

la sortie HP via le jack 3.5mm,

volume à 2

mixer à 56

le CTCSS passe sans problème.

To be continue …