From c3fe438f1b60f20f6f5425db895777ee5248637f Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sat, 11 Feb 2012 16:22:57 +0100 Subject: 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. --- digital/asserv/src/asserv/speed.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'digital/asserv/src/asserv/speed.c') 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, -- cgit v1.2.3