K.I.T.T. Scanner (Knight Rider) http://mbed.org/users/okini3939/programs/KittScanner_sample/latest

Revision:
1:bb116abfe905
Parent:
0:9d29ea3f1886
--- a/KITTScanner.cpp	Mon Oct 18 14:27:30 2010 +0000
+++ b/KITTScanner.cpp	Sat Jul 16 16:17:57 2011 +0000
@@ -7,72 +7,105 @@
 #include "mbed.h"
 #include "KITTScanner.h"
 
-PwmOut led[] = {
-    PwmOut(LED1),
-    PwmOut(LED2),
-    PwmOut(LED3),
-    PwmOut(LED4)
-};
+KITTScanner::KITTScanner () {
+    led[0] = new PwmOut(LED1);
+    led[1] = new PwmOut(LED2);
+    led[2] = new PwmOut(LED3);
+    led[3] = new PwmOut(LED4);
+    newflg = 1;
+}
 
-//KITTScanner::KITTScanner () : led{LED1, LED2, LED3, LED4} {
-/*
-KITTScanner::KITTScanner () {
-    new(led + 0) PwmOut(LED1);
-    new(led + 1) PwmOut(LED2);
-    new(led + 2) PwmOut(LED3);
-    new(led + 3) PwmOut(LED4);
-*/
-KITTScanner::KITTScanner () {
+KITTScanner::KITTScanner (PwmOut &led1, PwmOut &led2, PwmOut &led3, PwmOut &led4) {
+    led[0] = &led1;
+    led[1] = &led2;
+    led[2] = &led3;
+    led[3] = &led4;
+    newflg = 0;
+}
+
+KITTScanner::~KITTScanner () {
+    int i;
+
+    stop(1);
+    if (newflg) {
+        for (i = 0; i < 4; i ++) {
+            delete led[i];
+        }
+    }
 }
 
 void KITTScanner::start (float speed) {
-	int i;
+    int i;
 
-	for (i = 0; i < 4; i ++)
-		bright[i] = 0.0;
-	num = 0;
-	kill = 0;
-	ticker.attach(this, &KITTScanner::int_KITTScanner, speed / 6.0);
+    for (i = 0; i < 4; i ++) {
+        bright[i] = 0;
+    }
+    num = 0;
+    quit = 0;
+    ticker.attach(this, &KITTScanner::int_KITTScanner, speed / 6.0);
 }
 
 void KITTScanner::stop (int flg) {
-	int i;
+    int i;
 
-	if (flg) {
-		ticker.detach();
-		for (i = 0; i < 4; i ++)
-			led[i] = 0.0;
-	} else {
-		kill = 1;
-	}
+    if (flg) {
+        // fast stop
+        ticker.detach();
+        for (i = 0; i < 4; i ++) {
+            *led[i] = 0;
+        }
+    } else {
+        // slow stop
+        quit = 1;
+    }
 }
 
 void KITTScanner::int_KITTScanner () {
-	int i, flg;
+    int i, flg;
+
+    for (i = 0; i < 4; i ++) {
+        *led[i] = bright[i];
 
-	for (i = 0; i < 4; i ++) {
-		led[i] = bright[i];
-		bright[i] = bright[i] / 3.0;
-		if (bright[i] < (1.0 / 3.0 / 3.0)) bright[i] = 0.0;
-	}
+        // fade out
+        bright[i] = bright[i] / 3.0;
+        if (bright[i] < (1.0 / 3.0 / 3.0)) {
+            bright[i] = 0;
+        }
+    }
+
+    if (! quit) {
+        // scan
 
-	if (! kill) {
-		if (num >= 0) {
-			bright[num] = 1.0;
-			num ++;
-			if (num > 3) num = -2;
-		} else {
-			bright[- num] = 1.0;
-			num ++;
-		}
-	} else {
-		flg = 0;
-		for (i = 0; i < 4; i ++)
-			if (bright[i] > 0) flg = 1;
-		if (! flg) {
-			ticker.detach();
-		    for (i = 0; i < 4; i ++)
-			    led[i] = 0.0;
-	    }
-	}
+        if (num >= 0) {
+            // right
+            bright[num] = 1.0;
+            num ++;
+            if (num > 3) {
+                num = -2;
+            }
+        } else {
+            // left
+            bright[- num] = 1.0;
+            num ++;
+        }
+
+    } else {
+        // slow stop
+
+        flg = 0;
+        for (i = 0; i < 4; i ++) {
+            if (bright[i] > 0) {
+                flg = 1;
+                break;
+            }
+        }
+        if (! flg) {
+            // all led off
+            ticker.detach();
+            for (i = 0; i < 4; i ++) {
+                *led[i] = 0;
+            }
+        }
+
+    }
 }