Shinichiro Nakamura
/
Drive2ChoroQ
This is a demonstration of two Choro Q Hybrid cars.
Diff: main.cpp
- Revision:
- 0:d825f8dae2be
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Nov 22 12:23:23 2010 +0000 @@ -0,0 +1,164 @@ +/** + * 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 "appconf.h" + +/* + * Objects. + */ + +WiiNunchuckReader wn1(I2CPort_A::SDA, I2CPort_A::SCL); +WiiNunchuckReader wn2(I2CPort_B::SDA, I2CPort_B::SCL); +ChoroQ cq(p21); +BusOut led(LED4, LED3, LED2, LED1); + +/** + * Display a splash screen. + */ +void splash(void) { + // Do nothing. +} + +/** + * 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(); + + /* + * Setup a configuration. + */ + appconf_t conf; + appconf_init(&conf); + if (appconf_read(&conf) != 0) { + error("Please check the configuration."); + } + + /* + * Application loop. + */ + while (true) { + led = led + 1; + wn1.RequestRead(); + ChoroQ::Action ac1 = getAction(wn1.getJoyX(), wn1.getJoyY(), (wn1.getButtonZ() == 1) ? true : false); + cq.execute(conf.ch1, ac1, false); + wait_ms(25); + + led = led + 1; + wn2.RequestRead(); + ChoroQ::Action ac2 = getAction(wn2.getJoyX(), wn2.getJoyY(), (wn2.getButtonZ() == 1) ? true : false); + cq.execute(conf.ch2, ac2, false); + wait_ms(25); + } +}