freetype CRANE == { ToDepositBelt, ToFeedBelt, cIdle } typealias GRIPPER == FLOAT static function OnDepositBelt == 0.9230 static function SafeDistanceFromFeedBelt == 0.0 static function OnFeedBelt == 0.6593 dynamic function CraneHorizontalMot : CRANE initially cIdle dynamic function CraneVerticalMot : UP_DOWN initially udIdle dynamic function CraneMagnet : ON_OFF initially Off output function GripperOverDepositBelt : BOOL output function GripperOverFeedBelt : BOOL output function GripperVerticalPos : GRIPPER derived relation WaitingToUnloadDepositBelt == GripperOverDepositBelt and GripperVerticalPos >= OnDepositBelt and CraneHorizontalMot = cIdle and CraneVerticalMot = udIdle and CraneMagnet = Off derived relation WaitingToLoadFeedBelt == GripperOverFeedBelt and GripperVerticalPos = SafeDistanceFromFeedBelt and CraneHorizontalMot = cIdle and CraneVerticalMot = udIdle and CraneMagnet = On transition WAITING_DB == if WaitingToUnloadDepositBelt and PieceAtDepositBeltEnd then CraneMagnet := On endif transition UNLOADING_DB == if CraneVerticalMot = udIdle and GripperVerticalPos >= OnDepositBelt and CraneMagnet = On then CraneVerticalMot := Up endif if CraneVerticalMot = Up and GripperVerticalPos = SafeDistanceFromFeedBelt then CraneVerticalMot := udIdle CraneHorizontalMot := ToFeedBelt PieceAtDepositBeltEnd := false endif transition MOVING_FB == if CraneHorizontalMot = ToFeedBelt and GripperOverFeedBelt then CraneHorizontalMot := cIdle endif transition WAITING_FB == if WaitingToLoadFeedBelt and FeedBeltFree then CraneVerticalMot := Down endif transition LOADING_FB == if CraneVerticalMot = Down and GripperVerticalPos >= OnFeedBelt and GripperOverFeedBelt then CraneVerticalMot := udIdle CraneMagnet := Off endif if CraneVerticalMot = udIdle and GripperVerticalPos >= OnFeedBelt and GripperOverFeedBelt and CraneHorizontalMot = cIdle and CraneMagnet = Off then CraneHorizontalMot := ToDepositBelt FeedBeltFree := false endif transition MOVING_DB == if CraneHorizontalMot = ToDepositBelt and GripperOverDepositBelt then CraneHorizontalMot := cIdle CraneVerticalMot := Down endif if GripperOverDepositBelt and CraneVerticalMot = Down and GripperVerticalPos >= OnDepositBelt then CraneVerticalMot := udIdle endif