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

Fork of StarBoardOrangeExample3 by Shinichiro Nakamura

Committer:
jksoft
Date:
Sat Aug 18 13:21:50 2012 +0000
Revision:
2:1d9c1cd90695
Parent:
1:03c8bc666945
Rev1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:127b9ca59547 1 /**
shintamainjp 0:127b9ca59547 2 * StarBoard Orange - Example application No.3 (Version 0.0.1)
shintamainjp 0:127b9ca59547 3 * Drive a CHORO Q HYBRID with wii nunchuk
shintamainjp 0:127b9ca59547 4 *
shintamainjp 0:127b9ca59547 5 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example3_ja/
shintamainjp 0:127b9ca59547 6 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example3_en/
shintamainjp 0:127b9ca59547 7 *
shintamainjp 0:127b9ca59547 8 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:127b9ca59547 9 * http://shinta.main.jp/
shintamainjp 0:127b9ca59547 10 */
shintamainjp 1:03c8bc666945 11
shintamainjp 1:03c8bc666945 12 /*
shintamainjp 1:03c8bc666945 13 * Connection map.
shintamainjp 1:03c8bc666945 14 *
shintamainjp 1:03c8bc666945 15 * +---+----------------+---------+
shintamainjp 1:03c8bc666945 16 * |Pin|Target |Direction|
shintamainjp 1:03c8bc666945 17 * +---+----------------+---------+
shintamainjp 1:03c8bc666945 18 * |p21|IR transmitter |OUT |
shintamainjp 1:03c8bc666945 19 * +---+----------------+---------+
shintamainjp 1:03c8bc666945 20 */
shintamainjp 1:03c8bc666945 21
shintamainjp 1:03c8bc666945 22 /*
shintamainjp 1:03c8bc666945 23 * Include files.
shintamainjp 1:03c8bc666945 24 */
shintamainjp 1:03c8bc666945 25
shintamainjp 0:127b9ca59547 26 #include <mbed.h>
shintamainjp 0:127b9ca59547 27 #include <algorithm>
shintamainjp 1:03c8bc666945 28 #include <ChoroQ.h>
shintamainjp 0:127b9ca59547 29 #include <I2CConfig.h>
shintamainjp 0:127b9ca59547 30 #include <WiiNunchuckReader.h>
shintamainjp 1:03c8bc666945 31 #include "appconf.h"
shintamainjp 1:03c8bc666945 32
shintamainjp 1:03c8bc666945 33 /*
shintamainjp 1:03c8bc666945 34 * Objects.
shintamainjp 1:03c8bc666945 35 */
shintamainjp 0:127b9ca59547 36
shintamainjp 0:127b9ca59547 37 WiiNunchuckReader wn(I2CPort_A::SDA, I2CPort_A::SCL);
shintamainjp 1:03c8bc666945 38 ChoroQ cq(p21);
shintamainjp 1:03c8bc666945 39
shintamainjp 1:03c8bc666945 40 /**
shintamainjp 1:03c8bc666945 41 * Get an action from a coordinate.
shintamainjp 1:03c8bc666945 42 *
shintamainjp 1:03c8bc666945 43 * @param x X axis.
shintamainjp 1:03c8bc666945 44 * @param y Y axis.
shintamainjp 1:03c8bc666945 45 * @param dash State of dash.
shintamainjp 1:03c8bc666945 46 *
shintamainjp 1:03c8bc666945 47 * @return An action.
shintamainjp 1:03c8bc666945 48 */
shintamainjp 0:127b9ca59547 49 ChoroQ::Action getAction(const int x, const int y, bool dash) {
shintamainjp 0:127b9ca59547 50 static const int MAX_X = 200;
shintamainjp 0:127b9ca59547 51 static const int MIN_X = 20;
shintamainjp 0:127b9ca59547 52 static const int MAX_Y = 200;
shintamainjp 0:127b9ca59547 53 static const int MIN_Y = 20;
shintamainjp 0:127b9ca59547 54 int px = ((x - MIN_X) * 100) / (MAX_X - MIN_X);
shintamainjp 0:127b9ca59547 55 int py = ((y - MIN_Y) * 100) / (MAX_Y - MIN_Y);
shintamainjp 0:127b9ca59547 56 px = std::max(0, std::min(100, px)) - 50; // Range of a value is -50 to +50
shintamainjp 0:127b9ca59547 57 py = std::max(0, std::min(100, py)) - 50; // Range of a value is -50 to +50
shintamainjp 0:127b9ca59547 58
shintamainjp 0:127b9ca59547 59 if ((std::abs(px) <= 10) && (std::abs(py) <= 10)) {
shintamainjp 0:127b9ca59547 60 return ChoroQ::Stop;
shintamainjp 0:127b9ca59547 61 }
shintamainjp 0:127b9ca59547 62
shintamainjp 1:03c8bc666945 63 if ((x == 0) && (y == 0)) {
shintamainjp 1:03c8bc666945 64 return ChoroQ::Stop;
shintamainjp 1:03c8bc666945 65 }
shintamainjp 1:03c8bc666945 66
shintamainjp 0:127b9ca59547 67 if (std::abs(px) < 10) {
shintamainjp 0:127b9ca59547 68 if (py < 0) {
shintamainjp 0:127b9ca59547 69 if (dash) {
shintamainjp 0:127b9ca59547 70 return ChoroQ::DownDash;
shintamainjp 0:127b9ca59547 71 } else {
shintamainjp 0:127b9ca59547 72 return ChoroQ::Down;
shintamainjp 0:127b9ca59547 73 }
shintamainjp 0:127b9ca59547 74 } else {
shintamainjp 0:127b9ca59547 75 if (dash) {
shintamainjp 0:127b9ca59547 76 return ChoroQ::UpDash;
shintamainjp 0:127b9ca59547 77 } else {
shintamainjp 0:127b9ca59547 78 return ChoroQ::Up;
shintamainjp 0:127b9ca59547 79 }
shintamainjp 0:127b9ca59547 80 }
shintamainjp 0:127b9ca59547 81 }
shintamainjp 0:127b9ca59547 82 if (std::abs(py) < 10) {
shintamainjp 0:127b9ca59547 83 if (px < -20) {
shintamainjp 0:127b9ca59547 84 return ChoroQ::Left;
shintamainjp 0:127b9ca59547 85 }
shintamainjp 0:127b9ca59547 86 if (20 < px) {
shintamainjp 0:127b9ca59547 87 return ChoroQ::Right;
shintamainjp 0:127b9ca59547 88 }
shintamainjp 0:127b9ca59547 89 }
shintamainjp 0:127b9ca59547 90 if ((10 < px) && (10 < py)) {
shintamainjp 0:127b9ca59547 91 if (dash) {
shintamainjp 0:127b9ca59547 92 return ChoroQ::UpRightDash;
shintamainjp 0:127b9ca59547 93 } else {
shintamainjp 0:127b9ca59547 94 return ChoroQ::UpRight;
shintamainjp 0:127b9ca59547 95 }
shintamainjp 0:127b9ca59547 96 }
shintamainjp 0:127b9ca59547 97 if ((px < -10) && (10 < py)) {
shintamainjp 0:127b9ca59547 98 if (dash) {
shintamainjp 0:127b9ca59547 99 return ChoroQ::UpLeftDash;
shintamainjp 0:127b9ca59547 100 } else {
shintamainjp 0:127b9ca59547 101 return ChoroQ::UpLeft;
shintamainjp 0:127b9ca59547 102 }
shintamainjp 0:127b9ca59547 103 }
shintamainjp 0:127b9ca59547 104 if ((px < -10) && (py < -10)) {
shintamainjp 0:127b9ca59547 105 if (dash) {
shintamainjp 0:127b9ca59547 106 return ChoroQ::DownLeftDash;
shintamainjp 0:127b9ca59547 107 } else {
shintamainjp 0:127b9ca59547 108 return ChoroQ::DownLeft;
shintamainjp 0:127b9ca59547 109 }
shintamainjp 0:127b9ca59547 110 }
shintamainjp 0:127b9ca59547 111 if ((10 < px) && (py < -10)) {
shintamainjp 0:127b9ca59547 112 if (dash) {
shintamainjp 0:127b9ca59547 113 return ChoroQ::DownRightDash;
shintamainjp 0:127b9ca59547 114 } else {
shintamainjp 0:127b9ca59547 115 return ChoroQ::DownRight;
shintamainjp 0:127b9ca59547 116 }
shintamainjp 0:127b9ca59547 117 }
shintamainjp 0:127b9ca59547 118 return ChoroQ::Stop;
shintamainjp 0:127b9ca59547 119 }
shintamainjp 0:127b9ca59547 120
shintamainjp 1:03c8bc666945 121 /**
shintamainjp 1:03c8bc666945 122 * Entry point.
shintamainjp 1:03c8bc666945 123 */
shintamainjp 0:127b9ca59547 124 int main() {
shintamainjp 1:03c8bc666945 125
shintamainjp 1:03c8bc666945 126 /*
shintamainjp 1:03c8bc666945 127 * Setup a configuration.
shintamainjp 1:03c8bc666945 128 */
shintamainjp 1:03c8bc666945 129 appconf_t conf;
shintamainjp 1:03c8bc666945 130 appconf_init(&conf);
shintamainjp 1:03c8bc666945 131 appconf_read(&conf);
shintamainjp 1:03c8bc666945 132
shintamainjp 1:03c8bc666945 133 /*
shintamainjp 1:03c8bc666945 134 * Application loop.
shintamainjp 1:03c8bc666945 135 */
shintamainjp 0:127b9ca59547 136 while (true) {
shintamainjp 0:127b9ca59547 137 wn.RequestRead();
shintamainjp 0:127b9ca59547 138
shintamainjp 0:127b9ca59547 139 ChoroQ::Action ac = getAction(wn.getJoyX(), wn.getJoyY(), (wn.getButtonZ() == 1) ? true : false);
shintamainjp 1:03c8bc666945 140 cq.execute(conf.channel, ac);
jksoft 2:1d9c1cd90695 141
shintamainjp 0:127b9ca59547 142 wait_ms(50);
shintamainjp 0:127b9ca59547 143 }
shintamainjp 0:127b9ca59547 144 }