Добавлены интерфейсы IFrameProcessingService, IFrameProcessor. Из-за них пришлось добавить в проект netCanLib
Начат проект с реализацией Frame-Processor-ов
Merge branch 'master' into frame-processor
Начата реализация IFrameProcessingService
Набросаны IStateModelService и IStateProperty
Набросаны интерфейсы для реализации StateModelService
Добавлено проект для тестов Saut.StateModel
Добавил комментарии к Saut.StateModel
Добавлен линейный интерполятор и тесты к нему. Во время написания тестов пришлось немного переписать архитектуру
Добавлена дубовая реализация RecordPicker и тест к нему
Добавил StepInterpolator и тест к нему
Добавил абстракцию интерполируемого журналиуемого свойства InterpolatablePropertyBase и тесты к нему
Реализована потокобезопасная вставка элемента в ConcurrentJournal
Приватные классы ConcurrentJournal вынесены, прикручен отчищатель коллекций
Добавлены тесты на ConcurrentJournal. Бычий поток-тест не проходит
Исправлена ошибка в ConcurrentJournal, приводившая к ошибкам при вставлении записи в середину журнала. Теперь бычий тест проходит успешно.
Изменён .ToString() метод для JournalRecord. Теперь часы выводятся с ведущим нулём (помогает для выравнивания записей). Изменён разделитель между временем и значением
Отрефакторены метды добавления записи в журнал: функции для добавления перенесены в ConcurrentLinkedNodesCollection, её _head сделана приватной. Добавление записи в середину в голову коллекции разбиты на отдельные методы.
TailCutLinkedNodesCollectionCleaner вынесен в отдельный файл
В TailCutLinkedNodesCollectionCleaner вынес отрезание хвоста в отдельную нелепую процедуру.
Из-за того, что сначала хотел рекурсивно разрушать хвост, но потом понял, что это не обязательно