![](/media/cache/profiles/5f14615696649541a025d3d0f8e0447f.jpg.50x50_q85.jpg)
ヌンチャクでコントロールするチョロQ機能に限定した物です。
Fork of StarBoardOrangeExample3 by
Diff: main.cpp
- Revision:
- 0:127b9ca59547
- Child:
- 1:03c8bc666945
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Aug 24 11:58:09 2010 +0000 @@ -0,0 +1,178 @@ +/** + * 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/ + */ + +#include <mbed.h> +#include <algorithm> +#include <RemoteIR.h> +#include <TransmitterIR.h> +#include <I2CConfig.h> +#include <WiiNunchuckReader.h> +#include <TextLCD.h> +#include "ChoroQ.h" + +WiiNunchuckReader wn(I2CPort_A::SDA, I2CPort_A::SCL); +ChoroQ cq(p21, ChoroQ::ChC); +TextLCD lcd(p24, p26, p27, p28, p29, p30); +BusOut led(LED4, LED3, LED2, LED1); + +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 (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) { +#if 0 + return ChoroQ::Left; +#else + if (dash) { + return ChoroQ::UpLeftDash; + } else { + return ChoroQ::UpLeft; + } +#endif + } + if (20 < px) { +#if 0 + return ChoroQ::Right; +#else + if (dash) { + return ChoroQ::UpRightDash; + } else { + return ChoroQ::UpRight; + } +#endif + } + } + 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; +} + +int main() { + lcd.cls(); + while (true) { + wn.RequestRead(); + + ChoroQ::Action ac = getAction(wn.getJoyX(), wn.getJoyY(), (wn.getButtonZ() == 1) ? true : false); + cq.execute(ac); + + lcd.locate(0, 0); + lcd.printf("(%3d,%3d) %-6.6s", wn.getJoyX(), wn.getJoyY(), ((wn.getButtonZ() == 1) ? "-Dash-" : " ")); + + lcd.locate(0, 1); + switch (ac) { + case ChoroQ::Undef: + lcd.printf("%-16.16s", "Undef"); + break; + case ChoroQ::Up: + lcd.printf("%-16.16s", "Up"); + break; + case ChoroQ::Down: + lcd.printf("%-16.16s", "Down"); + break; + case ChoroQ::Left: + lcd.printf("%-16.16s", "Left"); + break; + case ChoroQ::Right: + lcd.printf("%-16.16s", "Right"); + break; + case ChoroQ::UpDash: + lcd.printf("%-16.16s", "UpDash"); + break; + case ChoroQ::UpLeft: + lcd.printf("%-16.16s", "UpLeft"); + break; + case ChoroQ::UpRight: + lcd.printf("%-16.16s", "UpRight"); + break; + case ChoroQ::UpRightDash: + lcd.printf("%-16.16s", "UpRightDash"); + break; + case ChoroQ::UpLeftDash: + lcd.printf("%-16.16s", "UpLeftDash"); + break; + case ChoroQ::DownLeft: + lcd.printf("%-16.16s", "DownLeft"); + break; + case ChoroQ::DownRight: + lcd.printf("%-16.16s", "DownRight"); + break; + case ChoroQ::DownDash: + lcd.printf("%-16.16s", "DownDash"); + break; + case ChoroQ::DownLeftDash: + lcd.printf("%-16.16s", "DownLeftDash"); + break; + case ChoroQ::DownRightDash: + lcd.printf("%-16.16s", "DownRightDash"); + break; + case ChoroQ::Stop: + lcd.printf("%-16.16s", "Stop"); + break; + } + + wait_ms(50); + led = led + 1; + } + + return EXIT_SUCCESS; +}