예제 #1
0
        public void UpdateStateRequestsInterruptWhenButtonPressed()
        {
            var inputRegister = new InputRegister();
            var memory        = new Memory();

            inputRegister.UpdateState(InputRegister.Keys.Down, memory);

            Assert.Equal(0x10, memory.ReadByte(0xFF0F) & 0x1F);
            Assert.Equal(InputRegister.Keys.Down, inputRegister.CurrentState);
        }
예제 #2
0
        public void UpdateStateDoesNotRequestsInterruptWhenButtonReleased()
        {
            var inputRegister = new InputRegister();
            var memory        = new Memory();

            inputRegister.CurrentState = InputRegister.Keys.A | InputRegister.Keys.Start;

            inputRegister.UpdateState(InputRegister.Keys.None, memory);

            Assert.Equal(0x0, memory.ReadByte(0xFF0F) & 0x1F);
            Assert.Equal(InputRegister.Keys.None, inputRegister.CurrentState);
        }
예제 #3
0
 /// <summary>
 /// Add a listener for a key press
 /// </summary>
 /// <param name="a_KeyCode">Key to listen for</param>
 /// <param name="a_KeyState">Key state to listen for</param>
 /// <param name="a_Callback">Callback to fire</param>
 public void AddKeyListener(KeyCode a_KeyCode, eKeyState a_KeyState, Action <KeyCode, eKeyState> a_Callback)
 {
     if (KeyListenerList != null)
     {
         InputRegister reg = null;
         reg = KeyListenerList.Find(r => r.Keycode == a_KeyCode);
         if (reg == null)
         {
             KeyListenerList.Add(new InputRegister(a_KeyCode, a_KeyState, a_Callback));
         }
     }
 }
예제 #4
0
 public void AddDragListener(Rect a_Rect, Action <float, Vector3, Vector3> a_Callback)
 {
     if (DragListenerList != null)
     {
         Rect          dragRect = a_Rect;
         InputRegister reg      = null;
         reg = DragListenerList.Find(r => r.DragRect == dragRect);
         if (reg == null)
         {
             DragListenerList.Add(new InputRegister(dragRect, a_Callback));
         }
     }
 }
예제 #5
0
 /// <summary>
 /// Add a listener for any touch event within a certain section of the screen.
 /// Only registers the first touch
 /// </summary>
 /// <param name="a_Rect">Rectangle to check touch within</param>
 /// <param name="a_Callback">Callback to fire</param>
 public void AddTouchListener(Rect a_Rect, Action <Rect, Vector2, int> a_Callback)
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect = a_Rect;
         InputRegister reg       = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect);
         if (reg == null)
         {
             TouchListenerList.Add(new InputRegister(touchRect, a_Callback));
         }
     }
 }
예제 #6
0
 /// <summary>
 /// Add a listener for any touch event on the whole screen. Only registers the first touch
 /// </summary>
 /// <param name="a_Callback">Callback to fire</param>
 public void AddFullScreenTouchListener(Action <Rect, Vector2, int> a_Callback)
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect = new Rect(0f, 0f, Screen.width, Screen.height);
         InputRegister reg       = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect);
         if (reg == null)
         {
             TouchListenerList.Add(new InputRegister(touchRect, a_Callback));
         }
     }
 }
예제 #7
0
 /// <summary>
 /// Remove the listener for a key
 /// </summary>
 /// <param name="a_KeyCode">Key to no longer listen for</param>
 public void RemoveKeyListener(KeyCode a_KeyCode)
 {
     if (KeyListenerList != null)
     {
         InputRegister reg = null;
         reg = KeyListenerList.Find(r => r.Keycode == a_KeyCode);
         if (reg != null)
         {
             reg = null;
         }
         KeyListenerList.RemoveAll(r => r.Keycode == a_KeyCode);
     }
 }
예제 #8
0
 public void AddFullScreenDragListener(Action <float, Vector3, Vector3> a_Callback)
 {
     if (DragListenerList != null)
     {
         Rect          dragRect = new Rect(0f, 0f, Screen.width, Screen.height);
         InputRegister reg      = null;
         reg = DragListenerList.Find(r => r.DragRect == dragRect);
         if (reg == null)
         {
             DragListenerList.Add(new InputRegister(dragRect, a_Callback));
         }
     }
 }
예제 #9
0
 /// <summary>
 /// Add a listener for any touch event within a certain section of the screen at a certain touch phase.
 /// Only registers the first touch
 /// </summary>
 /// <param name="a_Rect">Rectangle to check touch within</param>
 /// <param name="a_TouchPhase">Touch Phase to monitor</param>
 /// <param name="a_Callback">Callback to fire</param>
 public void AddTouchListener(Rect a_Rect, TouchPhase a_TouchPhase, Action <Rect, Vector2, int> a_Callback)
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect  = a_Rect;
         TouchPhase    touchPhase = a_TouchPhase;
         InputRegister reg        = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect && r.TouchPhase == (int)touchPhase);
         if (reg == null)
         {
             TouchListenerList.Add(new InputRegister(touchRect, touchPhase, a_Callback));
         }
     }
 }
예제 #10
0
 /// <summary>
 /// Remove the listener for the full screen Touch region
 /// </summary>
 public void RemoveFullScreenTouchListener()
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect = new Rect(0f, 0f, Screen.width, Screen.height);
         InputRegister reg       = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect);
         if (reg != null)
         {
             reg = null;
         }
         TouchListenerList.RemoveAll(r => r.TouchRect == touchRect);
     }
 }
예제 #11
0
 /// <summary>
 /// Remove the listener for a Touch region
 /// </summary>
 /// <param name="a_KeyCode">Touch region to no longer listen for</param>
 public void RemoveTouchListener(Rect a_TouchRegion)
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect = a_TouchRegion;
         InputRegister reg       = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect);
         if (reg != null)
         {
             reg = null;
         }
         TouchListenerList.RemoveAll(r => r.TouchRect == touchRect);
     }
 }
예제 #12
0
 public void RemoveDragListener(Rect a_DragRegion)
 {
     if (DragListenerList != null)
     {
         Rect          dragRect = a_DragRegion;
         InputRegister reg      = null;
         reg = DragListenerList.Find(r => r.DragRect == dragRect);
         if (reg != null)
         {
             reg = null;
         }
         DragListenerList.RemoveAll(r => r.DragRect == dragRect);
     }
 }
예제 #13
0
 public void RemoveFullScreenDragListener()
 {
     if (DragListenerList != null)
     {
         Rect          dragRect = new Rect(0f, 0f, Screen.width, Screen.height);
         InputRegister reg      = null;
         reg = DragListenerList.Find(r => r.DragRect == dragRect);
         if (reg != null)
         {
             reg = null;
         }
         DragListenerList.RemoveAll(r => r.DragRect == dragRect);
     }
 }
예제 #14
0
 /// <summary>
 /// Remove the listener for a Touch region and a Touch Phase
 /// </summary>
 /// <param name="a_TouchRegion">Touch region to no longer listen for</param>
 /// <param name="a_TouchPhase">Touch Phase of the registered region</param>
 public void RemoveTouchListener(Rect a_TouchRegion, TouchPhase a_TouchPhase)
 {
     if (TouchListenerList != null)
     {
         Rect          touchRect  = a_TouchRegion;
         TouchPhase    touchPhase = a_TouchPhase;
         InputRegister reg        = null;
         reg = TouchListenerList.Find(r => r.TouchRect == touchRect && r.TouchPhase == (int)touchPhase);
         if (reg != null)
         {
             reg = null;
         }
         TouchListenerList.RemoveAll(r => r.TouchRect == touchRect && r.TouchPhase == (int)touchPhase);
     }
 }
예제 #15
0
        public ActionResult Register(InputRegister input)
        {
            if (IsGetRequest)
            {
                return(View());
            }
            var result = new BaseOutput();
            var repo   = GetRepo <User>();

            if (!(IsUserNameMatch(input.UserName) || IsPhoneMatch(input.Mobile)))
            {
                SetResponse(s => s.NameNotValid, input, result);
            }
            else if (string.IsNullOrEmpty(input.Pwd))
            {
                SetResponse(s => s.PwdEmpty, input, result);
            }
            else if (repo.GetFiltered(f => f.UserName == input.UserName).Any())
            {
                SetResponse(s => s.NameExist, input, result);
            }
            else
            {
                if (string.IsNullOrEmpty(input.Email) || IsEmailMatch(input.Email))
                {
                    var model = DynamicMap <User>(input);
                    model.Pwd        = SHAEncrypt.SHA1(input.Pwd);
                    model.CreatedAt  = DateTime.Now;
                    model.ModifiedAt = DateTime.Now;
                    repo.Add(model);
                    SetResponse(s => s.Success, input, result);
                }
                else
                {
                    SetResponse(s => s.EmailFormatNotMatch, input, result);
                }
            }
            return(JsonNet(result));
        }
예제 #16
0
        //---------------------------------------------------------------------------
        private void AddInputRegister()
        {
            UInt16 address;
            Device device;
            InputRegister register;

            device = (Device)_BindingSourceDevicesList.Current;

            for (address = 0; address <= UInt16.MaxValue; address++)
            {
                if (!device.InputRegisters.Contains(address))
                {
                    register = new InputRegister(address, 0, String.Empty);
                    device.InputRegisters.Add(register);
                    _BindingSourceDevicesList.ResetCurrentItem();

                    if (device.InputRegisters.Count > 0)
                    {
                        _ToolStripMenuItemRemoveInputRegister.Enabled = true;
                    }
                    if (device.InputRegisters.Count == UInt16.MaxValue)
                    {
                        _ToolStripMenuItemAddInputRegister.Enabled = false;
                    }
                    return;
                }
            }
            throw new InvalidOperationException(
                "Не удалось добавить новый input register в устройство, все адреса заняты");
        }
예제 #17
0
		public override void CreateWindow ()
		{
			//Console.WriteLine(string.Format("Create Display Window ({0}x{1})", Width, Height));
			if (window != null) {
				throw new Exception ("Window Already Created.");
			}
			window = new OpenTKGameWindow (Width, Height);
			//Console.WriteLine("Create Display Window - Instance Created");
			window.Title = Title;
			window.Keyboard.KeyDown += new EventHandler<OpenTK.Input.KeyboardKeyEventArgs> (OnKeyDownHandler);
			window.Keyboard.KeyUp += new EventHandler<OpenTK.Input.KeyboardKeyEventArgs> (OnKeyUpHandler);
			//window.Closing += new EventHandler<System.ComponentModel.>(OnClosingHandler);
			window.Closed += new EventHandler<EventArgs> (OnClosedHandler);
			
			window.Resize += new EventHandler<EventArgs> (OnResizeHandler);
			
			window.Mouse.Move += new EventHandler<OpenTK.Input.MouseMoveEventArgs> (OnMouseMoveHandler);
			window.Mouse.ButtonDown += new EventHandler<OpenTK.Input.MouseButtonEventArgs> (OnMouseButtonDownHandler);
			window.Mouse.ButtonUp += new EventHandler<OpenTK.Input.MouseButtonEventArgs> (OnMouseButtonUpHandler);
			//Console.WriteLine("Create Display Window - Events Registered");
			
			inputRegister = new InputRegister ();
		}
예제 #18
0
        /// <summary>
        /// Создаёт контроллер сети Modbus из файла конфигурации сети
        /// </summary>
        /// <param name="pathToXmlFile">Путь + название файла конфигурации сети *.xml</param>
        /// <param name="pathToXsdFile">Путь + название файла файла схемы для файла конфигурации *.xsd</param>
        /// <returns>Если возникла ошибка возвращается null, если процесс создания 
        /// успешно завершён возвращается контроллер сети</returns>
        public static NetworkController Create(String pathToXmlFile, 
            String pathToXsdFile)
        {
            XmlReaderSettings xmlrdsettings;
            XmlReader reader;
            NetworkController network;
            Device device;
            Coil coil;
            DiscreteInput dinput;
            HoldingRegister hregister;
            InputRegister iregister;
            File file;
            Record record;
            List<Device> devices;
            String networkName;

            networkName = String.Empty;
            devices = new List<Device>();

            xmlrdsettings = new XmlReaderSettings();
            xmlrdsettings.IgnoreComments = true;
            xmlrdsettings.IgnoreWhitespace = true;
            xmlrdsettings.Schemas.Add("", pathToXsdFile);
            xmlrdsettings.ValidationType = ValidationType.Schema;
            //xmlrdsettings.ValidationEventHandler +=
            //    new ValidationEventHandler(EventHandler_vr_ValidationEventHandler);
            reader = XmlReader.Create(pathToXmlFile, xmlrdsettings);

            try
            {
                while(reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (!reader.IsEmptyElement)
                        {
                            switch (reader.Name)
                            {
                                case "Network":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            // Получаем наименование сети
                                            networkName = reader.GetAttribute("Name");
                                            //network.NetworkName = reader.GetAttribute("Name");
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Network не имеет свойства Name",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "Device":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            device = new Device(Byte.Parse(reader.GetAttribute("Address")));
                                            device.Description = reader.GetAttribute("Description");                                          
                                            device.Status = (Status)Enum.Parse(typeof(Status), 
                                                reader.GetAttribute("Status"));
                                            //network.Devices.Add(device);
                                            devices.Add(device);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Device не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "Coil":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            Boolean value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = Boolean.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент Coil не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    coil = new Coil(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].Coils.Add(coil);
                                                    devices[devices.Count - 1].Coils.Add(coil);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент Coil не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент Coil не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "DiscreteInput":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            Boolean value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = Boolean.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    dinput = new DiscreteInput(address, value, reader.Value);
                                                    
                                                    //network.Devices[network.Devices.Count - 1].DiscretesInputs.Add(dinput);
                                                    devices[devices.Count - 1].DiscretesInputs.Add(dinput);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент DiscreteInput не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                                case "HoldingRegister":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            UInt16 value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = UInt16.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    hregister = new HoldingRegister(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].HoldingRegisters.Add(hregister);
                                                    devices[devices.Count - 1].HoldingRegisters.Add(hregister);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент HoldingRegister не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break; 
                                    }
                                case "InputRegister":
                                    {
                                        if (reader.HasAttributes)
                                        {
                                            UInt16 value;
                                            UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Value")
                                                {
                                                    reader.Read();
                                                    value = UInt16.Parse(reader.Value);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Value",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }

                                            reader.Read(); // EndElement Value
                                            reader.Read();
                                            if (reader.NodeType == XmlNodeType.Element)
                                            {
                                                if (reader.Name == "Description")
                                                {
                                                    reader.Read();
                                                    iregister = new InputRegister(address, value, reader.Value);
                                                    //network.Devices[network.Devices.Count - 1].InputRegisters.Add(iregister);
                                                    devices[devices.Count - 1].InputRegisters.Add(iregister);
                                                }
                                                else
                                                {
                                                    throw new Exception(String.Format(
                                                        "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Description",
                                                        reader.Settings.LineNumberOffset.ToString()));
                                                }
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}.Элемент InputRegister не имеет свойств",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break; 
                                    }
                                case "File":
                                    {
                                        file = new File(UInt16.Parse(reader.GetAttribute("Number")),
                                            reader.GetAttribute("Description"));
                                        //network.Devices[network.Devices.Count - 1].Files.Add(file);
                                        devices[devices.Count - 1].Files.Add(file);
                                        break;
                                    }
                                case "Record":
                                    {
                                        UInt16 number = UInt16.Parse(reader.GetAttribute("Number"));
                                        String description = reader.GetAttribute("Description");
                                        // Вычитываем следующий элемент. Это долно быть Value
                                        reader.Read();
                                        if (reader.NodeType == XmlNodeType.Element)
                                        {
                                            if (reader.Name == "Value")
                                            {
                                                reader.Read();
                                                record = new Record(number,
                                                    UInt16.Parse(reader.Value), description);
                                                //device = network.Devices[network.Devices.Count - 1];
                                                //device.Files[device.Files.Count - 1].Records.Add(record);
                                                device = devices[devices.Count - 1];
                                                device.Files[device.Files.Count - 1].Records.Add(record);
                                            }
                                            else
                                            {
                                                throw new Exception(String.Format(
                                                    "Ошибка в строке {0}. Элемент Record не содержит элемент Value",
                                                    reader.Settings.LineNumberOffset.ToString()));
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                "Ошибка в строке {0}. Элемент Record содержит элемент недопустимого типа",
                                                reader.Settings.LineNumberOffset.ToString()));
                                        }
                                        break;
                                    }
                            }
                        }
                    } // End of if (reader.NodeType == XmlNodeType.Element)
                } // End of while(reader.Read())
            }
            //catch (XmlException ex)
            //{
            //    if (reader != null)
            //    {
            //        reader.Close();
            //    }

            //    throw;
            //}
            catch //(Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }

                throw;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
            // Создаём сеть из полученных данных
            network = new NetworkController(networkName, null);

            foreach (Device item in devices)
            {
                network.Devices.Add(item);
            }

            return network;
        }
예제 #19
0
        /// <summary>
        /// Создаёт контроллер сети Modbus из файла конфигурации сети
        /// </summary>
        /// <param name="pathToXmlFile">Путь + название файла конфигурации сети *.xml</param>
        /// <param name="pathToXsdFile">Путь + название файла файла схемы для файла конфигурации *.xsd</param>
        /// <returns>Если возникла ошибка возвращается null, если процесс создания
        /// успешно завершён возвращается контроллер сети</returns>
        public static NetworkController Create(String pathToXmlFile,
                                               String pathToXsdFile)
        {
            XmlReaderSettings xmlrdsettings;
            XmlReader         reader;
            NetworkController network;
            Device            device;
            Coil            coil;
            DiscreteInput   dinput;
            HoldingRegister hregister;
            InputRegister   iregister;
            File            file;
            Record          record;
            List <Device>   devices;
            String          networkName;

            networkName = String.Empty;
            devices     = new List <Device>();

            xmlrdsettings = new XmlReaderSettings();
            xmlrdsettings.IgnoreComments   = true;
            xmlrdsettings.IgnoreWhitespace = true;
            xmlrdsettings.Schemas.Add("", pathToXsdFile);
            xmlrdsettings.ValidationType = ValidationType.Schema;
            //xmlrdsettings.ValidationEventHandler +=
            //    new ValidationEventHandler(EventHandler_vr_ValidationEventHandler);
            reader = XmlReader.Create(pathToXmlFile, xmlrdsettings);

            try
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (!reader.IsEmptyElement)
                        {
                            switch (reader.Name)
                            {
                            case "Network":
                            {
                                if (reader.HasAttributes)
                                {
                                    // Получаем наименование сети
                                    networkName = reader.GetAttribute("Name");
                                    //network.NetworkName = reader.GetAttribute("Name");
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Network не имеет свойства Name",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "Device":
                            {
                                if (reader.HasAttributes)
                                {
                                    device             = new Device(Byte.Parse(reader.GetAttribute("Address")));
                                    device.Description = reader.GetAttribute("Description");
                                    device.Status      = (Status)Enum.Parse(typeof(Status),
                                                                            reader.GetAttribute("Status"));
                                    //network.Devices.Add(device);
                                    devices.Add(device);
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Device не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "Coil":
                            {
                                if (reader.HasAttributes)
                                {
                                    Boolean value;
                                    UInt16  address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = Boolean.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент Coil не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            coil = new Coil(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].Coils.Add(coil);
                                            devices[devices.Count - 1].Coils.Add(coil);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент Coil не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Coil содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент Coil не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "DiscreteInput":
                            {
                                if (reader.HasAttributes)
                                {
                                    Boolean value;
                                    UInt16  address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = Boolean.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            dinput = new DiscreteInput(address, value, reader.Value);

                                            //network.Devices[network.Devices.Count - 1].DiscretesInputs.Add(dinput);
                                            devices[devices.Count - 1].DiscretesInputs.Add(dinput);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент DiscreteInput не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент DiscreteInput содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент DiscreteInput не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "HoldingRegister":
                            {
                                if (reader.HasAttributes)
                                {
                                    UInt16 value;
                                    UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = UInt16.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            hregister = new HoldingRegister(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].HoldingRegisters.Add(hregister);
                                            devices[devices.Count - 1].HoldingRegisters.Add(hregister);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент HoldingRegister не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент HoldingRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент HoldingRegister не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "InputRegister":
                            {
                                if (reader.HasAttributes)
                                {
                                    UInt16 value;
                                    UInt16 address = UInt16.Parse(reader.GetAttribute("Address"));

                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Value")
                                        {
                                            reader.Read();
                                            value = UInt16.Parse(reader.Value);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Value",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }

                                    reader.Read();         // EndElement Value
                                    reader.Read();
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "Description")
                                        {
                                            reader.Read();
                                            iregister = new InputRegister(address, value, reader.Value);
                                            //network.Devices[network.Devices.Count - 1].InputRegisters.Add(iregister);
                                            devices[devices.Count - 1].InputRegisters.Add(iregister);
                                        }
                                        else
                                        {
                                            throw new Exception(String.Format(
                                                                    "Ошибка в строке {0}. Элемент InputRegister не содержит элемент Description",
                                                                    reader.Settings.LineNumberOffset.ToString()));
                                        }
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент InputRegister содержит элемент недопустимого типа",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}.Элемент InputRegister не имеет свойств",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }

                            case "File":
                            {
                                file = new File(UInt16.Parse(reader.GetAttribute("Number")),
                                                reader.GetAttribute("Description"));
                                //network.Devices[network.Devices.Count - 1].Files.Add(file);
                                devices[devices.Count - 1].Files.Add(file);
                                break;
                            }

                            case "Record":
                            {
                                UInt16 number      = UInt16.Parse(reader.GetAttribute("Number"));
                                String description = reader.GetAttribute("Description");
                                // Вычитываем следующий элемент. Это долно быть Value
                                reader.Read();
                                if (reader.NodeType == XmlNodeType.Element)
                                {
                                    if (reader.Name == "Value")
                                    {
                                        reader.Read();
                                        record = new Record(number,
                                                            UInt16.Parse(reader.Value), description);
                                        //device = network.Devices[network.Devices.Count - 1];
                                        //device.Files[device.Files.Count - 1].Records.Add(record);
                                        device = devices[devices.Count - 1];
                                        device.Files[device.Files.Count - 1].Records.Add(record);
                                    }
                                    else
                                    {
                                        throw new Exception(String.Format(
                                                                "Ошибка в строке {0}. Элемент Record не содержит элемент Value",
                                                                reader.Settings.LineNumberOffset.ToString()));
                                    }
                                }
                                else
                                {
                                    throw new Exception(String.Format(
                                                            "Ошибка в строке {0}. Элемент Record содержит элемент недопустимого типа",
                                                            reader.Settings.LineNumberOffset.ToString()));
                                }
                                break;
                            }
                            }
                        }
                    } // End of if (reader.NodeType == XmlNodeType.Element)
                }     // End of while(reader.Read())
            }
            //catch (XmlException ex)
            //{
            //    if (reader != null)
            //    {
            //        reader.Close();
            //    }

            //    throw;
            //}
            catch //(Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }

                throw;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
            // Создаём сеть из полученных данных
            network = new NetworkController(networkName, null);

            foreach (Device item in devices)
            {
                network.Devices.Add(item);
            }

            return(network);
        }