реклама на сайте
подробности

 
 
> Реализация конечного автомата на 8битном контроллере., Около 20 состояний. Хорошие исходники бы посмотреть.
sigmaN
сообщение Jul 9 2017, 10:42
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Всем привет!
Сейчас сделано как-то так.
Прекрасно работает, расширяется. Всем доволен, но хотелось бы сравнить с тру 8ми битным подходом. Собственно какую-нибудь хорошую реализацию конечного автомата и хотелось бы где-то посмотреть.
Код
enum DeviceEvents
{
    DEVEV_HEARTBEAT,            //this event occures every ~100ms
    DEVEV_STARTBTN_PRESSED,
    //etc...
    DEVEV_NO_EVENT = 0xff,
}

enum DeviceState_enum
{
    DEVSTATE_OFF,              
    DEVSTATE_LOCKED,
    //etc....
    DEVSTATE_INVALID = 0xff,
}

//state interface class
struct DeviceStateImplementation
{
    virtual void EnterThisStateFrom( const DeviceState_enum &prevState ) = 0;
    //Handles event and returns new device state in response of event
    virtual DeviceState_enum HandleEvent( const DeviceEvents &event ) = 0;
};

//Implementation of DEVSTATE_OFF state
class StateImpl_OFF: public DeviceStateImplementation
{
    timestamp_t MillisecondsCounter;
    uint8_t MinutesCounter;
    bool ReactOnStartBTNRelease;

    void ResetMillisecondsCounter();
public:
    virtual void EnterThisStateFrom( const DeviceState_enum &prevState );
    virtual DeviceState_enum HandleEvent( const DeviceEvents &event );
};

//Implementation of DEVSTATE_OFF state
void StateImpl_OFF::EnterThisStateFrom( const DeviceState_enum &prevState )
{
    TurnOffAllOutputs();
    DisableRPMMeasure();
    G_SettingsStateSelector.ResetPressCounter();
    ReactOnStartBTNRelease = false;
    ResetMillisecondsCounter();
}

void StateImpl_OFF::ResetMillisecondsCounter()
{
    MillisecondsCounter = GetTickCount();
    MinutesCounter = 0;
}

DeviceState_enum StateImpl_OFF::HandleEvent( const DeviceEvents &event )
{
    DeviceState_enum retval = DEVSTATE_OFF;

    switch(event)
    {
    case DEVEV_HEARTBEAT:
        ACC_LEDBlinker.DoTheJob();

        if( G_SettingsStateSelector.GetSelectedState() != DEVSTATE_INVALID )
        {
            ACC_LEDBlinker.StartEndlessBlinkSequence(100, 100);//fast blinking indicating some settings mode was selected
        }
        break;

    case DEVEV_STARTBTN_PRESSED:
        ReactOnStartBTNRelease = true;
        break;

    case DEVEV_STARTBTN_RELEASED:
        //react on release only if press also was made in this state
        if( ReactOnStartBTNRelease )
        {
            ResetMillisecondsCounter();
            if( GlobalVarsRef.BrakePedal.GetButtonState() == GPIOBTNSTATE_PUSHED )
            {
                DeviceState_enum SelectedSettingsModeState = G_SettingsStateSelector.GetSelectedState();
                if( SelectedSettingsModeState != DEVSTATE_INVALID )
                    retval = SelectedSettingsModeState;
                else
                    retval = DEVSTATE_CRANKING;
            }
            else
            {
                retval = DEVSTATE_IGNON;
            }
        }
        break;

    case DEVEV_STARTBTN_LONGPRESS:
        if( GlobalVarsRef.BrakePedal.GetButtonState() == GPIOBTNSTATE_PUSHED )
            retval = DEVSTATE_FORCEDCRANKING;
        else
            retval = DEVSTATE_ACCON;
        break;

    case DEVEV_BREAKPEDAL_PRESSED:
        ResetMillisecondsCounter();
        G_SettingsStateSelector.SelectorWasPressed();

        ACC_LED::Clear();
        ACC_LEDBlinker.StartBlinkSequence(2, 50, 100);
        break;

    case DEVEV_BREAKPEDAL_RELEASED:
        ACC_LED::Clear();
        ACC_LEDBlinker.AbortBlinkSequence();
        break;

    case DEVEV_ENGINE_STARTED:
        retval = DEVSTATE_RUNNING;
        break;

    case DEVEV_ENGINE_STALLED:
        break;
    }

    return retval;
}

/////main state machine implementation
class MainStateMachine
{
public:
    void EnterStateForced( const DeviceState_enum &state );
    void ProcessEvent( const DeviceEvents &evnt );

private:
    DeviceStateImplementation *CurrentDevStateImplementation; //<----pointer to state interface class
    DeviceState_enum CurrentDevState;

    void SetNewDeviceState( const DeviceState_enum &newDevState );
};

void MainStateMachine::ProcessEvent( const DeviceEvents &evnt )
{
    DeviceState_enum newDevState = CurrentDevStateImplementation->HandleEvent( evnt );
    if( newDevState != CurrentDevState )
        SetNewDeviceState( newDevState );
}

void MainStateMachine::SetNewDeviceState( const DeviceState_enum &newDevState )
{
    switch( newDevState )
    {

    case DEVSTATE_OFF:
        CurrentDevStateImplementation = &OFFState;
        break;
    case DEVSTATE_LOCKED:
        CurrentDevStateImplementation = &LockedState;
        break;
    }
    CurrentDevStateImplementation->EnterThisStateFrom( CurrentDevState );
    CurrentDevState = newDevState;
}


//main loop simplifiyed
int main()
{
    while(1)
    {
        event = DEVEV_HEARTBEAT;
        while( event != DEVEV_NO_EVENT )
        {
            MainStateMachine.ProcessEvent( event );
            event = DetectOneMoreEvents();
        }
    }
}




--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sigmaN   Реализация конечного автомата на 8битном контроллере.   Jul 9 2017, 10:42
- - iosifk   Цитата(sigmaN @ Jul 9 2017, 13:42) Всем д...   Jul 9 2017, 12:50
- - sigmaN   iosifk, спасибо, кажется нашел пдфку с которой сто...   Jul 9 2017, 16:33
|- - iosifk   Цитата(sigmaN @ Jul 9 2017, 19:33) iosifk...   Jul 9 2017, 18:59
|- - XVR   Цитата(sigmaN @ Jul 9 2017, 19:33) iosifk...   Jul 10 2017, 10:30
|- - Dog Pawlowa   Цитата(XVR @ Jul 10 2017, 13:30) либо в в...   Jul 10 2017, 12:37
- - Dog Pawlowa   Цитата(sigmaN @ Jul 9 2017, 13:42) Всем д...   Jul 10 2017, 07:37
- - sigmaN   Биты при том, что при моей нынешней реализации(кот...   Jul 10 2017, 07:53
|- - Dog Pawlowa   Цитата(sigmaN @ Jul 10 2017, 10:53) Биты ...   Jul 10 2017, 09:09
- - sigmaN   Спасибо, будет интересно посмотреть! altersoft...   Jul 10 2017, 09:21
- - sigmaN   ЦитатаЧто касается автоматов на МК с минимумум рес...   Jul 10 2017, 10:56
- - sigmaN   Вот дойдут как-нибудь руки до сравнений и будет ин...   Jul 10 2017, 23:02
|- - k155la3   Цитата(sigmaN @ Jul 11 2017, 02:02) . . ....   Jul 11 2017, 06:33
- - pokk   Dog Pawlowa, можно тоже исходники глянуть? m65535...   Jul 11 2017, 06:38
|- - Dog Pawlowa   Цитата(pokk @ Jul 11 2017, 09:38) А то ка...   Jul 11 2017, 20:24
- - sigmaN   ЦитатаСмотря как компилятором реализуется работа v...   Jul 11 2017, 10:02
|- - jcxz   Цитата(sigmaN @ Jul 11 2017, 13:02) Error...   Jul 11 2017, 10:46
|- - k155la3   Цитата(sigmaN @ Jul 11 2017, 13:02) Error...   Jul 11 2017, 10:52
|- - jcxz   Цитата(k155la3 @ Jul 11 2017, 13:52) Есть...   Jul 11 2017, 11:08
- - sigmaN   С этим разобрались, осталось провести эксперименты...   Jul 11 2017, 11:47
|- - Lerk   Цитата(sigmaN @ Jul 11 2017, 14:47) Честн...   Jul 11 2017, 12:40
- - sigmaN   Видел. Там даже мой лайк имеется под этим видео ))...   Jul 11 2017, 13:15
- - 501-q   https://www.state-machine.com/ https://state-machi...   Jul 25 2017, 05:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 16:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01568 секунд с 7
ELECTRONIX ©2004-2016