From 422bfd5f530f49e1d2fb09ad72071f717d7d0d71 Mon Sep 17 00:00:00 2001
From: Simon <simon@gb7fr.org.uk>
Date: Fri, 23 Jul 2021 17:01:16 +0100
Subject: [PATCH] replace master with corrected merge from hrt

---
 bridge_master.py | 56 ++++++++++++++++++++++++++++++++----------------
 config.py        |  1 +
 2 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/bridge_master.py b/bridge_master.py
index 65fdd3c..b3225ba 100755
--- a/bridge_master.py
+++ b/bridge_master.py
@@ -34,7 +34,7 @@ This program currently only works with group voice calls.
 # Python modules we need
 import sys
 from bitarray import bitarray
-from time import time,sleep
+from time import time,sleep,perf_counter
 import importlib.util
 import re
 import copy
@@ -415,8 +415,16 @@ def stream_trimmer_loop():
                     _stream = systems[system].STATUS[stream_id]
                     _sysconfig = CONFIG['SYSTEMS'][system]
                     #systems[system].STATUS[stream_id]['_fin'] = True
-                    logger.info('(%s) *TIME OUT*   STREAM ID: %s SUB: %s PEER: %s TGID: %s TS 1 Duration: %.2f', \
-                        system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START'])
+                    if '_bcsq' in _sysconfig and _stream['TGID'] in _sysconfig['_bcsq'] and _sysconfig['_bcsq'][_stream['TGID']] == stream_id:
+                        logger.debug('(%s) *TIME OUT*   STREAM ID: %s SUB: %s PEER: %s TGID: %s TS 1 (BCSQ)', \
+                            system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids))
+                    elif '_bcsq' in systems[system].STATUS[stream_id] :
+                        logger.debug('(%s) *TIME OUT*   STREAM ID: %s SUB: %s PEER: %s TGID: %s TS 1 (BCSQ)', \
+                            system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids))
+                    else:
+                        logger.info('(%s) *TIME OUT*   STREAM ID: %s SUB: %s PEER: %s TGID: %s TS 1 Duration: %.2f', \
+                            system, int_id(stream_id), get_alias(int_id(_stream['RFS']), subscriber_ids), get_alias(int_id(_stream['RX_PEER']), peer_ids), get_alias(int_id(_stream['TGID']), talkgroup_ids), _stream['LAST'] - _stream['START'])
+                        
                     if CONFIG['REPORTS']['REPORT']:
                             systems[system]._report.send_bridgeEvent('GROUP VOICE,END,RX,{},{},{},{},{},{},{:.2f}'.format(system, int_id(stream_id), int_id(_stream['RX_PEER']), int_id(_stream['RFS']), 1, int_id(_stream['TGID']), _stream['LAST'] - _stream['START']).encode(encoding='utf-8', errors='ignore'))
                     systems[system].STATUS[stream_id]['_to'] = True
@@ -1362,7 +1370,7 @@ class routerOBP(OPENBRIDGE):
                     'CONTENTION':False,
                     'RFS':       _rf_src,
                     'TGID':      _dst_id,
-                    '1ST': True,
+                    '1ST': perf_counter(),
                     'lastSeq': False,
                     'lastData': False,
                     'RX_PEER': _peer_id
@@ -1393,12 +1401,13 @@ class routerOBP(OPENBRIDGE):
                         logger.warning("(%s) OBP *LoopControl* STREAM ID: %s ALREADY FINISHED FROM THIS SOURCE, IGNORING",self._system, int_id(_stream_id))
                     self.STATUS[_stream_id]['_finlog'] = True
                     return
-               
-                #LoopControl#
+                
+                #LoopControl
+                hr_times = {}
                 for system in systems:                            
-                    if system  == self._system:
-                        continue
-                    if CONFIG['SYSTEMS'][system]['MODE'] != 'OPENBRIDGE':
+                   # if system  == self._system:
+                   #     continue
+                    if system != self._system and CONFIG['SYSTEMS'][system]['MODE'] != 'OPENBRIDGE':
                         for _sysslot in systems[system].STATUS:
                             if 'RX_STREAM_ID' in systems[system].STATUS[_sysslot] and _stream_id == systems[system].STATUS[_sysslot]['RX_STREAM_ID']:
                                 if 'LOOPLOG' not in self.STATUS[_stream_id] or not self.STATUS[_stream_id]['LOOPLOG']: 
@@ -1409,16 +1418,25 @@ class routerOBP(OPENBRIDGE):
                     else:
                         #if _stream_id in systems[system].STATUS and systems[system].STATUS[_stream_id]['START'] <= self.STATUS[_stream_id]['START']:
                         if _stream_id in systems[system].STATUS and '1ST' in systems[system].STATUS[_stream_id] and systems[system].STATUS[_stream_id]['TGID'] == _dst_id:
-                            if 'LOOPLOG' not in self.STATUS[_stream_id] or not self.STATUS[_stream_id]['LOOPLOG']:
-                                logger.warning("(%s) OBP *LoopControl* FIRST OBP %s, STREAM ID: %s, TG %s, IGNORE THIS SOURCE",self._system, system, int_id(_stream_id), int_id(_dst_id))
-                                self.STATUS[_stream_id]['LOOPLOG'] = True
-                            self.STATUS[_stream_id]['LAST'] = pkt_time
-                            
-                            if CONFIG['SYSTEMS'][self._system]['ENHANCED_OBP'] and '_bcsq' not in self.STATUS[_stream_id]:
-                                systems[self._system].send_bcsq(_dst_id,_stream_id)
-                                #logger.warning("(%s) OBP *BridgeControl* Sent BCSQ , STREAM ID: %s, TG %s",self._system, int_id(_stream_id), int_id(_dst_id))
-                                self.STATUS[_stream_id]['_bcsq'] = True
-                            return
+                             hr_times[system] = systems[system].STATUS[_stream_id]['1ST']
+                
+                #use the minimum perf_counter to ensure
+                #We always use only the earliest packet
+                fi = min(hr_times, key=hr_times.get)      
+                
+                hr_times = None
+                
+                if self._system != fi:             
+                    if 'LOOPLOG' not in self.STATUS[_stream_id] or not self.STATUS[_stream_id]['LOOPLOG']:
+                        logger.warning("(%s) OBP *LoopControl* FIRST OBP %s, STREAM ID: %s, TG %s, IGNORE THIS SOURCE",self._system, fi, int_id(_stream_id), int_id(_dst_id))
+                        self.STATUS[_stream_id]['LOOPLOG'] = True
+                    self.STATUS[_stream_id]['LAST'] = pkt_time
+                    
+                    if CONFIG['SYSTEMS'][self._system]['ENHANCED_OBP'] and '_bcsq' not in self.STATUS[_stream_id]:
+                        systems[self._system].send_bcsq(_dst_id,_stream_id)
+                        #logger.warning("(%s) OBP *BridgeControl* Sent BCSQ , STREAM ID: %s, TG %s",self._system, int_id(_stream_id), int_id(_dst_id))
+                        self.STATUS[_stream_id]['_bcsq'] = True
+                    return
                         
                 #Duplicate handling#
                 #Duplicate complete packet
diff --git a/config.py b/config.py
index 1a6d2c7..afe383b 100755
--- a/config.py
+++ b/config.py
@@ -316,6 +316,7 @@ def build_config(_config_file):
                         'MODE': config.get(section, 'MODE'),
                         'ENABLED': config.getboolean(section, 'ENABLED'),
                         'NETWORK_ID': config.getint(section, 'NETWORK_ID').to_bytes(4, 'big'),
+                        #'OVERRIDE_SERVER_ID': config.getint(section, 'OVERRIDE_SERVER_ID').to_bytes(4, 'big'),
                         'IP': config.get(section, 'IP'),
                         'PORT': config.getint(section, 'PORT'),
                         'PASSPHRASE': bytes(config.get(section, 'PASSPHRASE').ljust(20,'\x00')[:20], 'utf-8'),
-- 
GitLab