From c20c0f4aecf38c9f2454229ac011798de5508edc Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 24 May 2021 22:32:54 +0100 Subject: [PATCH] Send contents of numbered AMBE files in language directory. So, for example, for lang en_GB: When you manual dial 9991, file en_GB_2/9991.ambe is played --- Audio/en_GB_2/9991.ambe | Bin 0 -> 8334 bytes bridge_master.py | 68 +++++++++++++++++++++++++--------------- hblink.py | 11 ++++--- hotspot_proxy_v2.py | 8 +++++ mysql_config.py | 9 ++++++ read_ambe.py | 2 +- 6 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 Audio/en_GB_2/9991.ambe diff --git a/Audio/en_GB_2/9991.ambe b/Audio/en_GB_2/9991.ambe new file mode 100644 index 0000000000000000000000000000000000000000..a864285f68b4d3c0cfbbfd64ee381e5d40a4f4d8 GIT binary patch literal 8334 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 4000 and _int_dst_id <= 5000: if _int_dst_id >= 5 and _int_dst_id <= 999999: _bridgename = '#'+ str(_int_dst_id) - if _bridgename not in BRIDGES and not (_int_dst_id >= 4000 and _int_dst_id <= 5000): + if _bridgename not in BRIDGES and not (_int_dst_id >= 4000 and _int_dst_id <= 5000) and not (_int_dst_id >=9991 and _int_dst_id <= 9999): logger.info('(%s) [A] Reflector for TG %s does not exist. Creating as User Activated. Timeout: %s',self._system, _int_dst_id,CONFIG['SYSTEMS'][self._system]['DEFAULT_UA_TIMER']) make_single_reflector(_dst_id,CONFIG['SYSTEMS'][self._system]['DEFAULT_UA_TIMER'],self._system) @@ -1784,8 +1795,15 @@ class routerHBP(HBSYSTEM): logger.info('(%s) Reflector: voice called - 5000 status - "not linked"', self._system) _say.append(words[_lang]['notlinked']) + #Information services + elif _int_dst_id >= 9991 and _int_dst_id <= 9999: + self.STATUS[_slot]['_stopTgAnnounce'] = True + reactor.callInThread(playFileOnRequest,self,_int_dst_id) + #playFileOnRequest(self,_int_dst_id) + + #Speak what TG was requested to link - else: + elif not self.STATUS[_slot]['_stopTgAnnounce']: logger.info('(%s) Reflector: voice called (linking) "linked to %s"', self._system,_int_dst_id) _say.append(words[_lang]['silence']) _say.append(words[_lang]['linkedto']) @@ -1797,10 +1815,10 @@ class routerHBP(HBSYSTEM): for num in str(_int_dst_id): _say.append(words[_lang][num]) - speech = pkt_gen(bytes_3(5000), _nine, bytes_4(9), 1, _say) - - #call speech in a thread as it contains sleep() and hence could block the reactor - reactor.callInThread(sendSpeech,self,speech) + if not self.STATUS[_slot]['_stopTgAnnounce']: + speech = pkt_gen(bytes_3(5000), _nine, bytes_4(9), 1, _say) + #call speech in a thread as it contains sleep() and hence could block the reactor + reactor.callInThread(sendSpeech,self,speech) # Mark status variables for use later self.STATUS[_slot]['RX_PEER'] = _peer_id diff --git a/hblink.py b/hblink.py index b519061..48d6046 100755 --- a/hblink.py +++ b/hblink.py @@ -56,12 +56,13 @@ import logging logger = logging.getLogger(__name__) # Does anybody read this stuff? There's a PEP somewhere that says I should do this. -__author__ = 'Cortney T. Buffington, N0MJS' -__copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group' -__credits__ = 'Colin Durbridge, G4EML, Steve Zingman, N4IRS; Mike Zingman, N4IRR; Jonathan Naylor, G4KLX; Hans Barthen, DL5DI; Torsten Shultze, DG1HT' +__author__ = 'Cortney T. Buffington, N0MJS, Forked by Simon Adlem - G7RZU' +__copyright__ = 'Copyright (c) 2016-2019 Cortney T. Buffington, N0MJS and the K0USY Group, Simon Adlem, G7RZU 2020,2021' +__credits__ = 'Colin Durbridge, G4EML, Steve Zingman, N4IRS; Mike Zingman, N4IRR; Jonathan Naylor, G4KLX; Hans Barthen, DL5DI; Torsten Shultze, DG1HT; Jon Lee, G4TSN; Norman Williams, M6NBP' __license__ = 'GNU GPLv3' -__maintainer__ = 'Cort Buffington, N0MJS' -__email__ = 'n0mjs@me.com' +__maintainer__ = 'Simon Adlem G7RZU' +__email__ = 'simon@gb7fr.org.uk' + # Global variables used whether we are a module or __main__ systems = {} diff --git a/hotspot_proxy_v2.py b/hotspot_proxy_v2.py index 287b2a2..98583e9 100644 --- a/hotspot_proxy_v2.py +++ b/hotspot_proxy_v2.py @@ -5,6 +5,14 @@ from resettabletimer import ResettableTimer from dmr_utils3.utils import int_id import random +# Does anybody read this stuff? There's a PEP somewhere that says I should do this. +__author__ = 'Simon Adlem - G7RZU' +__copyright__ = 'Copyright (c) Simon Adlem, G7RZU 2020,2021' +__credits__ = 'Jon Lee, G4TSN; Norman Williams, M6NBP' +__license__ = 'GNU GPLv3' +__maintainer__ = 'Simon Adlem G7RZU' +__email__ = 'simon@gb7fr.org.uk' + class Proxy(DatagramProtocol): def __init__(self,Master,ListenPort,connTrack,blackList,Timeout,Debug,DestportStart,DestPortEnd): diff --git a/mysql_config.py b/mysql_config.py index 7d14aa2..fe8553b 100644 --- a/mysql_config.py +++ b/mysql_config.py @@ -2,6 +2,15 @@ import mysql.connector from mysql.connector import errorcode #import mysql.connector.pooling +# Does anybody read this stuff? There's a PEP somewhere that says I should do this. +__author__ = 'Simon Adlem - G7RZU' +__copyright__ = 'Copyright (c) Simon Adlem, G7RZU 2020,2021' +__credits__ = 'Colin Durbridge, G4EML, Steve Zingman, N4IRS; Mike Zingman, N4IRR; Jonathan Naylor, G4KLX; Hans Barthen, DL5DI; Torsten Shultze, DG1HT; Jon Lee, G4TSN; Norman Williams, M6NBP' +__license__ = 'GNU GPLv3' +__maintainer__ = 'Simon Adlem G7RZU' +__email__ = 'simon@gb7fr.org.uk' + + class useMYSQL: #Init new object def __init__(self, server,user,password,database,table,logger): diff --git a/read_ambe.py b/read_ambe.py index 9525f59..3d5506d 100644 --- a/read_ambe.py +++ b/read_ambe.py @@ -143,7 +143,7 @@ class readAMBE: _wordBitarray.clear() ambe.close() except IOError: - return(False) + raise return(_wordBA)