ChoroQ

Revision:
0:2a40e6db61c2
Child:
1:97921a2adf78
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ChoroQ.cpp	Sun Sep 19 23:30:35 2010 +0000
@@ -0,0 +1,119 @@
+/**
+ * CHORO Q HYBRID control class (Version 0.0.1)
+ *
+ * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
+ * http://shinta.main.jp/
+ */
+#include "ChoroQ.h"
+
+const ChoroQ::action_t ChoroQ::list[] = {
+    {Undef, "\x00"},
+    {Up, "\x20"},
+    {Down, "\x10"},
+    {Left, "\x30"},
+    {Right, "\x08"},
+    {UpDash, "\x28"},
+    {UpLeft, "\x18"},
+    {UpRight, "\x38"},
+    {UpLeftDash, "\x04"},
+    {UpRightDash, "\x24"},
+    {DownLeft, "\x14"},
+    {DownRight, "\x34"},
+    {DownDash, "\x0C"},
+    {DownLeftDash, "\x2C"},
+    {DownRightDash, "\x1C"},
+    {Stop, "\x3C"}
+};
+
+/**
+ * Create.
+ *
+ * @param pin A pin of IR.
+ */
+ChoroQ::ChoroQ(PinName pin) : irtx(pin) {
+}
+
+/**
+ * Destroy.
+ */
+ChoroQ::~ChoroQ() {
+}
+
+/**
+ * Execute control.
+ *
+ * @param ch A control channel.
+ * @param action An action.
+ * @param interval Keep interval time if this flag is true.
+ */
+void ChoroQ::execute(Channel ch, Action action, bool keepInterval) {
+    /*
+     * Set the target ID and the interval time for a channel.
+     */
+    int target_id;
+    int interval_time;
+    switch (ch) {
+        case ChA:
+            target_id = TARGET_ID_CH_A;
+            interval_time = REPEAT_INTERVAL_MS_CH_A;
+            break;
+        case ChB:
+            target_id = TARGET_ID_CH_B;
+            interval_time = REPEAT_INTERVAL_MS_CH_B;
+            break;
+        case ChC:
+            target_id = TARGET_ID_CH_C;
+            interval_time = REPEAT_INTERVAL_MS_CH_C;
+            break;
+        case ChD:
+            target_id = TARGET_ID_CH_D;
+            interval_time = REPEAT_INTERVAL_MS_CH_D;
+            break;
+        default:
+            // printf("Unknown target channel found.\n");
+            return;
+    }
+
+    /*
+     * Get a command.
+     */
+    uint8_t *command = getCommand(action);
+    if (command != NULL) {
+        static const int BITLENGTH_FOR_CHORO_Q = 6;
+        uint8_t buf[1];
+        buf[0] = command[0] | target_id;
+
+        /*
+         * Transmit it.
+         */
+        timer.stop();
+        timer.reset();
+        timer.start();
+        irtx.setData(buf, BITLENGTH_FOR_CHORO_Q);
+        wait_ms(interval_time);
+        /*
+         * I don't need keep a interval time if I use only a CHORO Q.
+         * But kids need more CHORO Q cars sometime.
+         * A keep interval time is difference by a channel.
+         */
+        irtx.setData(buf, BITLENGTH_FOR_CHORO_Q);
+        if (keepInterval) {
+            timer.stop();
+            const int ms = timer.read_ms();
+            wait_ms(PACKET_INTERVAL_MS - ms);
+        } else {
+            timer.stop();
+        }
+    }
+}
+
+uint8_t *ChoroQ::getCommand(Action action) {
+    const int n = sizeof(list) / sizeof(list[0]);
+    for (int i = 0; i < n; i++) {
+        const action_t *p = &list[i];
+        if (p->action == action) {
+            return (uint8_t *)p->command;
+        }
+    }
+    return NULL;
+}