]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/dope/server/common/relax.c
Inital import
[l4.git] / l4 / pkg / dope / server / common / relax.c
1 /*
2  * \brief   DOpE relaxation module
3  * \date    2004-08-20
4  * \author  Norman Feske <nf2@inf.tu-dresden.de>
5  */
6
7 /*
8  * Copyright (C) 2002-2004  Norman Feske  <nf2@os.inf.tu-dresden.de>
9  * Technische Universitaet Dresden, Operating Systems Research Group
10  *
11  * This file is part of the DOpE package, which is distributed under
12  * the  terms  of the  GNU General Public Licence 2.  Please see the
13  * COPYING file for details.
14  */
15
16 #include "dopestd.h"
17 #include "relax.h"
18
19 int init_relax(struct dope_services *d);
20
21
22 /*************************
23  *** SERVICE FUNCTIONS ***
24  *************************/
25
26 /*** DEFINE DURATION OF RELAXATION PROCESS ***/
27 static void set_duration(RELAX *r, float time) {
28         float delta = (r->curr > r->dst) ? r->curr - r->dst : r->dst - r->curr;
29         if (time == 0) time = 0.00001;
30         r->accel = 4*delta/(time*time);
31
32         /* assure an acceleration of at least 1.0 */
33         if (r->accel < 1.0) r->accel = 1.0;
34 }
35
36
37 /*** DO A RELAXATION ITERATION ***/
38 static int relax_do_relax(RELAX *r) {
39         float delta;
40
41         /* destination value reached? */
42         if (r->curr == r->dst) {
43                 r->speed = 0;
44                 return 0;
45         }
46
47         /* change value with current speed */
48         if (r->curr > r->dst) {
49                 r->curr -= r->speed;
50                 if (r->curr < r->dst) r->curr = r->dst;
51         } else {
52                 r->curr += r->speed;
53                 if (r->curr > r->dst) r->curr = r->dst;
54         }
55
56         /* adapt speed */
57         delta = r->curr - r->dst;
58         if (delta < 0) delta = -delta;
59
60         if (r->speed * r->speed < delta * r->accel)
61                 r->speed += r->accel;
62         else
63                 r->speed -= r->accel;
64
65         if (r->speed < 1) r->speed = 1;
66
67         return 1;  /* relaxation in progress */
68 };
69
70
71 /****************************************
72  *** SERVICE STRUCTURE OF THIS MODULE ***
73  ****************************************/
74
75 static struct relax_services services = {
76         set_duration,
77         relax_do_relax,
78 };
79
80
81 /**************************
82  *** MODULE ENTRY POINT ***
83  **************************/
84
85 int init_relax(struct dope_services *d) {
86         d->register_module("Relax 1.0", &services);
87         return 1;
88 }