Décodeur APRStt en TCL pour SvxLink

Présentation

Logo APRS

L’APRStt est un protocole permettant à un utilisateur équipé d’un clavier DTMF (fréquences vocales) de s’identifier sur un relais. Cette identification peut être utilisée par exemple pour annoncer la présence de l’utilisateur, sur le relais via une synthèse vocale, et sur le réseau APRS par exemple.

Cet article présente un programme en TCL permettant de convertir les codes DTMF reçus.

Le langage TCL

Ce programme a été écrit en TCL pour être utilisé dans la solution SvxLink, elle même écrite dans ce langage. Ce n’est vraiment pas mon langage préféré, et je ne suis pas sûr de l’utiliser au mieux. Néanmoins, je suis convaincu qu’il est préférable de ne pas multiplier les langages de programmation dans un même projet, dans une optique de maintenabilité. J’écris donc ce bout de code en espérant qu’il sera utile, et je suis ouvert à toutes critiques et suggestions d’améliorations.

Présentation du code APRStt

Le code APRStt est tapé sur un clavier DTMF. Le format de la chaîne est expliqué sur ce lien mais en Anglais… Juan F8ASB le ré-explique dans son article que je vais donc compléter du bout de programme ci-dessous…

Le code proprement dit

Il se décompose en plusieurs parties. La chaîne passée en argument est récupérée, et on vérifie son format et son checksum. Ce dernier est la somme de tous les caractères de données, modulo 10. Comme les lettres A à D sont traduites 10 à 14, comme en hexadécimal, je les récupère simplement avec scan %x.

La suite du programme concerne la conversion proprement dite. Deux version sont proposées. La première fait appel à une fonction qui suffit à elle-même, en remplaçant chaque morceau de chaîne par un autre suivant un dictionnaire. Cependant, aucune sécurité n’est présente, et les chaînes non trouvées dans le dictionnaire sont simplement recopiées. On pourrait compter sur le checksum pour le contrôle d’erreur, mais je préfère m’assurer de la fiabilité de la conversion. Je propose donc une autre version, bien mieux sécurisée.

#! /usr/bin/tclsh
# Programme de décodage de trames APRSTT
# Usage: decode.tcl MATRAME
# Retour sur la sortie standard

if { $::argc > 0 } {
	set aprsttString $::argv

	set lg [ string length $aprsttString ]

	# vérifie que le # est le dernier caractère de la chaîne
	#
	set sharpIndex [ string first "#" $aprsttString ]
	if { $sharpIndex != $lg-1 } {
		return -code error "La chaîne passée en argument doit finir par #"
	}

	# Calcul de checksum: conversion hexa vers entier de chaque caractère de la chaîne,
	# somme puis modulo 10.
	#
	set stringToCheck [ string range $aprsttString 0 $lg-3 ]
	set chkSum 0
	foreach c [ split $stringToCheck "" ] {
		scan $c %x cVal
		set chkSum [ expr { $chkSum + $cVal } ]
	}
	set chkSum [ expr { $chkSum % 10 } ]

	# Contrôle du checksum
	#
	set chkIndex [expr { $sharpIndex - 1 }]
	set strChk [ string index $aprsttString $chkIndex ]
	if { $chkSum != $strChk } {
		return -code error "Erreur de checksum"
	}

	# Extraction des différents éléments
	# Première version: utilisation de string map
	#
	set stringToDecode [ string range $aprsttString 1 $lg-4 ]
	puts [ string map { 2A A 2B B 2C C 3A D 3B E 3C F 4A G 4B H 4C I 
			5A J 5B K 5C L 6A M 6B N 6C O 7A P 7B Q 7C R
			7D S 8A T 8B U 8C V 9A W 9B X 9C Y 9D Z
			0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 } $stringToDecode ]

	# string map est sympathique, mais si une chaîne n'est pas trouvée, 
	# elle est simplement recopiée...
	# Je n'ai pas trouvé d'autre solution que de le faire à la main
	#
	set listAZ "2A 2B 2C 3A 3B 3C 4A 4B 4C 5A 5B 5C 6A 6B 6C 7A 7B 7C 7D 8A 8B 8C 9A 9B 9C 9D"
	set list09 "0 1 2 3 4 5 6 7 8 9"
	set ptr 0
	set result ""
	while { $ptr < [ string length $stringToDecode ] } {
		set ndx [ lsearch $listAZ [ string range $stringToDecode $ptr $ptr+1 ]]
		if { $ndx == -1 } {
			# Pas trouvé de lettre. Recherche d'un chiffre.
			set ndx [ lsearch $list09 [ string index $stringToDecode $ptr ]]
			if { $ndx == -1 } {
				return -code error "Erreur sur le format de la chaîne Aprstt"
			} else {
				append result $ndx
			}
		} else {
			append result [ format %c [ expr { $ndx + 65 } ]]
			incr ptr
		}
		incr ptr
	}
	puts $result

} else {
	return -code error "Usage: decode.tcl chaineAprstt"
}


Ce contenu a été publié dans Programmation, Radioamateur, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

1 réponse à Décodeur APRStt en TCL pour SvxLink

  1. Ping : APRStt: Programme décodage écrit en TCL par F4HDW | Blog de F8ASB

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.