scchart Tut1 { int counter = 0; int khcounter = 0; bool second = false; bool start = false; int ic_st_1_0 = 0; int kh_st_2_0 = 0; int kio_ln_0_1; int ic_ln_0_0; int ic_ln_5_0; bool khTrain = false; bool icTrain = false; int kh_ic_st_1_0 = 0; kh2Train = false; region KHcontroller: initial state init2 --> driving_khTrain immediate with /'settrack(railway, KH_ST_2, REV, 100)';'settrack(railway, KH_ST_0, REV, 100)';'settrack(railway, KIO_LN_0, REV, 100)';'settrack(railway, OC_ST_4, REV, 100)';'settrack(railway, OC_ST_0, REV, 100)';'settrack(railway, KIO_LN_1, REV, 100)';'settrack(railway, KH_ST_6, REV, 100)';'setpoint(railway, 4, BRANCH)';'setpoint(railway, 3, STRAIGHT)';'setpoint(railway, 2, STRAIGHT)';'setpoint(railway, 1, BRANCH)';'setpoint(railway, 8, BRANCH)';'setpoint(railway, 7, BRANCH)';'setpoint(railway, 0, BRANCH)';'setpoint(railway, 9, BRANCH)';'setpoint(railway, 16, BRANCH)';'setpoint(railway, 17, BRANCH)';'setpoint(railway, 27, STRAIGHT)';'setpoint(railway, 28, STRAIGHT)';'setpoint(railway, 18, BRANCH)'; state driving_khTrain --> khWaitForPoint immediate with /kio_ln_0_1='getcontact(railway, KIO_LN_0, 1 ,1)'; state khWaitForPoint --> khPoint18 immediate with kio_ln_0_1/icTrain='trackused(railway, IC_LN_5)' --> driving_khTrain; state khPoint18 --> slowdownPoint18 immediate with icTrain&&('getpoint(railway,18)'==0)/'settrack(railway, KIO_LN_0, FWD, 40)' --> notrain_ic_st_1_0 immediate with /'setpoint(railway, 18, BRANCH)'; state slowdownPoint18 --> stopKHPoint18 immediate with /kio_ln_0_1='getcontact(railway, KIO_LN_0, 1 ,1)'; state stopKHPoint18 --> waitForKHPoint18 immediate with kio_ln_0_1/'settrack(railway, KIO_LN_0, BRAKE, 0)' --> slowdownPoint18; state waitForKHPoint18 --> notrain_ic_st_1_0 immediate with 'getpoint(railway, 18)'==1/'settrack(railway, KIO_LN_0, FWD, 100)'; state notrain_ic_st_1_0 --> check_ic_st_1_0 immediate with /kh_ic_st_1_0='getcontact(railway, IC_ST_1, 0, 1)'; state check_ic_st_1_0 --> ICfirstcontact immediate with (kh_ic_st_1_0 > 0)/'setpoint(railway, 18, STRAIGHT)';'settrack(railway, IC_ST_1, FWD, 40)';'setpoint(railway, 18, STRAIGHT)' --> notrain_ic_st_1_0; state ICfirstcontact --> check_again_ic_st_1_0 immediate with /kh_ic_st_1_0='getcontact(railway, IC_ST_1, 0, 1)'; state check_again_ic_st_1_0 --> ICwait immediate with (kh_ic_st_1_0 > 0)/'settrack(railway, IC_ST_1, BRAKE, 0)';khcounter=0 --> ICfirstcontact; state ICwait --> notrain_kh_st_2_0 with khcounter==10/'settrack(railway, IC_ST_1, FWD, 100)';'setpoint(railway, 29, BRANCH)' --> ICwait with second/khcounter=khcounter+1; state notrain_kh_st_2_0 --> check_kh_st_2_0 immediate with /kh_st_2_0='getcontact(railway, KH_ST_2, 1, 1)'; state check_kh_st_2_0 --> KHfirstcontact immediate with (kh_st_2_0 > 0)/'settrack(railway, KH_ST_2, REV, 40)' --> notrain_kh_st_2_0; state KHfirstcontact --> check_again_kh_st_2_0 immediate with /kh_st_2_0='getcontact(railway, KH_ST_2, 1, 1)'; state check_again_kh_st_2_0 --> KHwait immediate with (kh_st_2_0 > 0)/'settrack(railway, KH_ST_2, BRAKE, 0)';khcounter=0 --> KHfirstcontact; state KHwait --> driving_khTrain with khcounter==10/'settrack(railway, KH_ST_2, REV, 100)' --> KHwait with second/khcounter=khcounter+1; region ICcontroller: initial state init --> driving_icTrain immediate with /'settrack(railway, IC_ST_1, FWD, 100)';'settrack(railway, IC_ST_0, FWD, 100)';'settrack(railway, IC_LN_0, FWD, 100)';'settrack(railway, IC_LN_1, FWD, 100)';'settrack(railway, IC_LN_2, FWD, 100)';'settrack(railway, IC_LN_3, FWD, 100)';'settrack(railway, IC_LN_4, FWD, 100)';'settrack(railway, IC_JCT_0, FWD, 100)';'settrack(railway, IC_LN_5, FWD, 100)';'settrack(railway, IC_ST_4, FWD, 100)';'setpoint(railway, 18, STRAIGHT)';'setpoint(railway, 20, STRAIGHT)';'setpoint(railway, 24, STRAIGHT)';'setpoint(railway, 29, STRAIGHT)'; state driving_icTrain --> icWaitForPoint immediate with /ic_ln_5_0='getcontact(railway, IC_LN_5, 0 ,1)';'printf("wait for point 18")'; state icWaitForPoint --> icPoint18 immediate with ic_ln_5_0/khTrain='trackused(railway, KIO_LN_0)';kh2Train='trackused(railway, IC_ST_1)';'printf("At point 18")' --> driving_icTrain with /'printf("still waiting for point 18")'; state icPoint18 --> slowdownPoint18 immediate with kh2Train||(khTrain&&('getpoint(railway,18)'==1))/'settrack(railway, IC_LN_5, FWD, 40)';'printf("something is in the way")' --> notrain_ic_st_1_0 immediate with /'setpoint(railway, 18, STRAIGHT)';'printf("NOthing is in the way")'; state slowdownPoint18 --> stopICPoint18 immediate with /ic_ln_5_0='getcontact(railway, IC_LN_5, 0 ,1)';kh2Train='trackused(railway, IC_ST_1)'; state stopICPoint18 --> waitForPoint18 immediate with kh2Train||ic_ln_5_0/'settrack(railway, IC_LN_5, BRAKE, 0)' --> slowdownPoint18; state waitForPoint18 --> notrain_ic_st_1_0 immediate with (!'trackused(railway, IC_ST_1)')&&'getpoint(railway, 18)'==0/'settrack(railway, IC_LN_5, FWD, 100)'; state notrain_ic_st_1_0 --> check_ic_st_1_0 immediate with /ic_st_1_0='getcontact(railway, IC_ST_1, 0, 1)'; state check_ic_st_1_0 --> ICfirstcontact immediate with (ic_st_1_0 > 0)/'setpoint(railway, 18, BRANCH)';'settrack(railway, IC_ST_1, FWD, 40)' --> notrain_ic_st_1_0; state ICfirstcontact --> check_again_ic_st_1_0 immediate with /ic_st_1_0='getcontact(railway, IC_ST_1, 0, 1)'; state check_again_ic_st_1_0 --> ICwait immediate with (ic_st_1_0 > 0)/'settrack(railway, IC_ST_1, BRAKE, 0)';counter=0 --> ICfirstcontact; state ICwait --> leaveICstation with counter==10/'settrack(railway, IC_ST_1, FWD, 100)';'setpoint(railway, 29, STRAIGHT)' --> ICwait with second/counter=counter+1; state leaveICstation --> driving_icTrain with !'trackused(railway,IC_ST_1)'/'getcontact(railway, IC_LN_5, 0, 1)'; }