/// <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; } }