Extend Motordriver library

Fork of Motordriver by Christopher Hasler

Revision:
1:3da7302dc9ae
Parent:
0:edc152f119b7
Child:
2:2dc873322032
--- a/motordriver.cpp	Sat Nov 06 13:05:17 2010 +0000
+++ b/motordriver.cpp	Thu Nov 11 15:32:55 2010 +0000
@@ -1,35 +1,35 @@
- /*motor driver libary modified from the following libary,
- *  
- * mbed simple H-bridge motor controller
- * Copyright (c) 2007-2010, sford
- * 
- * by Christopher Hasler.
- * 
- * from sford's libary,
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
+/*motor driver libary modified from the following libary,
+*
+* mbed simple H-bridge motor controller
+* Copyright (c) 2007-2010, sford
+*
+* by Christopher Hasler.
+*
+* from sford's libary,
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*/
 
 #include "motordriver.h"
- 
+
 #include "mbed.h"
- 
+
 Motor::Motor(PinName pwm, PinName fwd, PinName rev, int brakeable):
         _pwm(pwm), _fwd(fwd), _rev(rev) {
 
@@ -40,21 +40,53 @@
     // Initial condition of output enables
     _fwd = 0;
     _rev = 0;
-    
+
     //set if the motor dirver is capable of braking. (addition)
     Brakeable= brakeable;
+    sign = 0;//i.e nothing.
 }
- 
+
 void Motor::speed(float speed) {
-    _fwd = (speed > 0.0);
-    _rev = (speed < 0.0);
-    _pwm = abs(speed);
+    if (sign == 0) {
+        _fwd = (speed > 0.0);
+        _rev = (speed < 0.0);
+        _pwm = abs(speed);
+    } else if (sign == 1) {
+        if (speed < 0) {
+            _fwd = (speed > 0.0);
+            _rev = (speed < 0.0);
+            _pwm = 0;
+        } else {
+            _fwd = (speed > 0.0);
+            _rev = (speed < 0.0);
+            _pwm = abs(speed);
+        }
+    } else if (sign == -1) {
+        if (speed > 0) {
+            _fwd = (speed > 0.0);
+            _rev = (speed < 0.0);
+            _pwm = 0;
+        } else {
+            _fwd = (speed > 0.0);
+            _rev = (speed < 0.0);
+            _pwm = abs(speed);
+        }
+    }
+    if (speed > 0)
+        sign = 1;
+    else if (speed < 0) {
+        sign = -1;
+    } else if (speed == 0) {
+        sign = 0;
+    }
+
 }
 //  (additions)
 void Motor::coast(void) {
     _fwd = 0;
     _rev = 0;
     _pwm = 0;
+    sign = 0;
 }
 
 void Motor::stop(void) {
@@ -62,20 +94,20 @@
         _fwd = 1;
         _rev = 1;
         _pwm = 0.5;
-    }
-    else
-    return;
+        sign = 0;
+    } else
+        return;
 }
-        
+
 /*
  test code, this demonstrates working motor drivers.
- 
-Motor A(p22, p6, p5, 1); // pwm, fwd, rev, can break 
+
+Motor A(p22, p6, p5, 1); // pwm, fwd, rev, can break
 Motor B(p21, p7, p8, 1); // pwm, fwd, rev, can break
 int main() {
     for (float s=-1.0; s < 1.0 ; s += 0.01) {
-       A.speed(s); 
-       B.speed(s); 
+       A.speed(s);
+       B.speed(s);
        wait(0.02);
     }
     A.stop();