diff options
Diffstat (limited to 'tests/org.eclipse.etrice.core.room.tests/models/formatting/unformatEqualsFormat/TimingService.room')
-rw-r--r-- | tests/org.eclipse.etrice.core.room.tests/models/formatting/unformatEqualsFormat/TimingService.room | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/tests/org.eclipse.etrice.core.room.tests/models/formatting/unformatEqualsFormat/TimingService.room b/tests/org.eclipse.etrice.core.room.tests/models/formatting/unformatEqualsFormat/TimingService.room new file mode 100644 index 000000000..f22cf33df --- /dev/null +++ b/tests/org.eclipse.etrice.core.room.tests/models/formatting/unformatEqualsFormat/TimingService.room @@ -0,0 +1,263 @@ +/*removed comments and whitespace from detail code*/RoomModel room.basic.service.timing { + + import room.basic.types.* from "Types.room" + + async ActorClass ATimingService { + Interface { + SPP timer: PTimer + } + Structure { + usercode1 { + "#include\"osal/etTime.h\"" + "#define ET_NB_OF_TCBS 30" + "typedef struct etTCB etTimerControlBlock;" + "struct etTCB{" + "etTime expTime;" + "etTime pTime;" + "int32 portIdx;" + "etTimerControlBlock*next;" + " };" + } + usercode2 { + "/*uc2*/" + } + usercode3 { + "/*uc3*/" + } + ServiceImplementation of timer + Attribute tcbs [30]: tcb + Attribute usedTcbsRoot: tcb ref + Attribute freeTcbsRoot: tcb ref + } + Behavior { + Operation getTcb(): tcb ref { + "etTimerControlBlock*temp=freeTcbsRoot;" + "" + "if(freeTcbsRoot!=0){" + "freeTcbsRoot=freeTcbsRoot->next;" + "temp->next=0;" + " }" + "return temp;" + } + Operation returnTcb(block: tcb ref) { + "block->next=freeTcbsRoot;" + "freeTcbsRoot=block;" + } + Operation removeTcbFromUsedList(idx: int32) { + "etTimerControlBlock*temp=usedTcbsRoot;" + "etTimerControlBlock*temp2=usedTcbsRoot;" + "" + "if(temp==0)return;" + "" + "if(usedTcbsRoot->portIdx==idx){" + " /*element found,the first one*/" + "usedTcbsRoot=usedTcbsRoot->next;" + "returnTcb(temp);" + "return;" + "}" + "" + "temp=temp->next;" + "while(temp!=0){" + "if(temp->portIdx==idx){" + "temp2->next=temp->next;" + "returnTcb(temp);" + "return;" + "}else{" + " /*try next*/" + "temp2=temp;" + "temp=temp->next;" + " }" + "}" + } + Operation putTcbToUsedList(block: tcb ref) { + "etTimerControlBlock*temp=usedTcbsRoot;" + "etTimerControlBlock*temp2=usedTcbsRoot;" + "" + "if(temp==0){" + " /*list empty put new block to root*/" + "block->next=0;" + "usedTcbsRoot=block;" + "return;" + " }" + "" + "while(1){" + "if(temp!=0){" + "if(isTimeGreater(&block->expTime,&temp->expTime)){" + " /*try next position*/" + "temp2=temp;" + "temp=temp->next;" + " }else{" + " /*right position found*/" + "block->next=temp;" + "if(temp==usedTcbsRoot){" + "usedTcbsRoot=block;" + " }else{" + "temp2->next=block;" + " }" + "return;" + " }" + " }else{" + " /*end of list reached*/" + "block->next=0;" + "temp2->next=block;" + "return;" + " }" + "}" + } + Operation isTimeGreater(t1: targetTime ref, t2: targetTime ref): boolean { + "if(t1->sec>t2->sec)return ET_TRUE;" + "if(t1->sec<t2->sec)return ET_FALSE;" + "if(t1->nSec>t2->nSec)return ET_TRUE;" + "return ET_FALSE;" + } + Operation addTime(t1: targetTime ref, t2: targetTime ref) { + "t1->sec+=t2->sec;" + "t1->nSec+=t2->nSec;" + "while(t1->nSec>=1000000000L){" + "t1->sec++;" + "t1->nSec-=1000000000L;" + "}" + } + StateMachine { + Transition tr0: initial -> Operational { + action { + "int i;" + "usedTcbsRoot=0;" + "freeTcbsRoot=&tcbs[0];" + "tcbs[ET_NB_OF_TCBS-1].next=0;" + "for(i=0;i<ET_NB_OF_TCBS-1;i++){" + "\ttcbs[i].next=&tcbs[i+1];" + "\t}" + } + } + Transition tr1: Operational -> Operational { + triggers { + <startTimeout: timer> + } + action { + "etTimerControlBlock*timer=getTcb();" + "etTime t;" + "if(timer!=0){" + "\tt.sec=time/1000;" + "\tt.nSec=(time%1000)*1000000L;" + "\ttimer->pTime.sec=0;" + "\ttimer->pTime.nSec=0;" + "\ttimer->portIdx=((etReplSubPort*)ifitem)->index;" + "\tgetTimeFromTarget(&(timer->expTime));" + "\taddTime(&(timer->expTime),&t);" + "\tputTcbToUsedList(timer);" + "\t}" + } + } + Transition tr3: Operational -> Operational { + triggers { + <startTimer: timer> + } + action { + "etTimerControlBlock*timer=getTcb();" + "etTime t;" + "if(timer!=0){" + "\tt.sec=time/1000;" + "\tt.nSec=(time%1000)*1000000L;" + "\ttimer->pTime=t;" + "\ttimer->portIdx=((etReplSubPort*)ifitem)->index;" + "\tgetTimeFromTarget(&(timer->expTime));" + "\taddTime(&(timer->expTime),&t);" + "\tputTcbToUsedList(timer);" + "\t}" + } + } + Transition tr4: Operational -> Operational { + triggers { + <kill: timer> + } + action { + "removeTcbFromUsedList(((etReplSubPort*)ifitem)->index);" + } + } + State Operational { + entry { + "/*prepare*/" + } + do { + "/*maintain timers*/" + "etTimerControlBlock*temp;" + "etTime t;" + "" + "getTimeFromTarget(&t);" + "while(usedTcbsRoot!=0){" + "\tif(isTimeGreater(&t,&(usedTcbsRoot->expTime))){" + "\t\ttimer[usedTcbsRoot->portIdx].timeout();" + "\t\ttemp=usedTcbsRoot;" + "\t\tusedTcbsRoot=usedTcbsRoot->next;" + "\t\tif((temp->pTime.sec==0)&&(temp->pTime.nSec==0)){" + "\t\t\t/*single shot timer*/" + "\t\t\treturnTcb(temp);" + "\t\t}else{" + "\t\t\t/*periodic timer*/" + "\t\t\taddTime(&temp->expTime,&temp->pTime);" + "\t\t\tputTcbToUsedList(temp);" + "\t\t\t}" + "\t\t}else{" + "\t\t\tbreak;" + "\t\t\t}" + "\t}" + } + } + } + } + } + + ProtocolClass PTimer { + usercode1 { + "#define ET_TIMER_RUNNING 0x01" + "#define ET_TIMER_PERIODIC 0x02" + } + usercode2 { + "/*uc2*/" + } + incoming { + Message startTimer(time: uint32) + Message startTimeout(time: uint32) + Message kill() + } + outgoing { + Message timeout() + } + conjugated PortClass + { + handle incoming startTimer { + "if(status==0){" + "status=ET_TIMER_RUNNING|ET_TIMER_PERIODIC;" + "etPort_sendMessage(self,PTimer_IN_startTimer,sizeof(int32),&data__et);" + "}" + } + handle incoming startTimeout { + "if(status==0){" + "status=ET_TIMER_RUNNING;" + "etPort_sendMessage(self,PTimer_IN_startTimeout,sizeof(int32),&data__et);" + "}" + } + handle outgoing timeout { + "/*TODO:clear active bit in case of single shot timer*/" + "if(status!=0){" + "if(status==ET_TIMER_RUNNING){" + " /*single shot timer*/" + "status=0;" + " }" + " /*msg to fsm*/" + " (*receiveMessageFunc)(actor,self,msg);" + "}" + } + handle incoming kill { + "if(status!=0){" + "status=0;" + "etPort_sendMessage(self,PTimer_IN_kill,0,NULL);" + "}" + } + Attribute status: int8 = "0" + } + } + ExternalType tcb -> "etTimerControlBlock" default "{{0,0},{0,0},0,NULL}" + ExternalType targetTime -> "etTime" default "{0,0}" +}
\ No newline at end of file |