using System;
using System.ComponentModel;
using GanovCubes;
using TSLab.Script.Handlers;
using TSLab.Script.Handlers.Options;
namespace CubesLib
{
#region CubeDescription
[Obsolete]
[HandlerCategory("Ganov Cubes. Different")]
[HandlerName("InterRecalcBoolMemorizer", Language = "ru-ru")]
[Description("Кубик представляет \"запоминатель\" сигналов между пересчетами. Работает в двух режимах, либо просто запоминает сигнал и переносит его на следующий пересчет, " +
" либо увеличивает значение сигнала на 1 и переносит на сл.пересчет, таким образом либо осуществляется просто запоминание, либо счет количества событий." +
" Значение запоминается на последнем баре, то есть если на последнем баре было True, то на следующем пересчете кубик будет выдавать 1, на следующем 2 и т.д. (в режиме счетчика)" +
" будет 1. Значение, выданное на первом баре будет неизменно до окончания пересчета. Как только значение на последнем баре станет false, то на следующем пересчете кубик выдаст 0 " +
" и так далее по кругу. На выходе кубик выдает тип double, то есть число, для преобразования в логическое значение необходимо использовать дополнительную формулу после кубика, например, " +
" \"InterRecalcBoolMemorizer==1? true: false\". В случае если в кеше не содержится никакого значения, то возвращается ноль. Для запоминания данных кубик использует локальный кеш.")]
[HelperLink("http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=87041&page=1", "Страница на форуме TSLab", "ru-ru")]
[InputsCount(1)]
[Input(0, TemplateTypes.BOOL, Name = "Сигнал")]
[OutputsCount(1)]
[OutputType(TemplateTypes.DOUBLE)]
#endregion
public class InterRecalcBoolMemorizer : IValuesHandlerWithNumber, IContextUses, IBooleanInput0, IDoubleReturns
{
#region Fields
private double _retValue;
private int _lastBarNumber;
#endregion
#region Properties
public IContext Context { set; get; }
///
/// Режим счетчика
///
[HandlerParameter(true, "false", NotOptimized = true, Name = "Режим счетчика", IsVisibleInBlock = false)]
[Description("При установке данной опции кубик будет работать в режиме счетчика, при снятой опции в режиме запоминания")]
public bool CountSignals { get; set; }
///
/// Доп.идентификатор
///
[HandlerParameter(true, "ID01", NotOptimized = true, Name = "Доп.идентификатор", IsVisibleInBlock = false)]
[Description("Дополнительный идентификатор, используется если в одном скрипте задействовано более одного кубика \"запоминателя\", в этом случае" +
" необходимо для каждого указать свой уникальный ID. В противном случае каждый кубик будет перетирать данные другого кубика при сохранении информации в кеш" +
" (при одинаковых ID перетираться будут данные только однотипных \"запоминателей\", то есть данные InterRecalcDoubleMemorizer не перетираются данными" +
" InterRecalcBoolMemorizer и наоборот). В случае если данных в кеше не оказалось (то есть кеш пустой), то кубик возвращает ноль.")]
public string ID { get; set; }
///
/// Кешировать данные на диск
///
[HandlerParameter(true, "false", NotOptimized = true, Name = "Кэшировать данные на диск", IsVisibleInBlock = false)]
[Description("Настройка определяет требуется ли кэшировать данные на диск и восстанавливать их с диcка. Кэширование на диск нужно в тех случаях, когда значение" +
" должно быть восстановлено в том числе после перезагрузки ТСЛаб, например, запоминается событие отправленного сообщения, если не кэшировать на диск," +
" то после перезапуска ТСЛаб по расписанию в скрипт придет информация о том, что события не было, соответственно, логика отработает неверно, т.к. будет принято false." +
" По умолчанию настройка отключена, чтобы не было неверной логики там, где запоминание данных на диск не требуется и нужны лишь данные, когда агент реально" +
" работает и которые теряют свою актуальность при перезагрузке системы")]
public bool CashOnDisk { get; set; }
#endregion
public double Execute(bool value, int curBarNum)
{
if (curBarNum == 0)
{
_lastBarNumber = Context.SetLastBarNum();
var obj = Context.LoadObject($"InterRecalcBoolStorage{ID}{Context.Runtime.TradeName}", CashOnDisk);
_retValue = obj is double cacheValue ? (double)cacheValue : 0;
}
if (curBarNum == _lastBarNumber)
Context.StoreObject($"InterRecalcBoolStorage{ID}{Context.Runtime.TradeName}", value ? CountSignals || _retValue == 0 ? ++_retValue : _retValue : 0, CashOnDisk);
return _retValue;
}
}
}