Конечный автомат для внешнего устройства - PullRequest
0 голосов
/ 22 октября 2019

Я узнал о машине с конечным числом состояний, прочитал о различных подходах, и теперь я собираюсь реализовать ее в своей программе в качестве упражнения. Моя программа работает с устройством с последовательным портом, и моя идея - создать класс, который мог бы описывать состояние устройства. Теперь я не могу составить правильную цепочку связующего процесса. Что я имел в виду:

  1. Пользователь нажимает кнопку подключения (например, переключатель)
  2. Конечный автомат проверяет внутреннее состояние и вызывает функцию подключения, если внутреннее состояние "отключено".
  3. В зависимости от результата подключения конечный автомат должен быть переведен в состояние «подключен» или оставлен «отключен».
  4. Установить переключатель пользователя в положение «включено», если «подключен», и наоборот.

Правильна ли моя цепь?

Принимая это во внимание, я попытался реализовать соответствующий код. В моем классе устройств у меня есть

void Device::doAction(Action action)
{
    switch (action) {
        case CONNECT:
            onConnect();
            break;

        case DISCONNECT:
            onDisconnect();
            break;
        .... 
}

void Device::onConnect()
{
    switch (getState()) {
        case DISCONNECTED: {
            setState(CONNECTED);
            break;
        }
        default:
            message("Device is already connected");
            break;
    }
}

При таком подходе я не могу передать имя SerialPort с помощью метода doAction(), потому что он должен быть более универсальным для каждого действия. Более того, в этом случае состояние будет установлено немедленно, без проверки ответа SerialPort. В противном случае я мог бы переопределить

void Device::onConnect(const QString &port)
{
    switch (getState()) {
        case DISCONNECTED: {
            connectonRequest(port);
            break;
        }
    ....
    }
}

Тогда я мог бы вызвать новый метод onConnect прямо из интерфейса. Затем можно запросить ответ SerialPort, и состояние будет изменено напрямую. Это нормально?

Буду признателен за любые советы.

...