/// <summary>
 /// Initialize connection.
 /// </summary>        
 /// <returns>Returns connected device. Null if connection alreay exists.</returns>
 GXDevice InitializeConnection(GXSchedule schedule, GXDevice device)
 {
     lock (device.SyncRoot)
     {
         bool connected = (device.Status & DeviceStates.Connected) != 0;
         if (!connected)
         {
             int pos = -1;
             do
             {
                 try
                 {
                     device.Connect();
                     //Increase count in case connection failed.
                     if ((device.Status & DeviceStates.Connected) == 0)
                     {
                         ++pos;
                         Thread.Sleep(schedule.ConnectionFailWaitTime);
                     }
                 }
                 catch (Exception Ex)
                 {
                     device.NotifyError(schedule, Ex);
                     ++pos;
                     Thread.Sleep(schedule.ConnectionFailWaitTime);
                 }
             }
             while ((device.Status & DeviceStates.Connected) == 0 && pos < schedule.ConnectionFailTryCount);
             if ((device.Status & DeviceStates.Connected) == 0)
             {
                 throw new Exception(Resources.ConnectionFailed);
             }
             return device;
         }
         return null;
     }
 }
        /// <summary>
        /// Load device template and connect to the device.
        /// </summary>
        /// <param name="path"></param>
        /// <param name="taskinfo"></param>
        public void Connect(string path, GXClaimedTask taskinfo)
        {
            ExecutedTask = taskinfo;
            //If already connected.
            if (Device != null)
            {
                UpdateParameters();
                if ((Device.Status & DeviceStates.Connected) == 0)
                {
                    Device.Connect();
                }
                return;
            }
            DeviceList = new GXDeviceList();
            DeviceList.OnError += new Gurux.Common.ErrorEventHandler(DeviceList_OnError);
            DeviceList.OnUpdated += new ItemUpdatedEventHandler(DeviceList_OnUpdated);                        
            GXDeviceGroup group = new GXDeviceGroup();
            DeviceList.DeviceGroups.Add(group);
            TargetDirectory = path;
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(CurrentDomain_TypeResolve);
            GXDeviceList.Update(path);
            string filename = Path.Combine(path, taskinfo.Device.ProfileGuid + ".gxp");            
            Device = GXDevice.Load(filename);
            Device.ID = taskinfo.Device.Id;
            group.Devices.Add(Device);
            Device.Name = taskinfo.Device.Name;
            //taskinfo.Device.AutoConnect;
            // ForcePerPropertyRead
            Device.UpdateInterval = taskinfo.Device.UpdateInterval;
            Device.WaitTime = taskinfo.Device.WaitTime;
            Device.ResendCount = taskinfo.Device.ResendCount;
            Device.DisabledActions = taskinfo.Device.DisabledActions;

            /* TODO:
            Device.FailTryCount = taskinfo.Device.FailTryCount;
            Device.FailWaitTime = taskinfo.Device.FailWaitTime;
            Device.ConnectionTryCount = taskinfo.Device.ConnectionTryCount;
            Device.ConnectionFailWaitTime = taskinfo.Device.ConnectionFailWaitTime;
              */

            //Update parameters.
            UpdateParameters();

            //Load medias to this assembly domin.
            Gurux.Communication.GXClient.GetAvailableMedias();
            if (taskinfo.Device.TraceLevel != System.Diagnostics.TraceLevel.Off)
            {
                Device.Trace = taskinfo.Device.TraceLevel;
                Device.OnTrace += new TraceEventHandler(Device_OnTrace);
            }
            Exception lastException = null;
            int pos = -1;
            Gurux.Common.IGXMedia media = null;
            foreach (var it in taskinfo.MediaSettings)
            {
                try
                {
                    ++pos;
                    //If media is changed.
                    if (media == null || media.MediaType != taskinfo.MediaSettings[pos].Key)
                    {
                        media = Device.GXClient.SelectMedia(taskinfo.MediaSettings[pos].Key);
                        Device.GXClient.AssignMedia(media);
                    }
                    media.Settings = taskinfo.MediaSettings[pos].Value.Value;                    
                    lastException = null;                        
                    Device.Connect();
                    break;
                }
                catch (Exception ex)
                {
                    //If connection fails try next redundant connectio.
                    lastException = ex;                    
                }
            }
            if (lastException != null)
            {
                throw lastException;
            }
        }