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

KITTScanner.cpp

Committer:
okini3939
Date:
2011-07-16
Revision:
1:bb116abfe905
Parent:
0:9d29ea3f1886

File content as of revision 1:bb116abfe905:

/*
 * mbed library for K.I.T.T. Scanner
 * Copyright (c) 2010 Hiroshi Suga
 * Released under the MIT License: http://mbed.org/license/mit
 */
 
#include "mbed.h"
#include "KITTScanner.h"

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 (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;

    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;

    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;

    for (i = 0; i < 4; i ++) {
        *led[i] = bright[i];

        // fade out
        bright[i] = bright[i] / 3.0;
        if (bright[i] < (1.0 / 3.0 / 3.0)) {
            bright[i] = 0;
        }
    }

    if (! quit) {
        // scan

        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;
            }
        }

    }
}