using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Handlers.Options; using static GanovCubes.FileLogger; namespace GanovCubes { /// /// Тип интервала пересчета метронома /// public enum MetronomeIntervalType { Seconds, mSeconds }; #region CubeDescription [HandlerCategory("Ganov Cubes. Different")] [HandlerName("RandomMetronome", Language = "ru-ru")] [Description("Метроном на базе штатного метронома, но с возможностью задавать рандомный период пересчета." + " В случае если максимальное значение периода пересчета указано меньше, чем минимальное значение, то" + " период пересчета будет равен минимальному значению")] [HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87237&page=1", "Страница на форуме TSLab", "ru-ru")] [InputsCount(2)] [Input(0, TemplateTypes.SECURITY, Name = "Security")] [Input(1, TemplateTypes.BOOL, Name = "IsEnabled")] [OutputsCount(0)] #endregion public class RandomMetronome : IStreamHandler, ISecurityInput0, IContextUses { public IContext Context { set; get; } #region Properties /// /// Тип интервала пересчета метронома /// [HandlerParameter(true, "Seconds", NotOptimized = true, Name = "Тип интервала", IsVisibleInBlock = false)] [Description("Настройка задает единицы измерения времени пересчета интервала: сек, мсек")] public MetronomeIntervalType IntervalType { get; set; } = MetronomeIntervalType.Seconds; /// /// Мин.период пересчета /// [HandlerParameter(true, "5", NotOptimized = true, Name = "Мин.период пересчета", IsVisibleInBlock = false, Min = "1", EditorMin = "1")] [Description("Настройка задает минимальный период пересчета в заданных единицах измерения времени")] public int MinRecalcPeriod { get; set; } = 5; /// /// Макс.период пересчета /// [HandlerParameter(true, "10", NotOptimized = true, Name = "Макс.период пересчета", IsVisibleInBlock = false, Min = "1", EditorMin = "1")] [Description("Настройка задает максимальный период пересчета в заданных единицах измерения времени")] public int MaxRecalcPeriod { get; set; } = 10; /// /// Вывести данные в лог /// [HandlerParameter(true, "false", NotOptimized = false, Name = "Вывести данные в лог", IsVisibleInBlock = false)] [Description("При установленной опции данные по работе кубика будут выведены в лог")] public bool WriteLog { get; set; } = false; #endregion public void Execute(ISecurity sec, IList isEnabled) { var rnd = new System.Random(); var timeFactor = IntervalType == MetronomeIntervalType.Seconds ? 1000 : 1; var recalcPeriod = rnd.Next(MinRecalcPeriod * timeFactor, Math.Max(MinRecalcPeriod * timeFactor, MaxRecalcPeriod * timeFactor)); var metronome = new TSLab.Script.Handlers.Options.Heartbeat() { Context = Context, DelayMs = recalcPeriod, OnlyAtTradingSession = false }; metronome.Execute(sec, isEnabled); if (WriteLog) { LogDebug($"RandomMetronome. Разрешение на пересчет: {isEnabled.FirstOrDefault()}, " + $"период пересчета: {recalcPeriod / timeFactor:F2} {(timeFactor == 1000 ? "сек" : "мсек")}"); } } } }