diff --git a/MTC_Sim/MTC_Sim/AdapterESA.cs b/MTC_Sim/MTC_Sim/AdapterESA.cs index 4e48a70..7f853ed 100644 --- a/MTC_Sim/MTC_Sim/AdapterESA.cs +++ b/MTC_Sim/MTC_Sim/AdapterESA.cs @@ -6,13 +6,20 @@ using System.Threading.Tasks; using SCMCncLib; using XSimGph; using System.Windows.Forms; +using System.Threading; namespace MTC_Adapter { public class AdapterESA : AdapterGeneric { - - thdNcEsaGvKvara EsaController; + /// + /// oggetto onnessione ESA + /// + protected thdNcEsaGvKvara ncDevice; + /// + /// thread del processo comunicazione esa + /// + protected Thread thdDevice; /// /// estende l'init della classe base... @@ -24,18 +31,21 @@ namespace MTC_Adapter string iniPath = string.Format(@"{0}\{1}\{2}", Application.StartupPath, utils.CRS("adapterConfPath"), utils.CRS("defaultEsaFile")); if (utils.CRB("verbose")) lg.Info("Start init Adapter ESA dal file {0}", iniPath); - - // !!! 2016.05.25 verificare se serva altro x istanziare oggetto NcEsaGvKvara + IniFiles.IniFile EsaIni = new IniFiles.IniFile(iniPath); - EsaController = new thdNcEsaGvKvara(EsaIni); + ncDevice = new thdNcEsaGvKvara(EsaIni); // inizializzo posizioni assi... prevPosAxis = new double[adpConf.nAxis]; prevDirAxis = new int[adpConf.nAxis]; - + + // verifica modalità avvio... +#if false // disconnetto e connetto... if (utils.CRB("verbose")) lg.Info("ESA: tryDisconnect"); tryDisconnect(); + +#endif if (utils.CRB("verbose")) lg.Info("ESA: tryConnect"); tryConnect(); if (utils.CRB("verbose")) lg.Info("End init Adapter ESA"); @@ -45,11 +55,20 @@ namespace MTC_Adapter public override void tryDisconnect() { base.tryDisconnect(); + + ncDevice.RequestStop(); + // wait for thread + while (!ncDevice.Finished) + Thread.Sleep(100); } public override void tryConnect() { base.tryConnect(); + + // !!! 2016.05.25 verificare funzionamento thread... eventualmente portare entro metodo questo thread con suoi timing... + // avvio il thread... + thdDevice = new Thread(ncDevice.Execute); } } } diff --git a/MTC_Sim/SCMCncLib/SCMCncLib.csproj b/MTC_Sim/SCMCncLib/SCMCncLib.csproj index aeac735..78f2a72 100644 --- a/MTC_Sim/SCMCncLib/SCMCncLib.csproj +++ b/MTC_Sim/SCMCncLib/SCMCncLib.csproj @@ -46,6 +46,7 @@ + diff --git a/MTC_Sim/SCMCncLib/clsTimePeriod.cs b/MTC_Sim/SCMCncLib/clsTimePeriod.cs new file mode 100644 index 0000000..126e9c3 --- /dev/null +++ b/MTC_Sim/SCMCncLib/clsTimePeriod.cs @@ -0,0 +1,108 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading; +using System.Collections.Generic; + +internal sealed class TimePeriod : IDisposable +{ + private const string WINMM = "winmm.dll"; + + private static TIMECAPS timeCapabilities; + + private static int inTimePeriod; + + private readonly int period; + + private int disposed; + + [DllImport(WINMM, ExactSpelling = true)] + private static extern int timeGetDevCaps(ref TIMECAPS ptc, int cbtc); + + [DllImport(WINMM, ExactSpelling = true)] + private static extern int timeBeginPeriod(int uPeriod); + + [DllImport(WINMM, ExactSpelling = true)] + private static extern int timeEndPeriod(int uPeriod); + + static TimePeriod() + { + int result = timeGetDevCaps(ref timeCapabilities, Marshal.SizeOf(typeof(TIMECAPS))); + if (result != 0) + { + throw new InvalidOperationException("The request to get time capabilities was not completed because an unexpected error with code " + result + " occured."); + } + } + + internal TimePeriod(int period) + { + if (Interlocked.Increment(ref inTimePeriod) != 1) + { + Interlocked.Decrement(ref inTimePeriod); + throw new NotSupportedException("The process is already within a time period. Nested time periods are not supported."); + } + + if (period < timeCapabilities.wPeriodMin || period > timeCapabilities.wPeriodMax) + { + throw new ArgumentOutOfRangeException("period", "The request to begin a time period was not completed because the resolution specified is out of range."); + } + + int result = timeBeginPeriod(period); + if (result != 0) + { + throw new InvalidOperationException("The request to begin a time period was not completed because an unexpected error with code " + result + " occured."); + } + + this.period = period; + } + + internal static int MinimumPeriod + { + get + { + return timeCapabilities.wPeriodMin; + } + } + + internal static int MaximumPeriod + { + get + { + return timeCapabilities.wPeriodMax; + } + } + + internal int Period + { + get + { + if (this.disposed > 0) + { + throw new ObjectDisposedException("The time period instance has been disposed."); + } + + return this.period; + } + } + + public void Dispose() + { + if (Interlocked.Increment(ref this.disposed) == 1) + { + timeEndPeriod(this.period); + Interlocked.Decrement(ref inTimePeriod); + } + else + { + Interlocked.Decrement(ref this.disposed); + } + } + + [StructLayout(LayoutKind.Sequential)] + private struct TIMECAPS + { + internal int wPeriodMin; + + internal int wPeriodMax; + } +} + diff --git a/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs b/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs index 521da83..0ccc34e 100644 --- a/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs +++ b/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs @@ -363,11 +363,7 @@ namespace SCMCncLib /// public bool CheckMultimediaTimer() { - // !!! 2016.05.25 bypass per problemi compilazione - int minimumPeriod = 2; -#if false - int minimumPeriod = TimePeriod.MinimumPeriod; -#endif // false + int minimumPeriod = TimePeriod.MinimumPeriod; //int maximumPeriod = TimePeriod.MaximumPeriod; return ((minimumPeriod <= 2) && (minimumPeriod > 0)); }