Skip to main content
aboutsummaryrefslogblamecommitdiffstats
blob: 8c93be918ab25f5666a9d9a0c55a9c5197a5252e (plain) (tree)






















































































































































































































                                                                                                                                                             
#ifndef _Sender_H_
#define _Sender_H_

#include "datatypes.h"

package cGenRef;




#include "CommunicationProtocol.h"



public class Sender extends ActorClassBase {

	
	//--------------------- ports
	protected CommunicationProtocolConjPort dataOut = null;
	//--------------------- saps
	//--------------------- services

	//--------------------- interface item IDs
	protected static final int IFITEM_dataOut = 1;
	
	//--------------------- attributes
	//--------------------- operations

	//--------------------- construction
	public Sender(IRTObject parent, String name, Address[][] port_addr, Address[][] peer_addr){
		super(parent, name, port_addr[0][0], peer_addr[0][0]);
		setClassName("Sender");
		
		// initialize attributes

		// own ports
		dataOut = new CommunicationProtocolConjPort(this, "dataOut", IFITEM_dataOut, 0, port_addr[IFITEM_dataOut][0], peer_addr[IFITEM_dataOut][0]); 
		// own saps
		// own service implementations
	}
	

	//--------------------- lifecycle functions
	public void init(){
		initUser();
	}

	public void start(){
		startUser();
	}

	public void stop(){
		stopUser();
	}
	
	public void destroy(){
		destroyUser();
	}	

	//******************************************
	// START of generated code for FSM
	//******************************************
	
	// State IDs for FSM
	protected static final int STATE_SendingData = 2;
	protected static final int STATE_Done = 3;
		protected static final String stateStrings[] = {"<no state>","<top>","SendingData",
			"Done"
			};
	
	// history
	// TODOHRR: history defined in ActorClassBase, init in constructor
	//		history = new int[5];
	//		for (int i = 0; i < history.length; i++) {
	//			history[i] = NO_STATE;
	//		}
	protected int history[] = {NO_STATE,NO_STATE,NO_STATE,NO_STATE};
	
	// transition chains
	protected static final int CHAIN_TRANS_INITIAL_TO__SendingData = 1;
	protected static final int CHAIN_TRANS_SendingData_TO_Done_BY_receivedDatadataOut = 2;
	
	// triggers for FSM
	protected static final int TRIG_dataOut__receivedData = IFITEM_dataOut + EVT_SHIFT*CommunicationProtocol.OUT_receivedData;
	
	// receiveEvent contains the main implementation of the FSM
	@Override
	public void receiveEvent(InterfaceItemBase ifitem, int evt, Object generic_data) {
		int trigger = ifitem.getLocalId() + EVT_SHIFT*evt;
		int chain = NOT_CAUGHT;
		int catching_state = NO_STATE;
		boolean is_handler = false;
		boolean skip_entry = false;
		
		if (!handleSystemEvent(ifitem, evt, generic_data)) {
			switch (state) {
				case STATE_SendingData:
					switch(trigger) {
					case TRIG_dataOut__receivedData:
						{
							chain = CHAIN_TRANS_SendingData_TO_Done_BY_receivedDatadataOut;
							catching_state = STATE_TOP;
						}
					break;
					}
					break;
				case STATE_Done:
					break;
			}
		}
		if (chain != NOT_CAUGHT) {
			exitTo(state, catching_state, is_handler);
			int next = executeTransitionChain(chain, ifitem, generic_data);
			next = enterHistory(next, is_handler, skip_entry);
			setState(next);
		}
	}
	
	private void setState(int new_state) {
		DebuggingService.getInstance().addActorState(this,stateStrings[new_state]);
		if (stateStrings[new_state]!="Idle") {
			// TODOTS: model switch for activation
			System.out.println(getInstancePath() + " -> " + stateStrings[new_state]);
		}	
		this.state = new_state;
	}
	
	@Override
	public void executeInitTransition() {
		int chain = CHAIN_TRANS_INITIAL_TO__SendingData;
		int next = executeTransitionChain(chain, null, null);
		next = enterHistory(next, false, false);
		setState(next);
	}
	
	/**
	 * calls exit codes while exiting from the current state to one of its
	 * parent states while remembering the history
	 * @param current - the current state
	 * @param to - the final parent state
	 * @param handler - entry and exit codes are called only if not handler (for handler TransitionPoints)
	 */
	private void exitTo(int current, int to, boolean handler) {
		while (current!=to) {
			switch (current) {
				case STATE_SendingData:
					history[STATE_TOP] = STATE_SendingData;
					current = STATE_TOP;
					break;
				case STATE_Done:
					history[STATE_TOP] = STATE_Done;
					current = STATE_TOP;
					break;
			}
		}
	}
	/**
	 * calls action, entry and exit codes along a transition chain. The generic data are cast to typed data
	 * matching the trigger of this chain. The ID of the final state is returned
	 * @param chain - the chain ID
	 * @param generic_data - the generic data pointer
	 * @return the ID of the final state
	 */
	private int executeTransitionChain(int chain, InterfaceItemBase ifitem, Object generic_data) {
		switch (chain) {
			case CHAIN_TRANS_INITIAL_TO__SendingData:
			{
				return STATE_SendingData;
			}
			case CHAIN_TRANS_SendingData_TO_Done_BY_receivedDatadataOut:
			{
				return STATE_Done;
			}
		}
		return NO_STATE;
	}
	/**
	 * calls entry codes while entering a state's history. The ID of the final leaf state is returned
	 * @param state - the state which is entered
	 * @param handler - entry code is executed if not handler
	 * @return - the ID of the final leaf state
	 */
	private int enterHistory(int state, boolean handler, boolean skip_entry) {
		while (true) {
			switch (state) {
				case STATE_SendingData:
					if (!(skip_entry || handler)) entry_SendingData();
					// in leaf state: return state id
					return STATE_SendingData;
				case STATE_Done:
					// in leaf state: return state id
					return STATE_Done;
				case STATE_TOP:
					state = history[STATE_TOP];
					break;
			}
			skip_entry = false;
		}
		//return NO_STATE; // required by CDT but detected as unreachable by JDT because of while (true)
	}
	
	//*** Entry and Exit Codes
	protected void entry_SendingData() {
		dataOut.sendData(1234);
	}
	
	//*** Action Codes
		 
	//******************************************
	// END of generated code for FSM
	//******************************************
};

#endif /* _Sender_H_ */

Back to the top