/**
* @author generated by eTrice
*
* Source File of ActorClass ACParser
*
*/
#include "ACParser.h"
#include "modelbase/etActor.h"
#include "debugging/etLogger.h"
#include "debugging/etMSCLogger.h"
#include "etUnit/etUnit.h"
#include "platform/etMemory.h"
#include "FileReaderProtocol.h"
/* interface item IDs */
enum interface_items {
IFITEM_readerPort = 1
};
/* state IDs */
enum state_ids {
NO_STATE = 0,
STATE_TOP = 1,
STATE_code = 2,
STATE_firstSlash = 3,
STATE_blockComment = 4,
STATE_firstStar = 5,
STATE_lineComment = 6
};
/* transition chains */
enum chain_ids {
CHAIN_TRANS_INITIAL_TO__code = 1,
CHAIN_TRANS_tr0_FROM_code_TO_cp0_BY_nextCharreaderPort = 2,
CHAIN_TRANS_tr3_FROM_firstSlash_TO_cp1_BY_nextCharreaderPort = 3,
CHAIN_TRANS_tr6_FROM_blockComment_TO_cp2_BY_nextCharreaderPort = 4,
CHAIN_TRANS_tr9_FROM_firstStar_TO_cp3_BY_nextCharreaderPort = 5,
CHAIN_TRANS_tr15_FROM_lineComment_TO_cp5_BY_nextCharreaderPort = 6
};
/* triggers */
enum triggers {
POLLING = 0,
TRIG_readerPort__nextChar = IFITEM_readerPort + EVT_SHIFT*FileReaderProtocol_OUT_nextChar
};
static void setState(ACParser* self, int new_state) {
self->state = new_state;
}
/* Entry and Exit Codes */
/* Action Codes */
static void action_TRANS_INITIAL_TO__code(ACParser* self) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
static void action_TRANS_tr0_FROM_code_TO_cp0_BY_nextCharreaderPort(ACParser* self, InterfaceItemBase ifitem, char c) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
static void action_TRANS_tr1_FROM_cp0_TO_code(ACParser* self, InterfaceItemBase ifitem, char c) {
printf("%c",c);
}
static void action_TRANS_tr3_FROM_firstSlash_TO_cp1_BY_nextCharreaderPort(ACParser* self, InterfaceItemBase ifitem, char c) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
static void action_TRANS_tr6_FROM_blockComment_TO_cp2_BY_nextCharreaderPort(ACParser* self, InterfaceItemBase ifitem, char c) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
static void action_TRANS_tr9_FROM_firstStar_TO_cp3_BY_nextCharreaderPort(ACParser* self, InterfaceItemBase ifitem, char c) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
static void action_TRANS_tr12_FROM_cp4_TO_code(ACParser* self, InterfaceItemBase ifitem, char c) {
printf("%c%c",'/',c);
}
static void action_TRANS_tr15_FROM_lineComment_TO_cp5_BY_nextCharreaderPort(ACParser* self, InterfaceItemBase ifitem, char c) {
FileReaderProtocolConjPort_getNextChar(&self->constData->readerPort) /* ORIG: readerPort.getNextChar() */;
}
/**
* 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)
*/
static void exitTo(ACParser* self, int current, int to, boolean handler) {
while (current!=to) {
switch (current) {
case STATE_code:
self->history[STATE_TOP] = STATE_code;
current = STATE_TOP;
break;
case STATE_firstSlash:
self->history[STATE_TOP] = STATE_firstSlash;
current = STATE_TOP;
break;
case STATE_blockComment:
self->history[STATE_TOP] = STATE_blockComment;
current = STATE_TOP;
break;
case STATE_firstStar:
self->history[STATE_TOP] = STATE_firstStar;
current = STATE_TOP;
break;
case STATE_lineComment:
self->history[STATE_TOP] = STATE_lineComment;
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
*/
static int executeTransitionChain(ACParser* self, int chain, InterfaceItemBase ifitem, void* generic_data) {
switch (chain) {
case CHAIN_TRANS_INITIAL_TO__code:
{
action_TRANS_INITIAL_TO__code(self);
return STATE_code;
}
case CHAIN_TRANS_tr0_FROM_code_TO_cp0_BY_nextCharreaderPort:
{
char c = *((char*) generic_data);
action_TRANS_tr0_FROM_code_TO_cp0_BY_nextCharreaderPort(self, ifitem, c);
if (c=='/') {
return STATE_firstSlash;}
else {
action_TRANS_tr1_FROM_cp0_TO_code(self, ifitem, c);
return STATE_code;}
}
case CHAIN_TRANS_tr3_FROM_firstSlash_TO_cp1_BY_nextCharreaderPort:
{
char c = *((char*) generic_data);
action_TRANS_tr3_FROM_firstSlash_TO_cp1_BY_nextCharreaderPort(self, ifitem, c);
if (c=='*') {
return STATE_blockComment;}
else {
if (c=='/') {
return STATE_lineComment;}
else {
action_TRANS_tr12_FROM_cp4_TO_code(self, ifitem, c);
return STATE_code;}
}
}
case CHAIN_TRANS_tr6_FROM_blockComment_TO_cp2_BY_nextCharreaderPort:
{
char c = *((char*) generic_data);
action_TRANS_tr6_FROM_blockComment_TO_cp2_BY_nextCharreaderPort(self, ifitem, c);
if (c=='*') {
return STATE_firstStar;}
else {
return STATE_blockComment;}
}
case CHAIN_TRANS_tr9_FROM_firstStar_TO_cp3_BY_nextCharreaderPort:
{
char c = *((char*) generic_data);
action_TRANS_tr9_FROM_firstStar_TO_cp3_BY_nextCharreaderPort(self, ifitem, c);
if (c=='/') {
return STATE_code;}
else {
return STATE_blockComment;}
}
case CHAIN_TRANS_tr15_FROM_lineComment_TO_cp5_BY_nextCharreaderPort:
{
char c = *((char*) generic_data);
action_TRANS_tr15_FROM_lineComment_TO_cp5_BY_nextCharreaderPort(self, ifitem, c);
if (c=='\n') {
return STATE_code;}
else {
return STATE_lineComment;}
}
}
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
*/
static int enterHistory(ACParser* self, int state, boolean handler, boolean skip_entry) {
while (TRUE) {
switch (state) {
case STATE_code:
// in leaf state: return state id
return STATE_code;
case STATE_firstSlash:
// in leaf state: return state id
return STATE_firstSlash;
case STATE_blockComment:
// in leaf state: return state id
return STATE_blockComment;
case STATE_firstStar:
// in leaf state: return state id
return STATE_firstStar;
case STATE_lineComment:
// in leaf state: return state id
return STATE_lineComment;
case STATE_TOP:
state = self->history[STATE_TOP];
break;
}
skip_entry = FALSE;
}
//return NO_STATE; // required by CDT but detected as unreachable by JDT because of while (true)
}
static void executeInitTransition(ACParser* self) {
int chain = CHAIN_TRANS_INITIAL_TO__code;
int next = executeTransitionChain(self, chain, NULL, NULL);
next = enterHistory(self, next, FALSE, FALSE);
setState(self, next);
}
/* receiveEvent contains the main implementation of the FSM */
static void receiveEvent(ACParser* self, InterfaceItemBase ifitem, int evt, void* generic_data) {
int trigger = ifitem->localId + 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 (self->state) {
case STATE_code:
switch(trigger) {
case TRIG_readerPort__nextChar:
{
chain = CHAIN_TRANS_tr0_FROM_code_TO_cp0_BY_nextCharreaderPort;
catching_state = STATE_TOP;
}
break;
}
break;
case STATE_firstSlash:
switch(trigger) {
case TRIG_readerPort__nextChar:
{
chain = CHAIN_TRANS_tr3_FROM_firstSlash_TO_cp1_BY_nextCharreaderPort;
catching_state = STATE_TOP;
}
break;
}
break;
case STATE_blockComment:
switch(trigger) {
case TRIG_readerPort__nextChar:
{
chain = CHAIN_TRANS_tr6_FROM_blockComment_TO_cp2_BY_nextCharreaderPort;
catching_state = STATE_TOP;
}
break;
}
break;
case STATE_firstStar:
switch(trigger) {
case TRIG_readerPort__nextChar:
{
chain = CHAIN_TRANS_tr9_FROM_firstStar_TO_cp3_BY_nextCharreaderPort;
catching_state = STATE_TOP;
}
break;
}
break;
case STATE_lineComment:
switch(trigger) {
case TRIG_readerPort__nextChar:
{
chain = CHAIN_TRANS_tr15_FROM_lineComment_TO_cp5_BY_nextCharreaderPort;
catching_state = STATE_TOP;
}
break;
}
break;
}
}
if (chain != NOT_CAUGHT) {
exitTo(self, self->state, catching_state, is_handler);
int next = executeTransitionChain(self, chain, ifitem, generic_data);
next = enterHistory(self, next, is_handler, skip_entry);
setState(self, next);
}
}
//******************************************
// END of generated code for FSM
//******************************************
void ACParser_init(ACParser* self){
ET_MSC_LOGGER_SYNC_ENTRY("ACParser", "init")
self->state = STATE_TOP;
{
int i;
for (i=0; i<ACPARSER_HISTORY_SIZE; ++i)
self->history[i] = NO_STATE;
}
executeInitTransition(self);
ET_MSC_LOGGER_SYNC_EXIT
}
void ACParser_receiveMessage(void* self, void* ifitem, const etMessage* msg){
ET_MSC_LOGGER_SYNC_ENTRY("ACParser", "_receiveMessage")
receiveEvent(self, (etPort*)ifitem, msg->evtID, (void*)(((char*)msg)+MEM_CEIL(sizeof(etMessage))));
ET_MSC_LOGGER_SYNC_EXIT
}
/*--------------------- operations ---------------------*/