From 84e097857780d3ae4ed02a73421f3b968cef1450 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 19 Feb 2022 16:18:04 +0000 Subject: [PATCH] Merge branch AMI Add All Star Link control --- AMI.py | 77 ++++++++++++++++++++++++++++ Audio/en_GB/all-star-link-mode.ambe | Bin 0 -> 1269 bytes Audio/en_GB/ondemand/9992.ambe | Bin 0 -> 3375 bytes Audio/en_GB/ondemand/9993.ambe | Bin 0 -> 6462 bytes Audio/en_GB/tone.ambe | 1 + bridge_master.py | 74 ++++++++++++++++++++++---- config.py | 12 +++++ i8n_voice_map.py | 40 ++++++++++----- 8 files changed, 180 insertions(+), 24 deletions(-) create mode 100644 AMI.py create mode 100644 Audio/en_GB/all-star-link-mode.ambe create mode 100644 Audio/en_GB/ondemand/9992.ambe create mode 100644 Audio/en_GB/ondemand/9993.ambe create mode 100644 Audio/en_GB/tone.ambe diff --git a/AMI.py b/AMI.py new file mode 100644 index 0000000..d6d4086 --- /dev/null +++ b/AMI.py @@ -0,0 +1,77 @@ + +import sys + +from time import time + +from twisted.internet import reactor,task +from twisted.internet.defer import Deferred +from twisted.internet.protocol import ClientFactory,ClientFactory,Protocol +from twisted.protocols.basic import LineReceiver + +class AMI(): + def __init__(self,host,port,username,secret,nodenum): + self._AMIClient = self.AMIClient + self.host = host + self.port = port + self.username = username.encode('utf-8') + self.secret = secret.encode('utf-8') + self.nodenum = str(nodenum) + + def send_command(self,command): + self._AMIClient.command = command.encode('utf-8') + self._AMIClient.username = self.username + self._AMIClient.secret = self.secret + self._AMIClient.nodenum = self.nodenum.encode('utf-8') + self.command = command + + self.CF = reactor.connectTCP(self.host, self.port, self.AMIClientFactory(self._AMIClient)) + + def closeConnection(self): + self.transport.loseConnection() + + class AMIClient(LineReceiver): + + delimiter = b'\r\n' + + def connectionMade(self): + self.sendLine(b'Action: login') + self.sendLine(b''.join([b'Username: ',self.username])) + self.sendLine(b''.join([b'Secret: ',self.secret])) + self.sendLine(self.delimiter) + + def lineReceived(self,line): + print(line) + if line == b'Asterisk Call Manager/1.0': + return + + if line == b'Response: Success': + self.sendLine(b'Action: command') + #print(b''.join([b'Command: ',b'rpt cmd ',self.nodenum,b' ',self.command])) + self.sendLine(b''.join([b'Command: ',b'rpt cmd ',self.nodenum,b' ',self.command])) + #self.sendLine(b'Command: ' + b'rpt cmd 29177 ilink 3 2001') + self.sendLine(self.delimiter) + self.transport.loseConnection() + + + + class AMIClientFactory(ClientFactory): + def __init__(self,AMIClient): + #self.command = command + self.done = Deferred() + self.protocol = AMIClient + #self.protocol.command = command + + def clientConnectionFailed(self, connector, reason): + ClientFactory.clientConnectionLost(self, connector, reason) + + def clientConnectionLost(self, connector, reason): + ClientFactory.clientConnectionLost(self, connector, reason) + + +if __name__ == '__main__': + + + a = AMI(sys.argv[1],int(sys.argv[2]),'admin','llcgi',29177) + #AMIOBJ.AMIClientFactory(AMIOBJ.AMIClient,'rpt cmd 29177 ilink 3 2001') + a.send_command(sys.argv[3]) + reactor.run() diff --git a/Audio/en_GB/all-star-link-mode.ambe b/Audio/en_GB/all-star-link-mode.ambe new file mode 100644 index 0000000000000000000000000000000000000000..043e5ad3f70ad8793af6aa9b2b02497c50dc7066 GIT binary patch literal 1269 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 F`!B9@C&d5& literal 0 HcmV?d00001 diff --git a/Audio/en_GB/ondemand/9993.ambe b/Audio/en_GB/ondemand/9993.ambe new file mode 100644 index 0000000000000000000000000000000000000000..6407eb12388fc8dae2cb7954f5346d03c3f0fa7b GIT binary patch literal 6462 zcmZ9PbzIZy|Ng1LHoBA;4bmlz#KwqGqa;QMNDUYp-7pxX(nyK{NT@?VB~(P|mJU&n zX26gXk)y)bbB>?$dpv&sy&v~|y{`9P*Xw%T(~n3-PzBUu>F)W%GCNKd-NfpxhvHP= z&AsNT%>*G@7rmVJD9C+h74*!>&=7NU)@=&h^zhurL^g zN|&|eBiCG?x);CL-BgG}x(O$o`KEbdP07V~g1VoVT(kx$=Edw^(G9%1?Xd;b9fg;; z-51Sr49h1@I|%R?xEOYEFD4yHidsnU-c`PlrYUY=s`>e1Rx_4T%d2rj_G6-42(Rjp zF`sI%l&q^8SvWzXNY+Fvq!FRAapJ#*ZEw zEM^q@J&TJ`TLdbMEc8Y8sqDH33S=4FNzr>PNNvoJo0q6J=3yWAk(1^(JUnZBZ3_+`g%ac4=O@l@0=D zc(mP-qQur3uuFMJC|J4-%BcMQ<>a9|he6!f;x?i4DB;y6wFd&=^8K%5As=0g5hnUA zZ(Np1G)_}^M}YDZ2_%oV-lIs~ig$>QwBA2XP`u-0hPpWZHOG<&)~3@QmoWRe$Mel_ z6hsbC6@q-hQ-+%AK& zb7c@$N%+QgR@ulT&ie%$5v;)MY4IXLzwgC(#>VtPwwmK_`QM0Z+BXSS1hX_sBmCT& zRizE3Ffn$A#16WHJeKIySPD~L+8=Fiim#5CRCJ7Pb#Za}60^%Wdx|ubr!3wOId+tx z2Ymhd?)FC={uSZWN`uf@e{?P^RnqAfUkTO%8>as4=UxXmUMz@lWHx!!2_&SP)jqmg z62K=O_?>TP!kgLLgC*-CvgR))OE{EG{ zCv{ev_^+{qH>`bUKGjRkhzaK_&u8TAg-=txTA0w`UlZcGx5^{N3ra9hAj961T&m*F zv;j-?cVlKu){NIIxtgUa?TpLZ`)x=|=}Pxt8AWjT$mEqj-mJK#I`3mo5nZ>JmOJ|ShQkb?saq6 zE_30)&u!Qwu!!2V9zc3&jWw3K`4TWImyC$F<360_CYTFypE9^Eb|)!v1|thH|03P| zy129dTGc@l=(o!@rXyNdr{Z)- z#S4)luLisaK2v#AmXI7scP-M)s)svST@5TNf3+jiOHBl zbU0!5R}^Hp^-SA1piodDx#vNxYU+*h0Hgq9*Py@ zvhCXwT8Qh?tcEg{s*hanBGFbkJ#MA+v6z9a-#fWjnmKm+6zdv7R8&xBAbiU+38SEM zq<*SgfW@$vQ&kSO$h(5T<17rYmJlQm*i0G8QNS^Hn9b)d5o~yRyjtnOQ8SHey_K}Y zZr}4`sO?GqitS=d5z0JfUj5G0SKF_a0Z-))i}V{PHF97)Yq&{Y_lbNODdpsx$oTLE z59TP%?OF8)xm-94qzq;hm@k8fm1~d9J51mPHX6OA<8nGM!8NcyT=VT|kIv#yl|LI*gdRFa9c?cI-p7GFaB+*4)Bvph( zaA49}&%4Va!dM_R#GM|3y}f8`SN(riJ5vPPtE>>xA8~A2>*B`WQ@=lkNeQ;Lf()zg z7P=EuSe4Of#F3MKuZX{T{+?nW{rI2wKj(M<{p(*bCXIOfq}$!f(t(Ui@jEJpa&hq@ zl!P`1-N1JBmYpJfa@J^!nD`TgT7Nx>`B$lLiq^t{>E~O#7}j~nPExjW9wz&~X_-aYjl5I$rN=3h5X(iZA~vHxeHg z5xHu2_r30FS%~|G>mL&VoErd%4$6AQ*_*vq;5zoo$ISFAS7r7t$licIob)1jS&Mx7 zQb3?hfKo}K7f_wk1eQyhDdG0xJqdvn+P$JGOB)1n5Bg+pk&c-%I(JlZxYfjT0^G~2 zj6!W`s^a&;UpE5m&r}48OQnP>rVSC?Z6IxrCi@EsM~1C-0=3%A135f2p$lEHKXG-6 zP7A#rFp)B4idnbi&H)&y^F@%NgXi{uJ>&*0iPj<@HBqSTikQ}q-Z zPKpV#-4Hr1f#*;gKr({Hg7IY{0L|2=EOn|&R!~TJW6sN4&tNjr;4ej{=W^RfSBI^> z40-hhgtm<0L`&i+=NM1mkIpQLn51?#fHUic>-(v4P9ti}^6>qlUbo9JA7_If3Zd%0 z+_Ha2o(PfauPew&z25DO0W8gDgX_u+SoWspWqJ21X@t1a!jy~ZpQ~ysp`W=eJ4{6Q zsYN|)oM|cymuZRvJNfcVd&ny(o$GO4Mes2kg->~o&M~3P_b&hvl3K;Ucb6lOTyM_` z`+r+rdGMiUw5YGMOtsYFtp()=xqY)Id9e4o>tbjz8CdhEb`4y3=kaUu$z-Jh?bL0Z z_ra<+HCV(3fx^S*LUzbDQ$ zts{Su`zM|4KFAp*rj(VxrfAJ@f117UW4Tbc{4lxW#@DrD@u`Ob%5t4t zdq*pLl6}52=t_qJo2W$XD&ES*wzg>xxr;#LT{mL-a{w6}naQ++9)f-Q0>ure$bIXFl15RC>a8cYb9S&z{{kq8R9| zKg!rvx8kA1VeeI~hd=|qH`+ZjIh%O(5+d~hv8SHiSKyK86|e1Bp6L4i!vjYo_;RMa zc=mG>7kZnY+J?U-WWp-K~^CMPLNciXH2yv~QK1DpoSj0|^6lvU?t;*BqBAdzh!!6D)neV$rR$GjJ7AsVI9cW%VGf zHC1R$$vl2k{>wPi#zhCz*J<2Jce}XrjL;%?8*4lK8O&c_Gh|Pz&TM(a^m%|5r|mo;b__a=R1=%d(`L?%K7 z^wr=UNRwvSGWpenD!LbA;_!JCMwBZ@9ExnJjy@Gge5?j_i%(aa3t6#eX%bUAc}ZOv zNPCyW!H}tXoH26mYy8fc4;tW{AA zqnkaxMySsR94W@p!uE^P!if>ifxAu7$0>srf^*TFkb|(?MsO1gyYwxrl$knkM3&A= zAb|O3OyB&Ay93EMC!moPKfXKLei8U+oA>zwY1Ib2HGnHGDKA%)l;YJpN{C+#^vUXo z{V@efR1l1WQ{7v8-KTV&RpSGH+xpUER@3(aMght6!y#c}9uDZu&obBmHW}jAQ@0v+ zVW0}(VvHB8w@rSagT}`IlA2T8Z(t@Tz2dykLW{ z&1jd9nd7`5PA6fpiSc@~MR&$twUuh~BuKG1R zWWqVzz07Vh(y#lhcWJ{AgHmgLI5kf4H0KpuoQE%+_fvEbEUSH+ z!+>d%gJ8fwlBIRIl+kwuSS_OO?4@uw9r4vbPxD$zosY(I+y1*~!wbc*KN%$aQe98k?bT_5YL7xn!Qp%D-yR97M@dGs{vcKbC>w! zB=Q{nW##)0ugTf1xD=y&m#RZqq%cNJBvUM0L%stt7Ggn~R&lrFPUJV|R@>J3fP2ZRqvJ{z z=8+$C$!tY8nS7a=qecv3XLMW{idNM$N#EC*ki$L)EIx>=_V#y$4k&(ROrS@UNnKt~3-84XJu$a+7O(Hd zP&{(Jfbbz!Mujdp+sYIdmZ<}igWhmlad-v-c3VHP^~H}dnm-jgqwEZC*D)*QxXJQO zX|g^M1{8Y|xp+`V5DD=7ME~XE@`epB%di5fgnxC01}J1_zwwgf6XeGA#Ftds2T%@l zD3R}A%Eo!y#B`CJUDoPU++9Xml?*@jQnNJDk=g(RTB@LZ`j&sHpYwP1{|nL#zhU4H zb^re*{+s82Bl_>k#`OI^4&R;r7xn*$G5^DZ-*mD2zgNJ*pDFTx&I=oVvjk-I&%5Ba zc&+tsXh#p>nh;0Xp&$?=N=fAVEj@p?Gpp*q65)!NFRzYT$OJJ(;N#Mk!u|?s75p%< zOZFIbLv?+hT|4>^m@wZyVqoF-4bf~oO+{aBwu(6s(Bg#SwA&$^gzR;;-B?qI!rcR# z?r48Jx8OXz!Qdf^&TA?|nW2;<52GQSHfPNCAULnne`e}Fd2dX2o$pk#qau@=!6p2G zL2?PR>%(ZJhJzsc>jF>X*(KH}LdauR#b>BTb9bd~ySo=(?O(b8n56QHg5-M{d$b#a z5Pt5(Z7JVe;X734C4(;#LDFl%H@!^#CQZyMMG1*cW3wI-B@|1w5P=Gn3RVgivu%fs zv8QpNw&~NVtFvV^tmgYRY7<`x*RA>cIDOh@%jp79`4Lv*ePysPzN+gYMVnK+&U~8B3$r@DgN2DGF1Wf@SV05@0_Zj6_kFV7d+luA?PEU#_q#=z(0qr zu}+x-r!pV;ZgpRgi+liDM|0fV_K14~4diGWCVH5>^J}8G&j-K4y~8*jnBN9((a3dP z-nql9+^jVo>s1T2Jgb3p`bdwYAcW1qeb*T`{XkKL;BKGlcd#j+4-6K17tdI^PF_p! zYg=!;hXq6Z@H~Qd$SWzo-12 zgvcfLzp(AN+((BiJX6{^&U5v-*iVgg#PF zy4kbi4H8JDgRTohXlKp13?fXi&{CqSq-Qt+8?>-z7D%UZ?R}P?DL0*grLj{0hZEk7 z)*ycK4bWd*#ZU;sW#K6=eZht zBUV`p{H!-pDO>Cg=h2ct!9KOu*ejFyb}92F)?#R6pA82LNhjHP+83{cwEAvb7S=Y+ z8N$bKZ)FsJZnM<%#|30KvM8q`0z{{7?Gqr@JQeP4Z$(PR;mAC%iIvFZo)*6XUpz|ED3&9Lfq9^haqrhDCPI`nT$3im&d>JYOY|qf zwiN5%$M^8B3_1*{=kdzMS`N}S5b2pD#P>V52%qE`q-ghhHxEj#IfCIF-Ev$ioji_o zY#XX=7o@QuLu*Hiu+krqI&QYtssei{v8z%b_L~k#IED|B)tu6qaUj>-Cb$aA9cMMh zCds0-$G=utwVp|g@xjKz$DAI~iq2dOErBD`VS(XWZRtLc$29zJ4az46AvdWGwq>|R zYOvch(+#^W@JkKsLY-sd^GjHg9v+}$KVB=jq$qeHJYzooc-&CstJ?dedC-BU+KF{> z`%~#ulyYZK?Mry;STv?w{2)1|L!ypx_cJG}Oj5pwR6tT&@pxgQ8qj*Y8pU*BMM52V zSZO&!I@Hi~Pkjb$>L|n@=*ARs&MQt#<&0;1I;?m1QOwJbI6%$oG7vq1rB>g`c-9^C dies$=0{(U-*Uj27Fl4AYdYzWlAXQBC{{WZt dial mode',self._system) + #Rewrite GPS Data comming in as a group call to a unit call #if (_call_type == 'group' or _call_type == 'vcsbk') and _int_dst_id == 900999: #_bits = header(_slot,'unit',_bits) @@ -2164,7 +2171,7 @@ class routerHBP(HBSYSTEM): for system in systems: if system == self._system: continue - #We only want to send data calls to individual IDs via OpenBridge + #We only want to send data calls to individual IDs via FreeBridge (not OpenBridge) if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE' and CONFIG['SYSTEMS'][system]['VER'] > 1 and (_int_dst_id >= 1000000): self.sendDataToOBP(system,_data,dmrpkt,pkt_time,_stream_id,_dst_id,_peer_id,_rf_src,_bits,_slot) @@ -2226,10 +2233,41 @@ class routerHBP(HBSYSTEM): else: logger.info('(%s) UNIT Data not bridged to HBP on slot %s - target busy: %s DST_ID: %s',self._system,_d_slot,_d_system,_int_dst_id) - + #Handle AMI private calls + if _call_type == 'unit' and not _data_call and self.STATUS[_slot]['_allStarMode'] and CONFIG['ALLSTAR']['ENABLED']: + if (_stream_id != self.STATUS[_slot]['RX_STREAM_ID']): + logger.info('(%s) AMI: Private call from %s to %s',self._system, int_id(_rf_src), _int_dst_id) + + + if (_frame_type == HBPF_DATA_SYNC) and (_dtype_vseq == HBPF_SLT_VTERM) and (self.STATUS[_slot]['RX_TYPE'] != HBPF_SLT_VTERM): + + if _int_dst_id == 4000: + logger.info('(%s) AMI: Private call from %s to %s (Disconnect)',self._system, int_id(_rf_src), _int_dst_id) + AMIOBJ.send_command('ilink 6 0') + elif _int_dst_id == 5000: + logger.info('(%s) AMI: Private call from %s to %s (Status)',self._system, int_id(_rf_src), _int_dst_id) + AMIOBJ.send_command('ilink 5 0') + else: + logger.info('(%s) AMI: Private call from %s to %s (Link)',self._system, int_id(_rf_src), _int_dst_id) + AMIOBJ.send_command('ilink 6 0') + AMIOBJ.send_command('ilink 3 ' + str(_int_dst_id)) + + # Mark status variables for use later + self.STATUS[_slot]['RX_PEER'] = _peer_id + self.STATUS[_slot]['RX_SEQ'] = _seq + self.STATUS[_slot]['RX_RFS'] = _rf_src + self.STATUS[_slot]['RX_TYPE'] = _dtype_vseq + self.STATUS[_slot]['RX_TGID'] = _dst_id + self.STATUS[_slot]['RX_TIME'] = pkt_time + self.STATUS[_slot]['RX_STREAM_ID'] = _stream_id + self.STATUS[_slot]['VOICE_STREAM'] = _voice_call + + self.STATUS[_slot]['packets'] = self.STATUS[_slot]['packets'] +1 + + #Handle private voice calls (for reflectors) - if _call_type == 'unit' and not _data_call: + elif _call_type == 'unit' and not _data_call and not self.STATUS[_slot]['_allStarMode']: if (_stream_id != self.STATUS[_slot]['RX_STREAM_ID']): self.STATUS[_slot]['packets'] = 0 @@ -2238,7 +2276,7 @@ class routerHBP(HBSYSTEM): self.STATUS[_slot]['_stopTgAnnounce'] = False logger.info('(%s) Reflector: Private call from %s to %s',self._system, int_id(_rf_src), _int_dst_id) - if _int_dst_id >= 5 and _int_dst_id != 9 and _int_dst_id <= 999999: + if _int_dst_id >= 5 and _int_dst_id != 8 and _int_dst_id != 9 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) 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']) @@ -2304,6 +2342,15 @@ class routerHBP(HBSYSTEM): _say.append(words[_lang]['busy']) _say.append(words[_lang]['silence']) self.STATUS[_slot]['_stopTgAnnounce'] = True + + #Allstar mode switch + if CONFIG['ALLSTAR']['ENABLED'] and _int_dst_id == 8: + logger.info('(%s) Reflector: voice called - TG 8 AllStar"', self._system) + _say.append(words[_lang]['all-star-link-mode']) + _say.append(words[_lang]['silence']) + self.STATUS[_slot]['_stopTgAnnounce'] = True + self.STATUS[_slot]['_allStarMode'] = True + reactor.callLater(30,resetallStarMode) #If disconnection called if _int_dst_id == 4000: @@ -2375,7 +2422,7 @@ class routerHBP(HBSYSTEM): self.STATUS[_slot]['VOICE_STREAM'] = _voice_call self.STATUS[_slot]['packets'] = self.STATUS[_slot]['packets'] +1 - + #Handle group calls if _call_type == 'group' or _call_type == 'vcsbk': @@ -2695,17 +2742,17 @@ if __name__ == '__main__': #If MySQL is enabled, read master config from MySQL too if CONFIG['MYSQL']['USE_MYSQL'] == True: - logger.debug('(MYSQL) MySQL config enabled') + logger.info('(MYSQL) MySQL config enabled') SQLCONFIG = {} sql = useMYSQL(CONFIG['MYSQL']['SERVER'], CONFIG['MYSQL']['USER'], CONFIG['MYSQL']['PASS'], CONFIG['MYSQL']['DB'],CONFIG['MYSQL']['TABLE'],logger) #Run it once immediately if sql.con(): - logger.debug('(MYSQL) reading config from database') + logger.info('(MYSQL) reading config from database') try: SQLCONFIG = sql.getConfig() #Add MySQL config data to config dict except: - logger.debug('(MYSQL) problem with SQL query, aborting') + logger.warning('(MYSQL) problem with SQL query, aborting') sql.close() logger.debug('(MYSQL) building ACLs') # Build ACLs @@ -2716,8 +2763,13 @@ if __name__ == '__main__': CONFIG['SYSTEMS'].update(SQLCONFIG) else: - logger.debug('(MYSQL) problem connecting to SQL server, aborting') + logger.warning('(MYSQL) problem connecting to SQL server, aborting') + if CONFIG['ALLSTAR']['ENABLED']: + logger.info('(AMI) Setting up AMI: Server: %s, Port: %s, User: %s, Pass: %s, Node: %s',CONFIG['ALLSTAR']['SERVER'],CONFIG['ALLSTAR']['PORT'],CONFIG['ALLSTAR']['USER'],CONFIG['ALLSTAR']['PASS'],CONFIG['ALLSTAR']['NODE']) + + AMIOBJ = AMI(CONFIG['ALLSTAR']['SERVER'],CONFIG['ALLSTAR']['PORT'],CONFIG['ALLSTAR']['USER'],CONFIG['ALLSTAR']['PASS'],CONFIG['ALLSTAR']['NODE']) + # Set up the signal handler def sig_handler(_signal, _frame): diff --git a/config.py b/config.py index 4d0d402..f0ac779 100755 --- a/config.py +++ b/config.py @@ -129,6 +129,7 @@ def build_config(_config_file): CONFIG['ALIASES'] = {} CONFIG['SYSTEMS'] = {} CONFIG['MYSQL'] = {} + CONFIG['ALLSTAR'] = {} try: for section in config.sections(): @@ -194,6 +195,17 @@ def build_config(_config_file): 'TABLE': config.get(section, 'TABLE') }) + elif section == 'ALLSTAR': + CONFIG['ALLSTAR'].update({ + 'ENABLED': config.getboolean(section, 'ENABLED'), + 'USER': config.get(section, 'USER'), + 'PASS': config.get(section, 'PASS'), + 'SERVER': gethostbyname(config.get(section, 'SERVER')), + 'PORT': config.getint(section,'PORT'), + 'NODE' : config.getint(section,'NODE') + }) + + elif config.getboolean(section, 'ENABLED'): if config.get(section, 'MODE') == 'PEER': diff --git a/i8n_voice_map.py b/i8n_voice_map.py index 401d2c1..b1654cf 100644 --- a/i8n_voice_map.py +++ b/i8n_voice_map.py @@ -109,13 +109,15 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'linkedto': 'linked-to', + 'allstar-link-mode': 'alpha' }, 'en_US': { 'to': '2', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'alpha' }, 'es_ES': { @@ -156,7 +158,8 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'linkedto': 'linked-to', + 'allstar-link-mode': 'alfa' }, 'es_ES_2': { '1': 'one', @@ -196,7 +199,8 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'linkedto': 'linked-to', + 'allstar-link-mode': 'alpha' }, 'fr_FR': { @@ -228,7 +232,8 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'linkedto': 'linked-to', + 'allstar-link-mode': 'alpha' }, 'pt_PT': { @@ -260,7 +265,8 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'linkedto': 'linked-to', + 'allstar-link-mode': 'alpha' }, 'el_GR': { @@ -292,55 +298,63 @@ voiceMap = { 'Z': 'zulu', 'to': 'silence', 'notlinked': 'not-linked', - 'linkedto': 'linked-to' + 'allstar-link-mode': 'alpha' }, 'de_DE': { 'to': 'silence', + 'allstar-link-mode': 'A' }, 'dk_DK': { 'to': 'silence', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'A' }, 'it_IT': { 'to': 'silence', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'A' }, 'no_NO': { 'to': 'silence', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'A' }, 'pl_PL': { 'to': 'silence', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'A' }, 'se_SE': { 'to': 'silence', 'freedmr': 'silence', - 'this-is': 'silence' + 'this-is': 'silence', + 'allstar-link-mode': 'A' }, 'CW': { 'to': 'silence', 'freedmr': 'silence', 'this-is': 'silence', - 'linkedto': 'silence' + 'linkedto': 'silence', + 'allstar-link-mode': 'T' }, 'th_TH': { 'to': 'silence', + 'allstar-link-mode': 'A' },