Forráskód Böngészése

synctime mult-root

lihz 8 éve
szülő
commit
032e2602d8
2 módosított fájl, 51 hozzáadás és 118 törlés
  1. 45 77
      SyncTime/SyncManager.cpp
  2. 6 41
      SyncTime/SyncManager.h

+ 45 - 77
SyncTime/SyncManager.cpp

@@ -21,78 +21,74 @@ void HostServer::SyncManager::init()
 void HostServer::SyncManager::analyzeSyncMsg(SyncTimeMsg &msg)
 {
 	EnterCriticalSection(&m_csSyncTime);
-	if(_rootSyncTimeMsgs.count(msg.RootIdCode())>0){ // 判断是否存在该root节点记录
-
-	}
-
-	int idx = FindSyncTimeMsg(msg.SyncNum());
+	int idx = FindSyncTimeMsg(msg.RootIdCode(), msg.SyncNum());
 
 	if( -1 == idx){ // 没找到
 		// 如果时间同步消息的版本数量超过最大限制,则删除最早添加的消息
-		if(_syncTimeMsgs.size() >= MAX_SYNCTIME_NUM){ // 删除第一个
+		if(_syncTimeMsgs[msg.RootIdCode()].size() >= MAX_SYNCTIME_NUM){ // 删除第一个
 			// 可能有泄露
-			_syncTimeMsgs.pop_front();
+			_syncTimeMsgs[msg.RootIdCode()].pop_front();
 		}
 		SyncTimeMsgItem it;
 		it.SyncNum = msg.SyncNum();
 		it.SyncTimeMsgs[msg.LocalIdCode()] = msg;
-		_syncTimeMsgs.push_back(it);
+		_syncTimeMsgs[msg.RootIdCode()].push_back(it);
 
-		idx = _syncTimeMsgs.size() - 1;
+		idx = _syncTimeMsgs[msg.RootIdCode()].size() - 1;
 	}else{
-		_syncTimeMsgs[idx].SyncTimeMsgs[msg.LocalIdCode()] = msg;
+		_syncTimeMsgs[msg.RootIdCode()][idx].SyncTimeMsgs[msg.LocalIdCode()] = msg;
 	}
 
 	//
-	while(_historySync.size() > MAX_SYNCTIME_NUM){
-		_historySync.pop_front();
+	while(_historySync[msg.RootIdCode()].size() > MAX_SYNCTIME_NUM){
+		_historySync[msg.RootIdCode()].pop_front();
 	}
 
     // 更新时间同步并计算
-	for(auto it :_syncTimeMsgs[idx].SyncTimeMsgs)
+	for(auto it :_syncTimeMsgs[msg.RootIdCode()][idx].SyncTimeMsgs)
 	{
-		updateSync(idx, msg.SyncNum(), it.first);
+		updateSync(msg.RootIdCode(), idx, msg.SyncNum(), it.first);
 	}
 	LeaveCriticalSection(&m_csSyncTime);
 }
 
-bool HostServer::SyncManager::updateSync(int idx, unsigned short SyncNum, unsigned long long localIdCode)
+bool HostServer::SyncManager::updateSync(unsigned long long rootIdCode, int idx, unsigned short SyncNum, unsigned long long localIdCode)
 {
 	if(-1 == idx){
 		return false;
 	}
     // 如果当前版本的时间同步消息未收到则返回false
-	unordered_map<unsigned long long, SyncTimeMsg>::iterator itSyncTime = _syncTimeMsgs[idx].SyncTimeMsgs.find(localIdCode);
-	if(itSyncTime == _syncTimeMsgs[idx].SyncTimeMsgs.end()){
+	unordered_map<unsigned long long, SyncTimeMsg>::iterator itSyncTime = _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs.find(localIdCode);
+	if(itSyncTime == _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs.end()){
 		return false;
 	}
 
-    SyncTimeMsg &msg = _syncTimeMsgs[idx].SyncTimeMsgs[localIdCode];
+    SyncTimeMsg &msg = _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs[localIdCode];
 
     // 如果当前的为root,则返回true
     if(msg.SyncLevel() == 0){
         return true;
     } 
 
-	int idx_synctime = FindSyncTime(SyncNum);
+	int idx_synctime = FindSyncTime(rootIdCode, SyncNum);
 
 	// 如果时间同步已经计算过,则返回true
 	if(-1 != idx_synctime){
-		unordered_map<unsigned long long, SyncTime>::iterator itHistSync = _historySync[idx_synctime].HistSync.find(localIdCode);
-		if(itHistSync != _historySync[idx_synctime].HistSync.end()){
+		unordered_map<unsigned long long, SyncTime>::iterator itHistSync = _historySync[rootIdCode][idx_synctime].HistSync.find(localIdCode);
+		if(itHistSync != _historySync[rootIdCode][idx_synctime].HistSync.end()){
 			if(itHistSync->second.TimeDelay())
 			return true;
 		}
 	}
 
     // 如果已经收到了上一级的同步消息
-    if(_syncTimeMsgs[idx].SyncTimeMsgs.count(msg.UpperIdCode())){
-        if(!updateSync(idx, SyncNum, msg.UpperIdCode())){
+    if(_syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs.count(msg.UpperIdCode())){
+        if(!updateSync(rootIdCode, idx, SyncNum, msg.UpperIdCode())){
             return false;
         }
-        SyncTimeMsg &upperMsg = _syncTimeMsgs[idx].SyncTimeMsgs[msg.UpperIdCode()];
+        SyncTimeMsg &upperMsg = _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs[msg.UpperIdCode()];
         SyncTime* s = NULL;
-        for(auto it(_historySync.rbegin()); it != _historySync.rend(); ++it)
+        for(auto it(_historySync[rootIdCode].rbegin()); it != _historySync[rootIdCode].rend(); ++it)
         {
             if(it->SyncNum != msg.SyncNum() && it->HistSync.count(localIdCode))
             {
@@ -101,27 +97,27 @@ bool HostServer::SyncManager::updateSync(int idx, unsigned short SyncNum, unsign
             }
         }
 
-		idx_synctime = FindSyncTime(SyncNum);
+		idx_synctime = FindSyncTime(rootIdCode, SyncNum);
 
 		if(-1 == idx_synctime){
 			SyncTimeItem it;
 			it.SyncNum = msg.SyncNum();
 			it.HistSync[localIdCode] = SyncTime(msg, upperMsg, s);
-			_historySync.push_back(it);
+			_historySync[rootIdCode].push_back(it);
 
-			idx_synctime = _historySync.size() - 1;
+			idx_synctime = _historySync[rootIdCode].size() - 1;
 		}else{
-			_historySync[idx_synctime].HistSync[localIdCode] = SyncTime(msg, upperMsg, s);
+			_historySync[rootIdCode][idx_synctime].HistSync[localIdCode] = SyncTime(msg, upperMsg, s);
 		}
 
         // 计算时间同步
         long long upperTimeDelay = 0;
-        if(_syncTimeMsgs[idx].SyncTimeMsgs[msg.UpperIdCode()].SyncLevel() != 0)
+        if(_syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs[msg.UpperIdCode()].SyncLevel() != 0)
         {
-            upperTimeDelay = _historySync[idx_synctime].HistSync[msg.UpperIdCode()].TimeDelay();
+            upperTimeDelay = _historySync[rootIdCode][idx_synctime].HistSync[msg.UpperIdCode()].TimeDelay();
         }
-        long long sendTime = _historySync[idx_synctime].HistSync[localIdCode].SendTime();
-        long long receiveTime = _historySync[idx_synctime].HistSync[localIdCode].ReceiveTime();
+        long long sendTime = _historySync[rootIdCode][idx_synctime].HistSync[localIdCode].SendTime();
+        long long receiveTime = _historySync[rootIdCode][idx_synctime].HistSync[localIdCode].ReceiveTime();
         long long timeDelay = receiveTime - sendTime - _distance[localIdCode][msg.UpperIdCode()];
 
         timeDelay += upperTimeDelay;
@@ -131,48 +127,26 @@ bool HostServer::SyncManager::updateSync(int idx, unsigned short SyncNum, unsign
 		if(timeDelay + TIME_MAX < 0 ){
 			timeDelay += TIME_MAX;
 		}
-        _historySync[idx_synctime].HistSync[localIdCode].TimeDelay(timeDelay);
+        _historySync[rootIdCode][idx_synctime].HistSync[localIdCode].TimeDelay(timeDelay);
         return true;
     }
     return false;
 }
 
-HostServer::Position HostServer::SyncManager::analyzeTagMsg(TagMsg &tagMsg, unsigned long long tagId, unsigned short tagNum)
-{
-    _tagRecords[tagId][tagNum].push_back(tagMsg);
-    // 获取预估的时间差
-    unordered_map<unsigned long long, long long> times;
-    if(!_tagRecords.size() || !_tagRecords[tagId].size() || _tagRecords[tagId][tagNum].size() != 4)
-    {
-        return Position(DBL_MAX, DBL_MAX, DBL_MAX);
-    }
-
-    for(auto tag : _tagRecords[tagId][tagNum])
-    {
-        auto res = calTimeByLinar(tag);
-        if(res == LLONG_MAX) return Position(DBL_MAX, DBL_MAX, DBL_MAX);
-        times[tag.StationIdCode] = res;
-    }
-
-    // 初始化矩阵
-    auto begin = times.begin();
-    auto it = begin;
-    it++;
-
-    return Position(DBL_MAX, DBL_MAX, DBL_MAX);
-}
-
 unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
 {
 	EnterCriticalSection(&m_csCalcLiner);
     // 获取历史记录中与此tag最近的两条
     deque<SyncTime> hisSync;
     //ofstream fout("test/linar_513.txt",ios::app);
+
+	unsigned long long rootIdCode = 0;// getRootIdCode(tag.StationIdCode);
+
     int i = 0;
-	int idx = FindSyncTimeMsg(tag.SyncNum);
+	int idx = FindSyncTimeMsg(rootIdCode, tag.SyncNum);
 	if(-1 != idx){
-		unordered_map<unsigned long long, SyncTimeMsg>::iterator it = _syncTimeMsgs[idx].SyncTimeMsgs.find(tag.StationIdCode);
-		if(it != _syncTimeMsgs[idx].SyncTimeMsgs.end()){
+		unordered_map<unsigned long long, SyncTimeMsg>::iterator it = _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs.find(tag.StationIdCode);
+		if(it != _syncTimeMsgs[rootIdCode][idx].SyncTimeMsgs.end()){
 			if(it->second.SyncLevel() == 0){
 				LeaveCriticalSection(&m_csCalcLiner);
 				return tag.ReceiveTime;
@@ -184,18 +158,12 @@ unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
     while(hisSync.size() < 2 && i < MAX_CALCLINER_NUM)
     {
         auto syncNum = tag.SyncNum - i;
-		idx_sync = FindSyncTime(syncNum);
+		idx_sync = FindSyncTime(rootIdCode, syncNum);
 		if(-1 != idx_sync){
-			if(_historySync[idx_sync].HistSync.count(tag.StationIdCode)){
-				hisSync.push_front(_historySync[idx_sync].HistSync[tag.StationIdCode]);
+			if(_historySync[rootIdCode][idx_sync].HistSync.count(tag.StationIdCode)){
+				hisSync.push_front(_historySync[rootIdCode][idx_sync].HistSync[tag.StationIdCode]);
 			}
 		}
-	
-        //if(_historySync.count(syncNum) && _historySync[syncNum].count(tag.StationIdCode))
-        //{
-        //    // return (tag.ReceiveTime + (_historySync[syncNum][tag.StationIdCode].IsRTimeOverflow() ? TIME_MAX : 0) - _historySync[syncNum][tag.StationIdCode].TimeDelay()) & TIME_MAX;
-        //    hisSync.push_front(_historySync[syncNum][tag.StationIdCode]);
-        //}
         i++;
     }
     // 如果满足条件的历史记录不足两个则返回
@@ -317,22 +285,22 @@ HostServer::SyncManager::~SyncManager()
 	DeleteCriticalSection(&m_csSyncTime);
 }
 
-int HostServer::SyncManager::FindSyncTimeMsg( unsigned short SyncNum )
+int HostServer::SyncManager::FindSyncTimeMsg(unsigned long long rootIdCode, unsigned short SyncNum )
 {
 	int idx = -1;
-	for(int i = _syncTimeMsgs.size() - 1; i >= 0; i--){
-		if(_syncTimeMsgs[i].SyncNum == SyncNum ){
+	for(int i = _syncTimeMsgs[rootIdCode].size() - 1; i >= 0; i--){
+		if(_syncTimeMsgs[rootIdCode][i].SyncNum == SyncNum ){
 			return i;
 		}
 	}
 	return idx;
 }
 
-int HostServer::SyncManager::FindSyncTime( unsigned short SyncNum )
+int HostServer::SyncManager::FindSyncTime(unsigned long long rootIdCode, unsigned short SyncNum )
 {
 	int idx = -1;
-	for(int i = _historySync.size() - 1; i >= 0; i--){
-		if(_historySync[i].SyncNum == SyncNum ){
+	for(int i = _historySync[rootIdCode].size() - 1; i >= 0; i--){
+		if(_historySync[rootIdCode][i].SyncNum == SyncNum ){
 			return i;
 		}
 	}

+ 6 - 41
SyncTime/SyncManager.h

@@ -29,7 +29,6 @@ namespace HostServer{
 
 		CRITICAL_SECTION m_csSyncTime;
 		CRITICAL_SECTION m_csCalcLiner;
-
     public:
         SyncManager();
 		~SyncManager();
@@ -49,16 +48,6 @@ namespace HostServer{
         //************************************
         void analyzeSyncMsg(SyncTimeMsg &msg);
 
-        //************************************
-        // Description: 用于分析Tag定位信息,并获得坐标位置
-        // Method:      analyzeTagMsg
-        // Returns:     Position
-        // Parameter:   TagRecord & tagMsg
-        // Parameter:   unsigned long long tagId
-        // Parameter:   unsigned short tagNum
-        //************************************
-        Position analyzeTagMsg(TagMsg &tagMsg, unsigned long long tagId, unsigned short tagNum);
-
         //************************************
         // Description: 更新距离信息
         // Method:      updateDistance
@@ -97,16 +86,12 @@ namespace HostServer{
         // unsigned long long 代表anchor编码 ID+AntNum
         unordered_map<unsigned long long,unordered_map<unsigned long long, double>> _distance; 
 
+		// with root
         // 使用_syncTimeMsgs[SyncNum][LocalIdCode]访问对应的SyncTimeMsg,即同步时间消息
-        //unordered_map<unsigned short, unordered_map<unsigned long long, SyncTimeMsg>> _syncTimeMsgs;
-		deque<SyncTimeMsgItem> _syncTimeMsgs;
+		unordered_map<unsigned long long, deque<SyncTimeMsgItem>> _syncTimeMsgs;
 
         // 使用_historySync[SyncNum][LocalIdCode]访问对应的SyncTime,即计算后的时间同步
-        //unordered_map<unsigned short, unordered_map<unsigned long long, SyncTime>> _historySync;
-		deque<SyncTimeItem> _historySync;
-
-        // 使用_tagRecords[TagId][TagNum]访问对应的TagRecord列表,TagId为Tag的编号,TagNum为Tag的序列号
-        unordered_map<unsigned long long,unordered_map<unsigned short, vector<TagMsg>>>_tagRecords;
+		unordered_map<unsigned long long, deque<SyncTimeItem>> _historySync;
 
         //************************************
         // Description: 根据Tag的记录和历史msg,利用线性插值算法计算Tag的预估时间
@@ -117,25 +102,6 @@ namespace HostServer{
         // Parameter:   unsigned long long localIdCode 接收tag的anchorID编码
         //************************************
         unsigned long long calTimeByLinar(TagMsg &tag);
-
-        //************************************
-        // Description: 用于更新时间同步的各项属性
-        // Method:      updateSync
-        // Returns:     bool
-        // Parameter:   unsigned short SyncNum
-        // Parameter:   unsigned long long localIdCode
-        //************************************
-
-        bool updateSync(unsigned short SyncNum, unsigned long long localIdCode);
-
-		// with root
-
-		// 使用_rootSyncTimeMsgs[RootIdCode][SyncNum][LocalIdCode]访问对应的SyncTimeMsg,即同步时间消息
-		unordered_map<unsigned long long, unordered_map<unsigned short, unordered_map<unsigned long long, SyncTimeMsg>>> _rootSyncTimeMsgs;
-
-		// 使用_rootHistorySync[RootIdCode][SyncNum][LocalIdCode]访问对应的SyncTime,即计算后的时间同步
-		unordered_map<unsigned long long, unordered_map<unsigned short, unordered_map<unsigned long long, SyncTime>>> _rootHistorySync;
-
 		//************************************
 		// Method:    updateSync
 		// Returns:   bool
@@ -143,9 +109,8 @@ namespace HostServer{
 		// Parameter: unsigned short SyncNum
 		// Parameter: unsigned long long localIdCode
 		//************************************
-		bool updateSync(unsigned long long rootIdCode, unsigned short SyncNum, unsigned long long localIdCode);
-        bool updateSync(int idx, unsigned short SyncNum, unsigned long long localIdCode);
-		int FindSyncTimeMsg(unsigned short SyncNum);
-		int FindSyncTime(unsigned short SyncNum);
+		bool updateSync(unsigned long long rootIdCode, int idx, unsigned short SyncNum, unsigned long long localIdCode);
+		int FindSyncTimeMsg(unsigned long long rootIdCode, unsigned short SyncNum);
+		int FindSyncTime(unsigned long long rootIdCode, unsigned short SyncNum);
     };
 }