Codice modello stato per dispositivo incorporato - Iniezione di dipendenza di oggetti dispositivo in classi di contesto e di stato

2

Sto combattendo con un po 'di codice e penso di aver finalmente ottenuto qualche codice di pattern di stato che funziona con i miei eventi .

Ho un sistema semplificato che funzionerà in questo modo:

QuestoèilmioprimotentativoconilcodicePatterndistatoegliesempichehotrovatoeranotropposempliciosemplicementenoncorrelatialmiotipodidispositivo.

D:Laclassedicontestodovrebbefaretuttoilcontrollodelleperiferichedeldispositivoolostatoattivodovrebbecontrollarledirettamente?Adesempio,guidaildisplay,leggiisensori,ecc.Perme,inentrambiicasifunzionerebbe,manonhoabbastanzaesperienzaquipersceglierecosaècorretto.

HodettoDIperchédevopassaretuttelemieperiferichenelcontesto,quindiinognistatoperfornireilcontrollo.Olihoappenapassatinelcontestoefacciolechiamatealcontestodallostatoattivo(menzionatosopra)?Percomelavedoio,lostatoattivoeilcontestocomunicanocostantementetralorotramiteDIpercontrollareildispositivo.

Sperochesiachiaro.

Codiceclassedelcontesto:

//context//thecontextwillcapturetheinterrupteventsanddelegatetheresponseclassModeContext{privateintrotationCount;privatestringdirection;privateStatestate;publicRotaryEncoderrotaryEncoderInstance;publicTlc5940Display;//publiceventNativeEventHandlerrotationEventHandler;//=null;publicModeContext(RotaryEncoderre,Tlc5940display){this.State=newMode1(this);rotaryEncoderInstance=re;rotaryEncoderInstance.RotationEventHandler+=OnRotationEvent;//attachtoContext'sHandlerrotaryEncoderInstance.MomentaryButtonEventHandler+=OnButtonEvent;Display=display;rotationCount=0;}publicvoidRunStateTask(){state.MainTask(this);}publicStateState{get{returnstate;}set{state=value;}//debugstatechange}//EventHandlerpublicvoidOnButtonEvent(uintclickCount,uintzero,DateTimetime){switch(clickCount){case0:state.OnButtonHold(this);break;case1:state.OnButtonSingleClick(this);break;//default://thrownewException("Something went wrong!");
           //             break;

        }


    }

    public void OnRotationEvent(uint data1, uint data2, DateTime time)
    {
        rotationCount++;
        if (data1 == 1) 
        { 
            direction = "Clockwise";
            state.OnCWRotationEvent(this);
        }
        else
        { 
            direction = "Counter-Clockwise";
            state.OnCCWRotationEvent(this);
        }
        //Debug.Print(rotationCount.ToString() + ": " + direction + " Context Mode Rotation Event Fired!");
    }

}

Esempio di classe di stato:

class Mode1 : State//, IDisposable
{

    public Mode1(ModeContext mode): base(mode)
    {
        Display = mode.Display;   
    }

    public override void MainTask(ModeContext mode)
    {
        Debug.Print("Mode1 Main Task Running...");
        //read Sensor
        //display the value to Display
        //let the context determine how to display it??
        //or call a method in the context that encapsulated all of it's functions?
        //Thread.Sleep(500);
    }

    #region event handlers
    public override void OnCCWRotationEvent(ModeContext mode)
    {
        //change state
        mode.State = new Mode2(mode);
        Debug.Print("Changing State");
    }
    public override void OnCWRotationEvent(ModeContext mode)
    {
        //change state
        Debug.Print("Changing State");
        mode.State = new Mode0(mode);
    }
    public override void OnButtonSingleClick(ModeContext mode)
    {
        Debug.Print("Mode1: Single Click!");
    }
    public override void OnButtonHold(ModeContext mode)
    {
        Debug.Print("Mode1: Press and Hold Detected!");
    }

    #endregion


}
    
posta GisMofx 29.03.2014 - 19:29
fonte

0 risposte