summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNicolas Schodet2012-02-11 16:22:57 +0100
committerNicolas Schodet2012-02-11 16:22:57 +0100
commitc3fe438f1b60f20f6f5425db895777ee5248637f (patch)
tree973cd7f87eac46f2ec6ac25a40cc252da09618f2
parent5a431895efe1c573c763a8e1197a011a36442837 (diff)
digital/mimot, digital/asserv: fix overflow in speed control code
When substracting two values, one extra bit is needed. Use an unsigned number to have this extra bit.
-rw-r--r--digital/asserv/src/asserv/speed.c20
-rw-r--r--digital/mimot/src/dirty/speed.c20
2 files changed, 28 insertions, 12 deletions
diff --git a/digital/asserv/src/asserv/speed.c b/digital/asserv/src/asserv/speed.c
index 5c221b7e..32102177 100644
--- a/digital/asserv/src/asserv/speed.c
+++ b/digital/asserv/src/asserv/speed.c
@@ -58,13 +58,21 @@ speed_init (void)
static void
speed_update_by_speed (struct speed_t *speed)
{
- /* Update current speed. */
- if (UTILS_ABS (speed->cons - speed->cur) < speed->acc)
- speed->cur = speed->cons;
- else if (speed->cons > speed->cur)
- speed->cur += speed->acc;
+ /* Update current speed (be careful of overflow!). */
+ if (speed->cons > speed->cur)
+ {
+ if ((uint16_t) (speed->cons - speed->cur) < (uint16_t) speed->acc)
+ speed->cur = speed->cons;
+ else
+ speed->cur += speed->acc;
+ }
else
- speed->cur -= speed->acc;
+ {
+ if ((uint16_t) (speed->cur - speed->cons) < (uint16_t) speed->acc)
+ speed->cur = speed->cons;
+ else
+ speed->cur -= speed->acc;
+ }
}
/** Compute maximum allowed speed according to: distance left, maximum speed,
diff --git a/digital/mimot/src/dirty/speed.c b/digital/mimot/src/dirty/speed.c
index f9d4193e..80ca3d6b 100644
--- a/digital/mimot/src/dirty/speed.c
+++ b/digital/mimot/src/dirty/speed.c
@@ -53,13 +53,21 @@ speed_init (void)
static void
speed_update_by_speed (struct speed_t *speed)
{
- /* Update current speed. */
- if (UTILS_ABS (speed->cons - speed->cur) < speed->acc)
- speed->cur = speed->cons;
- else if (speed->cons > speed->cur)
- speed->cur += speed->acc;
+ /* Update current speed (be careful of overflow!). */
+ if (speed->cons > speed->cur)
+ {
+ if ((uint16_t) (speed->cons - speed->cur) < (uint16_t) speed->acc)
+ speed->cur = speed->cons;
+ else
+ speed->cur += speed->acc;
+ }
else
- speed->cur -= speed->acc;
+ {
+ if ((uint16_t) (speed->cur - speed->cons) < (uint16_t) speed->acc)
+ speed->cur = speed->cons;
+ else
+ speed->cur -= speed->acc;
+ }
}
/** Compute maximum allowed speed according to: distance left, maximum speed,