===== S-meter signal reading program =====
On the A1 channel of the converter comes the voltage of the S-meter (after level adjustment by divider bridge).
The following python script must be started continuously and informs the measurement file when the signal level changes. This file is a TCL file that will be used by the logic of the relay.
#!/usr/bin/python
#
# MCP3204/MCP3208 sample program for Raspberry Pi
#
# how to setup /dev/spidev?.?
# $ sudo modprobe spi_bcm2708
#
# how to setup spidev
# $ sudo apt-get install python-dev python-pip
# $ sudo pip install spidev
#
import spidev
import time
from collections import deque
class MCP3208:
def __init__(self, spi_channel=0):
self.spi_channel = spi_channel
self.conn = spidev.SpiDev(0, spi_channel)
self.conn.max_speed_hz = 1000000 # 1MHz
def __del__( self ):
self.close
def close(self):
if self.conn != None:
self.conn.close
self.conn = None
def bitstring(self, n):
s = bin(n)[2:]
return '0'*(8-len(s)) + s
def read(self, adc_channel=0):
# build command
cmd = 128 # start bit
cmd += 64 # single end / diff
if adc_channel % 2 == 1:
cmd += 8
if (adc_channel/2) % 2 == 1:
cmd += 16
if (adc_channel/4) % 2 == 1:
cmd += 32
# send & receive data
reply_bytes = self.conn.xfer2([cmd, 0, 0, 0])
#
reply_bitstring = ''.join(self.bitstring(n) for n in reply_bytes)
# print reply_bitstring
# see also... http://akizukidenshi.com/download/MCP3204.pdf (page.20)
reply = reply_bitstring[5:19]
return int(reply, 2)
if __name__ == '__main__':
spi = MCP3208(0)
count = 0
nb=4 #number of aquiring signal
t = 0.5 #time between two acquiring in seconds. Can be a float value. If nb=3 and t= 2, the qualified value will be given after 6 seconds of continuous signal over 'level'
level=1730 #under this value, signal is not considered
stack = deque([],maxlen=nb)
sig=-1
sig_old= -1
#while count <= 11:
while True:
val = spi.read(0)
time.sleep(t)
#print "val brute = "
#print val
#print " stack = "
#print stack
if val> level : # software Squelch
stack.append(val)
else : # Reset counting
stack = deque([],maxlen=nb)
sig = -1
if len(stack)==nb :
v=0
for i in range(0,nb) :
v+= stack [i]
i = i+1
meanv= (v/nb)
#print len(stack)
#print stack
#print "meanv = "
#print meanv
if ((meanv <= stack[0]*1.05) and (meanv >= stack[0]*0.95)) :
#prend en compte uniquement si signal stable pour les n echantillons
meanv = stack[0]
else :meanv= 0
if 0 <= meanv < 800 : sig=-1
#elif 650 <= meanv < 1950 : sig=0
elif 800 <= meanv < 920 : sig=1
elif 920 <= meanv < 1117 : sig=2
elif 1117 <= meanv < 1336 : sig=3
elif 1336 <= meanv < 1616 : sig=4
elif 1616 <= meanv < 1987 : sig=5
elif 1987 <= meanv < 2365 : sig=6
elif 2365 <= meanv < 2702 : sig=7
elif 2702 <= meanv < 3035 : sig=8
elif 3035 <= meanv < 3370 : sig=9
elif meanv>=3370 : sig=24
else : sig=-1
#print "Signal = %d" % sig
if sig != sig_old :
print "Changement de niveau de signal = %d" % sig
file = open("/tmp/smeter.tcl", "w")
file.write( "set signal " + str(sig) + ";")
file.close()
sig_old=sig
===== Signal Reading Code =====
Now modify the function called ''send_rgr_sound'' in the ''/usr/share/svxlink/events.d/local/Logic.tcl'' file.
We created 10 different sound files (S1 to S9, and S9 +).
proc send_rgr_sound {} {
variable sql_rx_id;
variable signal;
#variable filename;
#lecture du signal
# set output [exec python /etc/svxlink/smeter/smeter_1mes.py]
if { [file exists /tmp/smeter.tcl] } {
source "/tmp/smeter.tcl"
set son ""
if {$signal >=0} {
if {$signal>=10} {
set son "S9+" ; } else {
append son "S" $signal ;
}
playMsg "SVXCard/SMeter" $son;
}
puts "Signal level on RX ID $sql_rx_id : $son";
}
playTone 440 200 100;
#CW::setPitch 600; # Sets the CW Tone to ~750 Hz
#CW::setAmplitude 100;
#CW::setCpm 125
#CW::play "k";
playSilence 200;
for {set i 0} {$i < $sql_rx_id} {incr i 1} {
playTone 880 500 50;
playSilence 50;
}
playSilence 100;
}