diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java index 74fa75495879666df5f73f2ead3282efed37d339..c675dac9ec410e65774c032b97d412070e794ccf 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java @@ -529,7 +529,8 @@ public class Avatar2SysML { // timers ------------------- if (timerList != null && timerList.size() != 0) { avsysml.append("\n" + indent + "// Timers ---------------------\n"); - for (AvatarAttribute timer : timerList) timer2SysML(timer); + for (AvatarAttribute timer : timerList) + avsysml.append(indent + "part " + timerBlockSysMLname(timer.getName()) + ": '#AvatarTimer' = '#AvatarTimer'();\n"); } // sub-blocks ------------------- List<AvatarBlock> subBlockList = new ArrayList<AvatarBlock>(); @@ -549,21 +550,6 @@ public class Avatar2SysML { for(AvatarBlock block: avspec.getListOfBlocks()) if (block.getFather() == null) block2SysML(block); } - void timer2SysML(AvatarAttribute timer) { - String relationname = timerRelationSysMLname(timer.getName()); - String settimername = setTimerChannelSysMLname(timer.getName()); - String resettimername = resetTimerChannelSysMLname(timer.getName()); - String expiretimername = expireTimerChannelSysMLname(timer.getName()); - String timerblockname = timerBlockSysMLname(timer.getName()); - avsysml.append(indent + "part " + relationname + ": '#Timer_Rel';\n"); - avsysml.append(indent + "part " + settimername + ": '#Sync' = '#Sync'('@relation' = " + relationname + ");\n"); - avsysml.append(indent + "part " + resettimername + ": '#Sync' = '#Sync'('@relation' = " + relationname + ");\n"); - avsysml.append(indent + "part " + expiretimername + ": '#Sync' = '#Sync'('@relation' = " + relationname + ");\n"); - avsysml.append(indent + "part " + timerblockname + ": '#AvatarTimer';\n"); - avsysml.append(indent + "bind " + timerblockname + ".set = " + settimername + ";\n"); - avsysml.append(indent + "bind " + timerblockname + ".reset = " + resettimername + ";\n"); - avsysml.append(indent + "bind " + timerblockname + ".expire = " + expiretimername + ";\n"); - } Boolean stopState; void statemachine2SysML(AvatarStateMachine asm) { stateList.clear(); @@ -775,7 +761,7 @@ public class Avatar2SysML { avsysml.append(indent + "'@request' =\n"); indent += indentStep; avsysml.append(setTimerRequest2SysML(1, "0", "0", - setTimerChannelSysMLname(((AvatarSetTimer) aos).getTimer().getName()), + timerBlockSysMLname(((AvatarResetTimer) aos).getTimer().getName()) + ".set" , ((AvatarSetTimer)aos).getTimerValue()) + "\n"); indent = indent.substring(2 * indentStepSize); avsysml.append(indent + ");\n"); @@ -791,7 +777,7 @@ public class Avatar2SysML { avsysml.append(indent + "'@request' =\n"); indent += indentStep; avsysml.append(resetTimerRequest2SysML(1, "0", "0", - resetTimerChannelSysMLname(((AvatarResetTimer) aos).getTimer().getName())) + "\n"); + timerBlockSysMLname(((AvatarResetTimer) aos).getTimer().getName()) + ".reset" ) + "\n"); indent = indent.substring(2 * indentStepSize); avsysml.append(indent + ");\n"); // its transition @@ -805,7 +791,7 @@ public class Avatar2SysML { avsysml.append(indent + "'@request' =\n"); indent += indentStep; avsysml.append(expireTimerRequest2SysML(1, "0", "0", - expireTimerChannelSysMLname(((AvatarExpireTimer) aos).getTimer().getName())) + "\n"); + timerBlockSysMLname(((AvatarResetTimer) aos).getTimer().getName()) + ".expire" ) + "\n"); indent = indent.substring(2 * indentStepSize); avsysml.append(indent + ");\n"); // its transition @@ -925,18 +911,18 @@ public class Avatar2SysML { sysMLrequests.append(setTimerRequest2SysML(transindex, expr2SysML(minDelay), expr2SysML(maxDelay), - setTimerChannelSysMLname(((AvatarTimerOperator) target).getTimer().getName()), + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()) + ".set", ((AvatarSetTimer) target).getTimerValue())); else if (requestType == 4) // Reset sysMLrequests.append(resetTimerRequest2SysML(transindex, expr2SysML(minDelay), expr2SysML(maxDelay), - resetTimerChannelSysMLname(((AvatarTimerOperator) target).getTimer().getName()))); + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()) + ".reset" )); else // Expire sysMLrequests.append(expireTimerRequest2SysML(transindex, expr2SysML(minDelay), expr2SysML(maxDelay), - expireTimerChannelSysMLname(((AvatarTimerOperator) target).getTimer().getName()))); + timerBlockSysMLname(((AvatarTimerOperator) target).getTimer().getName()) + ".expire" )); if(guarded) { indent = indent.substring(indentStepSize); sysMLrequests.append("\n" + indent + "else '#nok_request'(" + transindex + ")"); diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java index 2921120b8b9fdd9cb617a8320cbf585e5ad3c744..c273cd970cdac5493b6d07e0a624a67470eb51c0 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java @@ -103,11 +103,6 @@ public class Avatar2SysMLNames { public static String preresetTimerStateSysMLname(String timerName, int number){ return "'@st:prereset." + timerName.trim() + "." + number + "'"; } public static String preexpireTimerStateSysMLname(String timerName, int number){ return "'@st:preexpire." + timerName.trim() + "." + number + "'"; } public static String timerBlockSysMLname(String timerName){ return "'@tmr:" + timerName.trim() + "'"; } - public static String timerRelationSysMLname(String timerName){ return "'@TMRRel:" + timerName.trim() + "'"; } - public static String setTimerChannelSysMLname(String timerName){ return "'@ch:set." + timerName.trim() + "'"; } - public static String resetTimerChannelSysMLname(String timerName){ return "'@ch:reset." + timerName.trim() + "'"; } - public static String expireTimerChannelSysMLname(String timerName){ return "'@ch:expire." + timerName.trim() + "'"; } - public static String expr2SysML(String _expr) { Avatar2SysMLParser parser = new Avatar2SysMLParser(new Avatar2SysMLLexer(new StringReader (_expr))); try { return (String)parser.parse().value; } diff --git a/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml b/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml index 1315b963003f8acf4a3aac0817809a3720c931b9..8c169958eb78fe6fc03ddca97781ff13eae734b3 100644 --- a/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml +++ b/src/main/java/avatartranslator/tosysmlv2/static/AvatarBlockTypes.sysml @@ -12,6 +12,8 @@ package AvatarBlockTypes { state def '#AvatarStateMachine'{ item localClock : Clock redefines localClock = systemClock ; } + action def '#ReceiveAction'; + action def '#TransitionAction'; abstract state def '#AvatarState' { protected item '@pool'[0..*] : '#Request' default '#immediate_request'; @@ -98,80 +100,85 @@ package AvatarBlockTypes { // Block type for timers part def '#AvatarTimer' :> '#AvatarBlock' { - attribute '$value' : Integer := 0; + private attribute value : Integer := 0; - part set : '#Sync'; - part reset : '#Sync'; - part expire : '#Sync'; + private part t_rel: '#Sync_Rel'; + part set : '#Sync' = '#Sync'('@relation' = t_rel); + part reset : '#Sync' = '#Sync'('@relation' = t_rel); + part expire : '#Sync' = '#Sync'('@relation' = t_rel); - // state-machine description +++++ + // state-machine ------------------- exhibit state '@statemachine' : '#AvatarStateMachine' { - entry action '@st:start' :'#AvatarStartState'; + entry action startstate :'#AvatarStartState'; - transition : '#AvatarTransition' first '@st:start' - then '@st:standard.wait4set'; + transition : '#AvatarTransition' first startstate + then st_wait4set; - state '@st:standard.wait4set' : '#AvatarStandardState' = '#AvatarStandardState'( - '@pool' = ( '#ReceiveRequest'('@index'= 1, '@channel'= set), - '#ReceiveRequest'('@index'= 2, '@channel'= reset ) ) + state st_wait4set : '#AvatarStandardState' = '#AvatarStandardState'( + '@pool' = ( + '#ReceiveRequest'('@channel'= set), + '#ReceiveRequest'('@index' = 2,'@channel'= reset) ) ); - transition : '#AvatarTransition' first '@st:standard.wait4set' if '@index' == 1 - do action { + transition : '#AvatarTransition' first st_wait4set if '@index' == 1 + do action : '#ReceiveAction' { item msg : '#TimerSetMsg' = '@payload' as '#TimerSetMsg'; - first start; then assign '$value' := msg.'value'; then done; - } then '@st:receive.set.0'; + first start; then assign value := msg.value; then done; + } then rcv_set_0; - transition : '#AvatarTransition' first '@st:standard.wait4set' if '@index' == 2 - then '@st:receive.reset.4'; + transition : '#AvatarTransition' first st_wait4set if '@index' == 2 + then rcv_reset_2; - state '@st:standard.wait4expire' : '#AvatarStandardState' = '#AvatarStandardState'( + state st_wait4expire : '#AvatarStandardState' = '#AvatarStandardState'( '@pool' = ( - '#ReceiveRequest'('@index'= 1, '@channel'= set), - '#SendRequest'('@index'= 2, '@channel'= expire, - '@delay' = '#bound_random'('$value', '$value'), - '@payload' = '#TimerExpireMsg'()), - '#ReceiveRequest'('@index'= 3, '@channel'= reset) ) + '#ReceiveRequest'('@channel'= set), + '#SendRequest'( + '@index' = 2, + '@channel'= expire, + '@delay' = value, + '@payload' = '#TimerExpireMsg'() + ), + '#ReceiveRequest'('@index' = 3,'@channel'= reset) + ) ); - transition : '#AvatarTransition' first '@st:standard.wait4expire' if '@index' == 1 - do action { + transition : '#AvatarTransition' first st_wait4expire if '@index' == 1 + do action : '#ReceiveAction' { item msg : '#TimerSetMsg' = '@payload' as '#TimerSetMsg'; - first start; then assign '$value' := msg.'value'; then done; - } then '@st:receive.set.2'; - - transition : '#AvatarTransition' first '@st:standard.wait4expire' if '@index' == 2 - then '@st:send.expire.0'; + first start; then assign value := msg.'value'; then done; + } then rcv_set_1; - transition : '#AvatarTransition' first '@st:standard.wait4expire' if '@index' == 3 - then '@st:receive.reset.6'; + transition : '#AvatarTransition' first st_wait4expire if '@index' == 2 + then snd_expire_0; - state '@st:receive.set.0' : '#AvatarReceiveState'; + transition : '#AvatarTransition' first st_wait4expire if '@index' == 3 + then rcv_reset_3; - transition : '#AvatarTransition' first '@st:receive.set.0' - then '@st:standard.wait4expire'; + state rcv_set_0 : '#AvatarReceiveState'; - state '@st:receive.set.2' : '#AvatarReceiveState'; + transition : '#AvatarTransition' first rcv_set_0 + then st_wait4expire; - transition : '#AvatarTransition' first '@st:receive.set.2' - then '@st:standard.wait4expire'; + state rcv_set_1 : '#AvatarReceiveState'; - state '@st:receive.reset.4' : '#AvatarReceiveState'; + transition : '#AvatarTransition' first rcv_set_1 + then st_wait4expire; - transition : '#AvatarTransition' first '@st:receive.reset.4' - then '@st:standard.wait4set'; + state rcv_reset_2 : '#AvatarReceiveState'; - state '@st:receive.reset.6' : '#AvatarReceiveState'; + transition : '#AvatarTransition' first rcv_reset_2 + then st_wait4set; - transition : '#AvatarTransition' first '@st:receive.reset.6' - then '@st:standard.wait4set'; + state rcv_reset_3 : '#AvatarReceiveState'; - state '@st:send.expire.0' : '#AvatarSendState'; + transition : '#AvatarTransition' first rcv_reset_3 + then st_wait4set; - transition : '#AvatarTransition' first '@st:send.expire.0' - then '@st:standard.wait4set'; + state snd_expire_0 : '#AvatarSendState'; + transition : '#AvatarTransition' first snd_expire_0 + then st_wait4set; } - } + } }