public void SelfInnformation_Print(Point center, int sp_ca, int max_sp_ca, int oh_ca, int max_oh_ca, string selfsocketip, Node listener, VoiceRecorder MIC) // 把自己的資訊印出來 { SelfInformation.Text = "OriginID : " + Vast.VASTGetSelfID().ToString() + " x : " + center.X.ToString() + " y : " + center.Y.ToString() + " Listen Capacity : " + sp_ca.ToString() + " / " + max_sp_ca.ToString() + " Overheaer Capacity : " + oh_ca.ToString() + " / " + max_oh_ca.ToString() + "\n" + "IP : " + selfsocketip; if (listener != null) SelfInformation.Text += " Listener : " + listener.name.ToString(); else SelfInformation.Text += " Listener : 0"; if (MIC != null) SelfInformation.Text += " MIC : ON"; else SelfInformation.Text += " MIC : OFF"; }
private void ReceiveExit(string[] split_str) // (廣播) 4 接收到離開訊息 { ulong ID = ulong.Parse(split_str[0]); // index 0 為 ID neighbor.Remove(ID, listenserverlist); // 刪除該節點, 連同監聽的一併刪除 neighborList = neighbor.GetList(); // 取得鄰居列表 if (voicerecorder != null) voicerecorder.Update_Info(neighborList); // 重新設定 relation.Set_NeighborList(neighborList); // 重新設定 relationList = relation.Get_RelationList(); // 重新取得關係列表 if (Listener != relation.Get_Listener()) // 若為傾聽者離開 { Listener = relation.Get_Listener(); // 重新取得傾聽者 string str = SelfID.ToString() + " " + TYPE_ADDLISTENER + " " + Listener.ToString(); Vast.VASTPublish(str, (uint)str.Length, AOI_RADIUS); } // 顯示在視窗上 show.SelfInnformation_Print(aoi_center, Speaker_Capacity, Max_Speaker_Capacity, Overhearer_Capacity, Max_Overhearer_capacity, socketip, Listener, voicerecorder); myPanel.Refresh(); // 更新畫面 }
private void UpdateNeighborInfomation() // 更新鄰居資料 包含 鄰居列表 鄰居關係值 Listener { neighborList = neighbor.GetList(); // 取得鄰居清單 // 設定與鄰居之間的關係值 ---------------------------------------------------------- 位置及面對的方向還要改一下,例如,背對背面對的方向是相反的 relation.Set_NeighborList(neighborList); // 設定鄰居清單 relation.Update_RelationList(SelfDirect); // 更新鄰居之關係值 relationList = relation.Get_RelationList(); // 取得鄰居清單關係值 // 依據 AutoSpeak 來選取 Listener if (AutoSpeak) // 只有自動取得 Listener 才會, 選擇最高者 Listener = relation.Get_Listener(); // 取得傾聽者 else // 手動 取得則要判斷是否在自己的範圍中 if (!neighbor.Find(Listener.id)) // 若已經超出範圍 Listener = relation.Get_Listener(); // 自動取得關係值最高之傾聽者 if (Listener.id != 0) // 若有 Listener 時 { if (Compare_Listener.id != Listener.id) // 若先前的傾聽者跟此次的傾聽者不同人時 { // 先告知先前的 Listener 要離開 if (Compare_Listener.id != 0) // 若先前的傾聽者不為空 { // $$$$$$ 封包格式 : 自己的ID + 傳送資料型態 + 欲離開的ListenerID string str_exit = SelfID.ToString() + " " + // 自己的 ID TYPE_EXITLISTENER.ToString() + " " + // 傳送離開訊息類型 Compare_Listener.id.ToString(); // 先前 Listener ID //Vast.VASTPublish(str_exit, (uint)str_exit.Length, AOI_RADIUS); // 傳送廣播訊息給先前的 Listener 告知我要換 Listener } // 後告知當前的 Listener 要加入 // $$$$$$ 封包格式 : 自己的ID + 傳送資料型態 + 欲加入的ListenerID string str_join = SelfID.ToString() + " " + // 自己的 ID TYPE_ADDLISTENER.ToString() + " " + // 傳送加入訊息類型 Listener.id.ToString(); // 目前的 Listener ID Thread.Sleep(50); // 停止 0.05s 再傳送訊息 //Vast.VASTPublish(str_join, (uint)str_join.Length, AOI_RADIUS); // 傳送廣播訊息給 Listener 告知我成為他的 ListenerChild Compare_Listener = Listener; // 先前的 Listener 被 目前的 Listener 取代 } } else // 若沒有 Listener 或 離開了 Listener 範圍 if (Compare_Listener.id != 0) // 若先前還有傾聽者時 { // $$$$$$ 封包格式 : 自己的ID + 傳送資料型態 + 欲加入的ListenerID string str = SelfID.ToString() + " " + TYPE_EXITLISTENER.ToString() + " " + // 要傳送的訊息 Compare_Listener.id.ToString(); // 先前 Listener ID //Vast.VASTPublish(str, (uint)str.Length, AOI_RADIUS); // 傳送廣播訊息給先前的 Listener 告知我要換 Listener Compare_Listener = new Node(0, "0", null, 0, 0, 0, 0); } // 更新監聽 Thread 的資訊 for (int i = 0; i < listenserverlist.Count; i++) listenserverlist[i].Update_Info(aoi_center, SelfDirect, neighborList, Listener.id); // 更新傳送語音裡面的資訊 if (voicerecorder != null) voicerecorder.Update_Info(neighborList); // 顯示在視窗上 show.SelfInnformation_Print(aoi_center, Speaker_Capacity, Max_Speaker_Capacity, Overhearer_Capacity, Max_Overhearer_capacity, socketip, Listener, voicerecorder); myPanel.Refresh(); }
private void Enviro_Initial() // 初始化 VAST 環境 { aoi_center = new Point(INIT_X, INIT_Y); // aoi 中心位置 keyout.Text = ""; // 初始化輸出區塊 keyout.BackColor = Color.Transparent; // 把 keyout 背景設為透明 show = new ShowInfo(SelfInformation, keyout); // 初始化顯示資訊的類別 render = new PanelRender(myPanel); // 初始化 // 建立 AK-Tree 之初始化 Listener = new Node(0, "0", null, 0, 0, 0, 0); // 初始化設定 Compare_Listener = new Node(0, "0", null, 0, 0, 0, 0); // 初始化設定 ListenerChildrenList = new List<Node>(); // 初始化設定 // 假定亂設定一開始的初始值 Max_Speaker_Capacity = random.Next(1, 5); Max_Overhearer_capacity = random.Next(1, 5); Speaker_Capacity = Max_Speaker_Capacity; Overhearer_Capacity = Max_Overhearer_capacity; // 設定是否為 gateway string port = "1037"; string ip = "127.0.0.1"; //string ip = "140.115.51.246"; // 測試使用 if (myargs.Length >= 1) port = myargs[0]; if (myargs.Length >= 2) { ip = myargs[1]; g_is_gateway = false; } g_gateway = ip + ":" + port; socketip = LocalIp; // 設定自己本機端的 ip // 初始化的功能 Vast.InitVAST(g_is_gateway, g_gateway); // 初始化 VAST Vast.VASTJoin(1, aoi_center.X, aoi_center.Y, AOI_RADIUS); // 使節點加入 VAST // 啟動加入 VAST 的 Tick tick_thread = new Thread(new ThreadStart(Tick_Start)); tick_thread.IsBackground = true; tick_thread.Start(); // 啟動監聽 VAST 訊息的 thread recmsg_thread = new Thread(new ThreadStart(ReceiveBroadcast)); recmsg_thread.IsBackground = true; recmsg_thread.Start(); // 啟動監聽 VAST Socket 訊息的 thread //recsocketmsg_thread = new Thread(new ThreadStart(ReceviceSocket)); //recsocketmsg_thread.IsBackground = true; //recsocketmsg_thread.Start(); Vast.checkVASTJoin(); // 確保有加入 VAST // 以下確保已經確實加入 VAST 之中,並且可以取得所有資訊 while (SelfID == 0) // 若未取得 id 則一直取得 SelfID = Vast.VASTGetSelfID(); // 在此才會真正加入 VAST 中,上面已確保取得自己的 ID neighborList = neighbor.GetList(); keyin.Text = input = "[" + SelfName + "] : "; // 初始化輸入區塊 show.SelfInnformation_Print(aoi_center, Speaker_Capacity, Max_Speaker_Capacity, Overhearer_Capacity, Max_Overhearer_capacity, socketip, Listener, voicerecorder); // 第一次進入 VAST 中廣播給大家自己的"位置" 及 "面向" PublishPosition(SelfDirect); }