// **************************************************************************
//
//    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
//
// ****************************************************************************
// The scenario consists of a moto boat on a lake modeled by a two-dimensional 
// space. The goal of the motor boat controller is to steer the boat towards
// a predefined point, e.g. a landing place. 
// The movement of the boat is determined by two factors:
//     1. the velocity induced by the motor.
//     2. the drift of the water.
// The model of the boat scenario consists of the following three components:
//     1. the water,
//     2. the boat itself, and
//     3. the boat controller / motor of the boat.
// To illustrate the interchangeability of the different components, we offer 
// two different versions
of the motor and three different versions of the 
// water environment, which can be considered in
arbitrary combinations.
// 
// 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}
// }
// 
// The following code combines the boat with the modules Water1 and Controller1.
// ******************************************************************************




macro landingX = 40.0;
macro landingY = 20.0;
macro accuracy = 0.1;

module BoatScenario(
    hybrid real motorX, motorY, waterX, waterY, boatX, boatY,
    bool landingReached
) {
    Boat(motorX, motorY, waterX, waterY, boatX, boatY,
    accuracy, landingX, landingY, landingReached);
    ||
    Water1(boatX, boatY, waterX, waterY);
    ||
    Controller1(boatX, boatY, motorX, motorY,
    accuracy, landingX, landingY, landingReached);
}