#include "ExampleSimpleData.h"
#include <stdio.h>

#ifndef __StateDef__

extern struct State_Fwc_t Off, Work, Work_History, Ready;

#endif

#ifdef __StateDef__

//: Name all arguments of a state entry-, exit- and trans-method as static variable here.
//: In generated code there will be given in the argument list.
static struct ExampleSimpleData_t* thiz;
static int event;

//Helper should be defined.
void switchTo(void* ...);


class States
{

  inline void variables() {
    char* StateSubStruct = "State_ExampleSimpleData";
    char* StateMethodSuffix = "_ExampleSimpleData";
    char* StateInstance = "thiz->state";  
  }

  //void args(ExampleSimpleData* thiz);

  /**It is the off-state. This part contains a documentation of the state
   */
  class Off
  { int statenr_1;
    
    /**Comment for entry-action. Note: If nothing is specified on entry, you can remove the entry method too.*/
    void entry(){ 
      thiz->work = 0;
    }//.
    
    /**Comment for exit-action. Note: If nothing is specified on exit, you can remove the exit method too.*/
    void exit(){ 
    }//.
    
    /**Comment for this transition. */
    void trans(bool cond = thiz->on_ready) {
      if(thiz->on_cont){ switchTo(new Work::History); }
      else { thiz->work = 1; switchTo(new Work::Ready()); } 
    }
    
    /**Comment for the other transition. */
    void trans1(bool cond = thiz->on_cont){ switchTo(new Work::History); }

    #endif
    struct State_Fwc_t* checkTrans(ExampleSimpleData* thiz, int ev) {
      if(thiz->on_ready) {
        if(thiz->on_cont){ return &Work_History; }
        else { thiz->work = 1; return &Ready; } 
      }
      else return null;
    }
    #ifdef __StateDef__

    /**The method which should be done in the state, if the statemachine is invoked cyclically. */
    void inState(){
      thiz->counter +=1;
    }//.
    
  };
  


  /**It is a composite state. But that is seen on the inner states only. */
  public: class Work
  { int statenr_2;
    
    /**If this marker exist, a history state can be used as destination inside this class.
     * The code generation uses and extra variable for the state value. */
    public: class History{};
    
    void entry(){ 
      thiz->work = 1;  
    }//.

    void exit(){ 
      thiz->work = 0;  
    }//.
    
    void trans(bool cond = thiz->off){
      switchTo(new Off()); 
    }
    
  
    /**This state is an inner state of Work. Formally it extends Work. */
    class Ready : protected ExampleSimpleData
    { int statenr_0x21;
    
      void trans(bool cond = event == kStart_Event_ExampleSimple) { 
        switchTo( new Active::Active1::Running::Running2::Running21()
                , new Active::Active2::RemainOn()); 
      }
    
    };
  
    
    /**An second inner state of Work. */
    class Active : protected ExampleSimpleData
    { int statenr_0x22;
      int parallel;
     
      /**Name of parallel Parts in the State Active. */
      class Active1 : protected ExampleSimpleData { 
        int statenr_0xa100;
        
       
        class Running : protected ExampleSimpleData
        { int statenr_0x40;

          void entry(){ thiz->out = 3; }//.
          
          void exit(){ thiz->out = 5; }//.

          void trans(int time = thiz->delay){ switchTo(new Finit); }
          

          class Running1: protected ExampleSimpleData
          { int statenr_0x41;
          };

          class Running2: protected ExampleSimpleData
          { int statenr_0x44;
            
            class Running21: protected ExampleSimpleData
            { int statenr_0x45;
            };

          };

        };

        class Finit : protected ExampleSimpleData
        { int statenr_0x50;
          

        };

      
      };




      class Active2 {
        int statenr_0xa200;
          
        
        class RemainOn : protected ExampleSimpleData
        { int statenr_0x100;
          
          void trans(bool cond = thiz->offAfterRunning){ switchTo(new ShouldOff); }

          /**This is one of the working states. It toogles between On_a and On_b. */
          class On_a : protected ExampleSimpleData
          { int statenr_0x300;
           
            void trans(bool cond = thiz->bit_a){ switchTo(new On_b); }
          };


          /**See On_a, working state. */
          class On_b : protected ExampleSimpleData
          { int statenr_0x400;
       
            void trans(bool cond = thiz->bit_b){ switchTo(new On_a); }
          };



        };



        class ShouldOff : protected ExampleSimpleData
        { int statenr_0x700;

          void trans(class Finit* join){ switchTo(new Off); }

          void trans2(bool cond = thiz->abort){ switchTo(new Off); }
        };

    
      };
  
      /**join of 2 states of the underlying parallel states. 
       * Syntax note: It should be declared after the classes, because elsewhere there are unknown.
       * The body contains new declaration of the destination class(es).
       */ 
      void join(class Active::Active1::Finit*, class Active::Active2::ShouldOff*){ switchTo(new Off); }



    
    };
  
  };
  




  
  
};


#endif //__StateDef__