public MainWindow()
        {
            GroupAddressesProvider.SeedList();
            Container = BuildContainer();
            mesh      = Container.Resolve <IBluetoothMeshContext>();

            foreach (var server in mesh.NodeServers)
            {
                server.SetDispacher(Container.Resolve <ICommandDispatcher>());
            }

            Node clientNode = mesh.Nodes[0];

            bearer      = mesh.NodeServers.ToList().FirstOrDefault(x => x.Node.Id == 1);
            serverModel = (ConfigurationClientModel)clientNode.Elements[ElementType.primary].Models[ModelType.ConfigurationClient];

            InitializeComponent();

            Providers.LayoutProvider.DrawGrid(canvas);
            Providers.LayoutProvider.DrawGrid(canvas);
            Providers.LayoutProvider.DrawConnections(canvas, mesh);
            Providers.LayoutProvider.DrawNodes(canvas, mesh);
            Providers.LayoutProvider.ColorNodes();
            Providers.LayoutProvider.SignNodes(canvas, mesh);

            Setup();
        }
        public ble()
        {
            InitializeComponent();
            GroupAddressesProvider.SeedList();
            Container = BuildContainer();
            mesh      = Container.Resolve <IBluetoothMeshContext>();

            foreach (var server in mesh.NodeServers)
            {
                server.SetDispacher(Container.Resolve <ICommandDispatcher>());
            }

            Node clientNode = mesh.Nodes[0];

            bearer      = mesh.NodeServers.ToList().FirstOrDefault(x => x.Node.Id == 1);
            serverModel = (ConfigurationClientModel)clientNode.Elements[ElementType.primary].Models[ModelType.ConfigurationClient];
        }
        static void Main(string[] args)
        {
            Container = BuildContainer();

            var context = Container.Resolve <IBluetoothMeshContext>();

            Node clientNode = context.Nodes.ToList()[0];
            var  bearer     = context.NodeServers[0];
            ConfigurationClientModel serverModel = (ConfigurationClientModel)clientNode.Elements[ElementType.primary].Models[ModelType.ConfigurationClient];

            while (true)
            {
                Console.WriteLine("-------------MENU:--------------\n" +
                                  "1) Display all nodes\n" +
                                  "2) Send message");

                switch (Convert.ToInt32(Console.ReadLine()))
                {
                case 1:
                    foreach (var node in context.Nodes)
                    {
                        Console.WriteLine($"\n-Node nr {node.Id}");
                        Console.WriteLine($"-Node features:");
                        if (node.ConfigurationServerModel.CompositionData.IsRelay)
                        {
                            Console.WriteLine($"--Relay");
                        }

                        if (node.ConfigurationServerModel.CompositionData.IsFriend)
                        {
                            Console.WriteLine($"--Friend");
                        }

                        if (node.ConfigurationServerModel.CompositionData.IsProxy)
                        {
                            Console.WriteLine($"--Proxy");
                        }

                        Console.WriteLine("---Node elements:");
                        foreach (var elemnt in node.Elements)
                        {
                            Console.WriteLine($"---Element nr {elemnt.Value.Address} --- ");
                            Console.WriteLine($"---Element type {elemnt.Key.ToString()}");
                            foreach (var model in elemnt.Value.Models)
                            {
                                //Console.WriteLine($"-----Model nr {model.Value.Address} --- ");
                                Console.WriteLine($"-----Model type {model.Key.ToString()}");
                                Console.WriteLine($"-----Model procedures:");

                                model.Value.Procedures.ForEach(p => Console.WriteLine($"------{p.ToString()}"));
                            }
                        }
                    }
                    break;

                case 2:
                    var message = new BaseRequest();
                    Console.WriteLine("\nWhat type of procedure\n");
                    foreach (string volume in Enum.GetNames(typeof(Procedure)))
                    {
                        Console.Write($"{volume} ");
                    }
                    Console.Write(":\n");
                    Enum.TryParse(Console.ReadLine(), out Procedure procedure);
                    message.Procedure = procedure;

                    Console.WriteLine("\nWhat type of message");
                    foreach (string volume in Enum.GetNames(typeof(MessageType)))
                    {
                        Console.Write($"{volume} ");
                    }
                    string messsageTyoeAnswer = Console.ReadLine();
                    Enum.TryParse(messsageTyoeAnswer, out MessageType messageType);
                    message.MessageType = messageType;
                    if (MessageType.SET == messageType)
                    {
                        Console.WriteLine("Parameter:");
                        message.Parameters = Convert.ToInt32(Console.ReadLine());
                    }

                    Console.WriteLine("\nWhat type of address\n");
                    foreach (string volume in Enum.GetNames(typeof(AddressType)))
                    {
                        Console.Write($"{volume} ");
                    }
                    string addressAnswer = Console.ReadLine();
                    Console.WriteLine(addressAnswer);
                    Enum.TryParse(addressAnswer, out AddressType addressType);
                    int addressValue = 0;
                    switch (addressType)
                    {
                    case AddressType.Unassigned:
                        break;

                    case AddressType.Unicast:
                        Console.WriteLine("\nWhich one:\n");
                        foreach (var node in context.Nodes)
                        {
                            Console.WriteLine($"- {node.Id} : {node.Address.Value}");
                        }
                        addressValue = Convert.ToInt32(Console.ReadLine());
                        message.DST  = context.Nodes.Select(x => x.Address).FirstOrDefault(x => x.Value == addressValue);
                        break;

                    case AddressType.Virtual:
                        //Console.WriteLine("\n  gl :V   \n");
                        //var a = context.Nodes.SelectMany(x => x.Elements.Values);
                        //foreach (var model in context.Nodes.SelectMany(x => x.Elements.Values).SelectMany(x => x.Models.Values))
                        //{
                        //    Console.WriteLine($"- {model.Address.GuidId} : {model.Address.Value}");
                        //}
                        //addressValue = Convert.ToInt32(Console.ReadLine());
                        //message.DST = context.Nodes.Select(x => x.Address).FirstOrDefault(x => x.Value == addressValue);
                        break;

                    case AddressType.Group:
                        Console.WriteLine("\nWhich one:\n");
                        foreach (var address in GroupAddressesProvider.Dictionary)
                        {
                            Console.WriteLine($"- {address.Key} : {address.Value.Value}");
                        }
                        addressValue = Convert.ToInt32(Console.ReadLine());
                        message.DST  = GroupAddressesProvider.Dictionary.Values.FirstOrDefault(x => x.Value == addressValue);
                        break;

                    default:
                        break;
                    }
                    Console.WriteLine(message.ToString());


                    serverModel.SendMessage(bearer, message);

                    break;
                }

                //finish all threads
                Process thisProc = Process.GetCurrentProcess();
                ProcessThreadCollection mythreads = thisProc.Threads;
            }
        }