ヌンチャクでコントロールするチョロQ機能に限定した物です。

Fork of StarBoardOrangeExample3 by Shinichiro Nakamura

main.cpp

Committer:
shintamainjp
Date:
2010-09-20
Revision:
1:03c8bc666945
Parent:
0:127b9ca59547
Child:
2:1d9c1cd90695

File content as of revision 1:03c8bc666945:

/**
 * StarBoard Orange - Example application No.3 (Version 0.0.1)
 * Drive a CHORO Q HYBRID with wii nunchuk
 *
 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example3_ja/
 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example3_en/
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */

/*
 * Connection map.
 *
 * +---+----------------+---------+
 * |Pin|Target          |Direction|
 * +---+----------------+---------+
 * |p21|IR transmitter  |OUT      |
 * +---+----------------+---------+
 */

/*
 * Include files.
 */

#include <mbed.h>
#include <algorithm>
#include <ChoroQ.h>
#include <I2CConfig.h>
#include <WiiNunchuckReader.h>
#include <TextLCD.h>
#include "appconf.h"

/*
 * Objects.
 */

WiiNunchuckReader wn(I2CPort_A::SDA, I2CPort_A::SCL);
ChoroQ cq(p21);
TextLCD lcd(p24, p26, p27, p28, p29, p30);
BusOut led(LED4, LED3, LED2, LED1);

/**
 * Display a splash screen.
 */
void splash(void) {
    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("StarBoard Orange");
    lcd.locate(0, 1);
    lcd.printf("mbed NXP LPC1768");
    wait(3);

    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("Example app No.3");
    lcd.locate(0, 1);
    lcd.printf(" CHORO Q HYBRID ");
    wait(3);
}

/**
 * Get an action from a coordinate.
 *
 * @param x X axis.
 * @param y Y axis.
 * @param dash State of dash.
 *
 * @return An action.
 */
ChoroQ::Action getAction(const int x, const int y, bool dash) {
    static const int MAX_X = 200;
    static const int MIN_X = 20;
    static const int MAX_Y = 200;
    static const int MIN_Y = 20;
    int px = ((x - MIN_X) * 100) / (MAX_X - MIN_X);
    int py = ((y - MIN_Y) * 100) / (MAX_Y - MIN_Y);
    px = std::max(0, std::min(100, px)) - 50;   // Range of a value is -50 to +50
    py = std::max(0, std::min(100, py)) - 50;   // Range of a value is -50 to +50

    if ((std::abs(px) <= 10) && (std::abs(py) <= 10)) {
        return ChoroQ::Stop;
    }

    if ((x == 0) && (y == 0)) {
        return ChoroQ::Stop;
    }

    if (std::abs(px) < 10) {
        if (py < 0) {
            if (dash) {
                return ChoroQ::DownDash;
            } else {
                return ChoroQ::Down;
            }
        } else {
            if (dash) {
                return ChoroQ::UpDash;
            } else {
                return ChoroQ::Up;
            }
        }
    }
    if (std::abs(py) < 10) {
        if (px < -20) {
            return ChoroQ::Left;
        }
        if (20 < px) {
            return ChoroQ::Right;
        }
    }
    if ((10 < px) && (10 < py)) {
        if (dash) {
            return ChoroQ::UpRightDash;
        } else {
            return ChoroQ::UpRight;
        }
    }
    if ((px < -10) && (10 < py)) {
        if (dash) {
            return ChoroQ::UpLeftDash;
        } else {
            return ChoroQ::UpLeft;
        }
    }
    if ((px < -10) && (py < -10)) {
        if (dash) {
            return ChoroQ::DownLeftDash;
        } else {
            return ChoroQ::DownLeft;
        }
    }
    if ((10 < px) && (py < -10)) {
        if (dash) {
            return ChoroQ::DownRightDash;
        } else {
            return ChoroQ::DownRight;
        }
    }
    return ChoroQ::Stop;
}

/**
 * Entry point.
 */
int main() {
    /*
     * Splash.
     */
    splash();
    lcd.cls();

    /*
     * Setup a configuration.
     */
    appconf_t conf;
    appconf_init(&conf);
    appconf_read(&conf);

    /*
     * Application loop.
     */
    while (true) {
        wn.RequestRead();

        ChoroQ::Action ac = getAction(wn.getJoyX(), wn.getJoyY(), (wn.getButtonZ() == 1) ? true : false);
        cq.execute(conf.channel, ac);

        lcd.locate(0, 0);
        lcd.printf("JS  :(%3d,%3d) %s", wn.getJoyX(), wn.getJoyY(), ((wn.getButtonZ() == 1) ? "D" : " "));

        char *stattext = "";
        switch (ac) {
            case ChoroQ::Undef:
                stattext = "Undef";
                break;
            case ChoroQ::Up:
                stattext = "Up";
                break;
            case ChoroQ::Down:
                stattext = "Down";
                break;
            case ChoroQ::Left:
                stattext = "Left";
                break;
            case ChoroQ::Right:
                stattext = "Right";
                break;
            case ChoroQ::UpDash:
                stattext = "Up       +D";
                break;
            case ChoroQ::UpLeft:
                stattext = "UpLeft";
                break;
            case ChoroQ::UpRight:
                stattext = "UpRight";
                break;
            case ChoroQ::UpRightDash:
                stattext = "UpRight  +D";
                break;
            case ChoroQ::UpLeftDash:
                stattext = "UpLeft   +D";
                break;
            case ChoroQ::DownLeft:
                stattext = "DownLeft";
                break;
            case ChoroQ::DownRight:
                stattext = "DownRight";
                break;
            case ChoroQ::DownDash:
                stattext = "Down     +D";
                break;
            case ChoroQ::DownLeftDash:
                stattext = "DownLeft +D";
                break;
            case ChoroQ::DownRightDash:
                stattext = "DownRight+D";
                break;
            case ChoroQ::Stop:
                stattext = "Stop";
                break;
        }
        lcd.locate(0, 1);
        lcd.printf("Ch.%c:%-11.11s", 'A' + (int)conf.channel, stattext);

        wait_ms(50);
        led = led + 1;
    }
}