// **************************************************************************
//
//    eses                   eses
//   eses                     eses
//  eses    eseses  esesese    eses   Embedded Systems Group
//  ese    ese  ese ese         ese
//  ese    eseseses eseseses    ese   Department of Computer Science
//  eses   eses          ese   eses
//   eses   eseses  eseseses  eses    University of Kaiserslautern
//    eses                   eses
//
// **************************************************************************
// Controller2 adapts
the time intervals according to the proximity to the 
// landing point.
// 
// The example has been taken from the following reference:
// @phdthesis{Baue12,
//   key         ={Baue12},
//   author      ={K. Bauer},
//   title       ={A New Modelling Language for Cyber-physical Systems},
//   address     ={Kaiserslautern, Germany},
//   editor      ={K. Schneider and R. Majumdar},
//   month       ={January},
//   school      ={Department of Computer Science, University of Kaiserslautern, Germany},
//   year        ={2012},
//   note        ={PhD},
//   remark      ={rsg}
// }
// ******************************************************************************


macro v = 5.0;

module Controller2(
    hybrid real ?boatX, ?boatY,
    hybrid real !motorX, !motorY,
    real ?accuracy, ?landingX, ?landingY, len,
    bool ?landingReached
) {
    real diffX, diffY, len;
    hybrid real t;
    while (not landingReached){
        diffX = landingX − boatX;
        diffY = landingY − boatY;
        len = (exp(exp(diffX,2) + exp(diffY,2),0.5));
        next(motorX) = (diffX / len) ∗ v;
        next(motorY) = (diffY / len) ∗ v;
        flow{}until(true);
        t = 0.0;
        flow{
            drv(t)<−1.0;
        } until (cont(t) >= (len/v));// The release condition is different from Controller1
    }
    loop{
        pause;
    }
}