# Developer Concepts

## API specifications of the generated code

In the following comments the TrafficLight example statemachine is used to describe the API specifications of the code generated by the Yakindu C and Java code generators. The following image shows the statechart. It is a model of a simple pedestrian crossing with a traffic light for pedestrians and a traffic light for the cars.

For Java you can checkout the project ‚org.yakindusct.examples.trafficlight’ from the Yakindu google code repository ( Google code link ). The Java example contains the statechart, sgen model, graphical widgets and some glue code to connect the generated code with the widgets. The graphical widgets are based on SWT. To execute the Java example you can run the file ‚CrossingDemoCycleBased.java’ as ‚Java Application’ from the eclipse ‚Run As’ context menu.

For C you can checkout the project ‚org.yakindu.examples.c.trafficlight’ from the Yakindu google code repository ( Google code link ). The C example contains the statechart, sgen model, graphical widgets and some glue code to connect the generated code with the widgets. The graphical widgets are based on Qt. To execute the c example you can run the file org_yakindu_sct_examples_c_trafficlight as ‚Local C/C++ application’ from the eclipse ‚Run As’ context menu.

### Specifications of Java code

You find the generated code in the ‚src-gen’ folder of the traffic light example.

In the package ‚org.yakindu.sct.examples.trafficlight.cyclebased’ are the most basic statemachine interfaces and classes located. These are needed by each statemachine and are independend from the concrete statemachine design.

The interface `IStatemachine` is implemented by each generated statemachine:

    package org.yakindu.sct.examples.trafficlight.cyclebased;

    /**
     * Basic interface for statemachines.
     *
     *
     */
    public interface IStatemachine {

    	/**
    	* Initializes the statemachine. Use to init internal variables etc.
    	*/
    	public void init();

    	/**
    	* Enters the statemachine. Sets the statemachine in a defined state.
    	*/
    	public void enter();

    	/**
    	* Exits the statemachine. Leaves the statemachine with a defined state.
    	*/
    	public void exit();

    	/**
    	* Start a run-to-completion cycle.
    	*/
    	public void runCycle();
    }

It contains the four methods `init()`, `enter()`, `exit()` and `runCycle()`. The `init()` method is used to initialize the internal objects of the statemachine after instantiation. Variables are initialized to a default value. If you have initialized variables in the statechart definition these initializations are done in the init method too. The `enter()` method should be called if the statemachine is entered. It sets the statemachine into a defined state. The `exit()` method is used to leave a statemachine statefully. If for example a history state is used in one of the top regions the last active state is stored and the statemachine is leaved via `exit()` and reentered via `enter()` it continues working with this state. The `runCycle()` method is used to trigger a run to completion step in which the statemachine evaluates arising events and computes possible state changes.

In the traffic light example timing is used (after clauses). To support this the interfaces ‚ITimedStatemachine’, ‚ITimerService’ and the class ‚TimeEvent’ are generated.

    package org.yakindu.sct.examples.trafficlight.cyclebased;

    /**
    * Interface for state machines which use timed event triggers.
    */
    public interface ITimedStatemachine {

    	/**
    	* Set the {@link ITimerService} for the state machine. It must be set
    	* externally on a timed state machine before a run cycle can be correct
    	* executed.
    	*
    	* @param timerService
    	*/
    	public void setTimerService(ITimerService timerService);

    	/**
    	* Returns the currently used timer service.
    	*
    	* @return {@link ITimerService}
    	*/
    	public ITimerService getTimerService();

    	/**
    	* Callback method if a {@link TimeEvent} occurred.
    	*
    	* @param timeEvent
    	*/
    	public void onTimeEventRaised(TimeEvent timeEvent);
    }

`ITimedStatemachine` extends the generated statemachine to set a `ITimerService` and provides a callback method `onTimeEventRaised(TimeEvent timeEvent)` to raise `TimeEvents`.

### Specifications of C code