/*
 * (c) Peter Mueller, 2008
 *
 * All rights reserved. Reproduction, modification,
 * use or disclosure to third parties without express
 * authority is forbidden.
 */

/* Command line options: -v -c -Trace -p ssc -o equivalent equivalent_sc.xml   */
/* This file is generated from equivalent_sc.xml - do not edit manually  */
/* Generated on: Sat Oct 28 20:04:43 CEST 2023 / Version 6.1.3706 */


#include "mydefs.h" // safety types
#include "equivalent.h"
#include "equivalent_ext.h"
#include "equivalent_trace.h"
#include "timer.h"
#include "io_interface.h"
#include <stdio.h>

extern EQUIVALENT_EVENT_T msg;
extern uint8_t timerId;

uint8_t a,b,enable;




void  equivalent(EQUIVALENT_INSTANCEDATA_T *instanceVar){

	EQUIVALENT_EV_CONSUMED_FLAG_T evConsumed = 0U;

	
	/*execute entry code of default state once to init machine */
	if(instanceVar->idleEntry==1U){
		equivalentTraceEvent(instanceVar->inst_id, 7U);
		setDiag(0x0);
		setReady(0);
		

		instanceVar->idleEntry=0U;
	}

	/* action code */
	a=getS_ChannelA();
	b=getS_ChannelB();
	enable=getEnable();


	switch (instanceVar->stateVar) {

		case Idle:
			if(enable==1){
				/* Transition from Idle to Active */
				evConsumed=16U;

				setReady(1);
				setError(0);
				setDiag(0x8001);
				timerStop(timerId);
				instanceVar->stateVar = Active;/* Default in entry chain  */
				instanceVar->stateVarActive = Init;/* Default in entry chain  */

				equivalentTraceEvent(instanceVar->inst_id, 1U);
			}else{
				/* Intentionally left blank */
			} /*end of event selection */
		break; /* end of case Idle  */

		case Active:

			switch (instanceVar->stateVarActive) {

				case Init:
					if(!a && b && enable){
						/* Transition from Init to WaitChannelA */
						evConsumed=16U;

						/* OnEntry code of state WaitChannelA */
						setDiag(0x8014);
						timerStart(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = WaitChannelA;
						equivalentTraceEvent(instanceVar->inst_id, 5U);
					}else if(a && !b && enable){
						/* Transition from Init to WaitChannelB */
						evConsumed=16U;

						/* OnEntry code of state WaitChannelB */
						setDiag(0x8004);
						timerStart(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = WaitChannelB;
						equivalentTraceEvent(instanceVar->inst_id, 3U);
					}else if(a && b && enable){
						/* Transition from Init to SafetyOutEnabled */
						evConsumed=16U;

						/* OnEntry code of state SafetyOutEnabled */
						setS_EquivalentOut(1);
						setDiag(0x8000);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = SafetyOutEnabled;
						equivalentTraceEvent(instanceVar->inst_id, 4U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case Init  */

				case WaitChannelB:
					if(!a && !b && enable){
						/* Transition from WaitChannelB to Init */
						evConsumed=16U;

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else if(a && b && enable){
						/* Transition from WaitChannelB to SafetyOutEnabled */
						evConsumed=16U;

						/* OnEntry code of state SafetyOutEnabled */
						setS_EquivalentOut(1);
						setDiag(0x8000);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = SafetyOutEnabled;
						equivalentTraceEvent(instanceVar->inst_id, 4U);
					}else if(msg==(EQUIVALENT_EVENT_T)evTimeout){
						/* Transition from WaitChannelB to Error12 */
						evConsumed=1U;

						/* Action code for transition  */
						setDiag(0xC001);


						/* OnEntry code of state Error12 */
						setError(1);

						/* adjust state variables  */
						instanceVar->stateVarActive = Error12;
						equivalentTraceEvent(instanceVar->inst_id, 0U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case WaitChannelB  */

				case SafetyOutEnabled:
					if(!a && !b && enable){
						/* Transition from SafetyOutEnabled to Init */
						evConsumed=16U;
						/* OnExit code of state SafetyOutEnabled */
						setS_EquivalentOut(0);

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else if(!a && b && enable){
						/* Transition from SafetyOutEnabled to FromActiveWait */
						evConsumed=16U;
						/* OnExit code of state SafetyOutEnabled */
						setS_EquivalentOut(0);

						/* OnEntry code of state FromActiveWait */
						setDiag(0x8005);
						timerStart(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = FromActiveWait;
						equivalentTraceEvent(instanceVar->inst_id, 5U);
					}else if(a && !b && enable){
						/* Transition from SafetyOutEnabled to FromActiveWait */
						evConsumed=16U;
						/* OnExit code of state SafetyOutEnabled */
						setS_EquivalentOut(0);

						/* OnEntry code of state FromActiveWait */
						setDiag(0x8005);
						timerStart(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = FromActiveWait;
						equivalentTraceEvent(instanceVar->inst_id, 3U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case SafetyOutEnabled  */

				case Error12:
					if(!a && !b && enable){
						/* Transition from Error12 to Init */
						evConsumed=16U;

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case Error12  */

				case WaitChannelA:
					if(!a && !b && enable){
						/* Transition from WaitChannelA to Init */
						evConsumed=16U;

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else if(a && b && enable){
						/* Transition from WaitChannelA to SafetyOutEnabled */
						evConsumed=16U;

						/* OnEntry code of state SafetyOutEnabled */
						setS_EquivalentOut(1);
						setDiag(0x8000);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = SafetyOutEnabled;
						equivalentTraceEvent(instanceVar->inst_id, 4U);
					}else if(msg==(EQUIVALENT_EVENT_T)evTimeout){
						/* Transition from WaitChannelA to Error12 */
						evConsumed=1U;

						/* Action code for transition  */
						setDiag(0xC002);


						/* OnEntry code of state Error12 */
						setError(1);

						/* adjust state variables  */
						instanceVar->stateVarActive = Error12;
						equivalentTraceEvent(instanceVar->inst_id, 0U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case WaitChannelA  */

				case FromActiveWait:
					if(!a && !b && enable){
						/* Transition from FromActiveWait to Init */
						evConsumed=16U;
						/* OnExit code of state FromActiveWait */
						timerStop(timerId);

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else if(msg==(EQUIVALENT_EVENT_T)evTimeout){
						/* Transition from FromActiveWait to Error3 */
						evConsumed=1U;
						/* OnExit code of state FromActiveWait */
						timerStop(timerId);

						/* OnEntry code of state Error3 */
						setError(1);
						setDiag(0xC003);

						/* adjust state variables  */
						instanceVar->stateVarActive = Error3;
						equivalentTraceEvent(instanceVar->inst_id, 0U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case FromActiveWait  */

				case Error3:
					if(!a && !b && enable){
						/* Transition from Error3 to Init */
						evConsumed=16U;

						/* OnEntry code of state Init */
						setReady(1);
						setError(0);
						setDiag(0x8001);
						timerStop(timerId);

						/* adjust state variables  */
						instanceVar->stateVarActive = Init;
						equivalentTraceEvent(instanceVar->inst_id, 6U);
					}else{
						/* Intentionally left blank */
					} /*end of event selection */
				break; /* end of case Error3  */

				default:
					/* Intentionally left blank */
				break;
			} /* end switch Active */

			/* Check if event was already processed  */
			if(evConsumed==0U){

				if(enable==0){
					/* Transition from Active to Idle */
					evConsumed=16U;
					
					if(instanceVar->stateVarActive==SafetyOutEnabled){
						setS_EquivalentOut(0);


					}else if(instanceVar->stateVarActive==FromActiveWait){
						timerStop(timerId);

					}else {
						/* Intentionally left blank */
					};


					/* OnEntry code of state Idle */
					setDiag(0x0);
					setReady(0);

					/* adjust state variables  */
					instanceVar->stateVar = Idle;
					equivalentTraceEvent(instanceVar->inst_id, 2U);
				}else{
					/* Intentionally left blank */
				} /*end of event selection */
			}
		break; /* end of case Active  */

		default:
			/* Intentionally left blank */
		break;
	} /* end switch stateVar_root */
}

/* Initialize state machine */
void equivalentInitMachine(EQUIVALENT_INSTANCEDATA_T * const instanceVar, EQUIVALENT_INST_ID_T instId) {
	instanceVar->idleEntry = 1U;
	instanceVar->stateVar = Idle;
	instanceVar->stateVarActive = Init;

	instanceVar->inst_id = instId;

}

/* Implementation of the reset machine function */
void equivalentResetMachine(EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	instanceVar->idleEntry = 1U;
	instanceVar->stateVar = Idle;
	instanceVar->stateVarActive = Init;

}
/* Helper(s) to reset history */
void equivalentResetHistoryActive(EQUIVALENT_INSTANCEDATA_T * const instanceVar){
	instanceVar->stateVarActive=Init;
}


/* Helper(s) to find out if the machine is in a certain state */

uint8_t equivalentIsInActive(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInError12(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== Error12)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInError3(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== Error3)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInFromActiveWait(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== FromActiveWait)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInIdle(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVar== Idle)) ? (1U) : (0U));
}

uint8_t equivalentIsInInit(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== Init)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInSafetyOutEnabled(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== SafetyOutEnabled)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInWaitChannelA(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== WaitChannelA)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}

uint8_t equivalentIsInWaitChannelB(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	return(((instanceVar->stateVarActive== WaitChannelB)&&(instanceVar->stateVar== Active)) ? (1U) : (0U));
}


/* Helper to get id of innermost active state */
EQUIVALENT_STATES_T equivalentGetInnermostActiveState(const EQUIVALENT_INSTANCEDATA_T * const instanceVar) {
	EQUIVALENT_STATES_T innermost;

	if(equivalentIsInWaitChannelB(instanceVar)) {
		innermost =WaitChannelB;
	}else if(equivalentIsInWaitChannelA(instanceVar)) {
		innermost = WaitChannelA;
	}else if(equivalentIsInSafetyOutEnabled(instanceVar)) {
		innermost = SafetyOutEnabled;
	}else if(equivalentIsInInit(instanceVar)) {
		innermost = Init;
	}else if(equivalentIsInFromActiveWait(instanceVar)) {
		innermost = FromActiveWait;
	}else if(equivalentIsInError3(instanceVar)) {
		innermost = Error3;
	}else if(equivalentIsInError12(instanceVar)) {
		innermost = Error12;
	}else if(equivalentIsInIdle(instanceVar)) {
		innermost = Idle;
	}else{
		innermost = __EQUIVALENT_LAST_STATE__;
	}
	return innermost;	
}

