Сообщение от
Борисыч44
Да какая там структура, все же впрямую - ни каких циклов, обработок матриц и пр.
Тут требуется поддержка многозадачности - одновременно выполняются несколько процессов: опрос кнопок, прием и декодирование сигналов ДУ, два параллельно работающих стабилизатора натяжения ленты, в будущем добавится опрос счета при поиске и опрос скорости при стабилизации скорости перемотки. Но это практически реализовано, только регуляторы натяжения не отлажены - там не совсем понятно, что делать в переходных режимах: иногда требуется форсирование, иногда плавный рост задания для регулятора. Крайне неудобно это отлаживать, надо проверять на разных катушках, в разных местах рулона и т.д.
Перед депрессняком остановился на том, как лучше оформить процессы включения разных режимов ЛПМ. Хотелось бы, чтобы это выглядело как просто последовательность операций: включить то-то, задержка сколько-то, подождать такого-то сигнала и т.д. Но это все должно работать многозадачно, т.е., например, процедура задержки не должна подвешивать все остальное. Это можно сделать с использованием операционной системы с вытесняющей многозадачностью, но ОС сюда тащить не хочу. Пока сделал так - перед включением режима составляется список операций, который затем запускается на исполнение:
Код:
Operation->Clear();
Operation->AddAction(ActMute, ON);
Operation->AddAction(ActDelay, 100);
Operation->AddAction(ActRec, OFF);
Operation->AddAction(ActPress, OFF);
Operation->AddAction(ActDelay, 200);
Operation->AddAction(ActCapstan, RUN_R);
Operation->AddAction(ActDelay, 3000);
Operation->AddAction(ActSpool, SPOOL_PLAY);
Operation->AddAction(ActMove, WAIT_STOP);
Operation->AddAction(ActDelay, 200);
Operation->AddAction(ActLift, OFF);
Operation->AddAction(ActBrake, OFF);
Operation->AddAction(ActDelay, 200);
Operation->AddAction(ActPress, ON);
Operation->AddAction(ActMute, OFF);
Operation->Execute();
Если в процессе исполнения списка пользователь нажмет другую кнопку, построится новый список в зависимости от текущего состояния и запустится на исполнение. Но даже некоторые из этих операций могут выполняться на фоне других (например, разгон ведущего двигателя при реверсе), это позволит оптимизировать задержки. Для управления магнитами сделал специальный класс, который сам умеет включать их с форсированием. В основной программе достаточно одной строчки SolPress->On(), магнит сам включится на форсирование, через заданное время форсирование уберет, и это все на фоне выполнения других процессов. Так можно сделать и для всего остального, все эти действия - отдельные классы, унаследованные от одного класса TAction, который умеет что-то выполнять в многозадачном режиме, но что именно, можно свободно переопределять.
Еще вызывает затруднение написание класса по управлению светодиодами. Хотелось бы, чтобы у каждого светодиода можно было включить постоянное свечение и мигание с одной из двух частот. Пока такой класс оказывается очень неудобным в использовании. Иногда надо поменять состояние лишь одного светодиода, иногда одной командой хочется задать состояние всей индикации. В общем, как тот осел, не могу выбрать, что лучше
Сообщение от
Борисыч44
100$ имхо многовато 50-60 нормуль
Жаль, что у нас с этим туго, за такую цену никто ленту не продает.
Социальные закладки