Пример #1
0
 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";
 }
Пример #2
0
        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();  // 更新畫面
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }