// ************************************************************************** //
//                                                                            //
//    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                                             //
//                                                                            //
// ************************************************************************** //
// This is a two-dimensional bouncing ball. The ball has position (x1,x2) and //
// velocity (v1,v2) that are initially (x10,x20) and (v10,v20). Each time the //
// height x2 is zero, the vertical speed v2 changes its sign and looses some  //
// energy. The horizontal speed is decreased by a constant wind.              //
// ************************************************************************** //

macro wind = -5.0;
macro gravity = 9.8;

module Ball2D(real ?x10,?x20,?v10,?v20,?wind0,int n) {
    hybrid real x1,x2,v1,v2;
    // initial values
    x1 = x10;
    x2 = x20;
    v1 = v10;
    v2 = v20;
    pause;

    while(true) {
        // continuous flow
        flow{
            drv(x1) <- v1;
            drv(x2) <- v2;
            drv(v1) <- wind;
            drv(v2) <- -gravity;
        } until(cont(x2)<=0.0);
        // bounce on the floor
        next(v2) = -0.5*v2;
        next(n) = n+1;
        pause;
    }
}