Сообщение от
mellowman
C FSM*ом в C трудновато
Если не страшно C++, то можно сделать ...
Не страшно, на нем и пишу.
Сообщение от
Jenyok
.Назовите LPM (ленто-протяжный механизм, ясно и понятно).
Колхоз. А в английском нет распространенного сокращения для ЛПМ, там это Tape Transport.
Сообщение от
Jenyok
Про AVR ничего НЕ скажу, просто с ними дело НЕ имел.
Выбор процессора - дело пятое.
Сообщение от
Jenyok
На ARM выделяли целый порт (16 линий ввода), например, порт B , который имел прерывание с каждой линии ввода
Прерывания тут лишние, процессы медленные, подходит программный опрос. У меня для управления портами используется шаблонный класс:
Код:
TGpio<PORT_E, PIN_6> Pin_Rec; //объявление
Pin_Rec.DirOut(); //настройка порта
Pin_Rec = 1; //управление сигналом Rec
Сообщение от
Jenyok
Писали процедуры для каждого режима магнитофона, STOP , PLAY , REC , REW , FF , PAUSE , OTKAT , FOTOSTOP
Вот в этом и проблема. Каждая такая функция состоит из последовательности шагов - включить какой-то сигнал, сделать задержку, включить еще что-то, подождать чего-то. Но такая функция должна быть неблокирующей. Она должна выполняться по маленьким кусочкам, каждый из которых тратит мало времени, иначе другие задачи будут заблокированы. Т.е. функция должна вызывать в цикле, но вскоре после вызова должна отдавать управление, сделав очередной шаг. Прогресс выполнения операции она должна помнить сама, при следующем вызове делать следующий шаг. Можно написать такое "в лоб" с большим case по переменной прогресса внутри. Но это некрасиво и сложно в плане каких-то изменений. Сначала попробовал строить список действий, а затем его выполнять (метод Operation->Execute() - неблокирующий). Но это показалось сложным и не очень наглядным. Теперь снова думаю о простой машине состояний.
Код:
//создание списка действий:
if(Request == PLAY_R)
{
Operation->AddAction(ActMute, ON, 0);
Operation->AddAction(ActRec, OFF, 0);
Operation->AddAction(ActPress, OFF, 200);
Operation->AddAction(ActCapstan, RUN_R, 3000);
Operation->AddAction(ActSpool, SPOOL_PLAY, 0);
Operation->AddAction(ActMove, WAIT_STOP, 0);
Operation->AddAction(ActLift, OFF, 200);
Operation->AddAction(ActBrake, OFF, 200);
Operation->AddAction(ActPress, ON, 0);
Operation->AddAction(ActMute, OFF, 400);
}
//в цикле...
//выпонение списка действий:
Operation->Execute();
//проверка окончания выполнения:
if(Operation->Done)
{
State = Request;
}
Социальные закладки