ChoroQ

Committer:
shintamainjp
Date:
Sun Sep 19 23:49:38 2010 +0000
Revision:
1:97921a2adf78
Parent:
0:2a40e6db61c2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:2a40e6db61c2 1 /**
shintamainjp 0:2a40e6db61c2 2 * CHORO Q HYBRID control class (Version 0.0.1)
shintamainjp 0:2a40e6db61c2 3 *
shintamainjp 0:2a40e6db61c2 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:2a40e6db61c2 5 * http://shinta.main.jp/
shintamainjp 0:2a40e6db61c2 6 */
shintamainjp 0:2a40e6db61c2 7 #include "ChoroQ.h"
shintamainjp 0:2a40e6db61c2 8
shintamainjp 0:2a40e6db61c2 9 const ChoroQ::action_t ChoroQ::list[] = {
shintamainjp 0:2a40e6db61c2 10 {Undef, "\x00"},
shintamainjp 0:2a40e6db61c2 11 {Up, "\x20"},
shintamainjp 0:2a40e6db61c2 12 {Down, "\x10"},
shintamainjp 0:2a40e6db61c2 13 {Left, "\x30"},
shintamainjp 0:2a40e6db61c2 14 {Right, "\x08"},
shintamainjp 0:2a40e6db61c2 15 {UpDash, "\x28"},
shintamainjp 0:2a40e6db61c2 16 {UpLeft, "\x18"},
shintamainjp 0:2a40e6db61c2 17 {UpRight, "\x38"},
shintamainjp 0:2a40e6db61c2 18 {UpLeftDash, "\x04"},
shintamainjp 0:2a40e6db61c2 19 {UpRightDash, "\x24"},
shintamainjp 0:2a40e6db61c2 20 {DownLeft, "\x14"},
shintamainjp 0:2a40e6db61c2 21 {DownRight, "\x34"},
shintamainjp 0:2a40e6db61c2 22 {DownDash, "\x0C"},
shintamainjp 0:2a40e6db61c2 23 {DownLeftDash, "\x2C"},
shintamainjp 0:2a40e6db61c2 24 {DownRightDash, "\x1C"},
shintamainjp 0:2a40e6db61c2 25 {Stop, "\x3C"}
shintamainjp 0:2a40e6db61c2 26 };
shintamainjp 0:2a40e6db61c2 27
shintamainjp 0:2a40e6db61c2 28 /**
shintamainjp 0:2a40e6db61c2 29 * Create.
shintamainjp 0:2a40e6db61c2 30 *
shintamainjp 0:2a40e6db61c2 31 * @param pin A pin of IR.
shintamainjp 0:2a40e6db61c2 32 */
shintamainjp 0:2a40e6db61c2 33 ChoroQ::ChoroQ(PinName pin) : irtx(pin) {
shintamainjp 0:2a40e6db61c2 34 }
shintamainjp 0:2a40e6db61c2 35
shintamainjp 0:2a40e6db61c2 36 /**
shintamainjp 0:2a40e6db61c2 37 * Destroy.
shintamainjp 0:2a40e6db61c2 38 */
shintamainjp 0:2a40e6db61c2 39 ChoroQ::~ChoroQ() {
shintamainjp 0:2a40e6db61c2 40 }
shintamainjp 0:2a40e6db61c2 41
shintamainjp 0:2a40e6db61c2 42 /**
shintamainjp 0:2a40e6db61c2 43 * Execute control.
shintamainjp 0:2a40e6db61c2 44 *
shintamainjp 0:2a40e6db61c2 45 * @param ch A control channel.
shintamainjp 0:2a40e6db61c2 46 * @param action An action.
shintamainjp 0:2a40e6db61c2 47 * @param interval Keep interval time if this flag is true.
shintamainjp 0:2a40e6db61c2 48 */
shintamainjp 0:2a40e6db61c2 49 void ChoroQ::execute(Channel ch, Action action, bool keepInterval) {
shintamainjp 0:2a40e6db61c2 50 /*
shintamainjp 0:2a40e6db61c2 51 * Set the target ID and the interval time for a channel.
shintamainjp 0:2a40e6db61c2 52 */
shintamainjp 0:2a40e6db61c2 53 int target_id;
shintamainjp 0:2a40e6db61c2 54 int interval_time;
shintamainjp 0:2a40e6db61c2 55 switch (ch) {
shintamainjp 0:2a40e6db61c2 56 case ChA:
shintamainjp 0:2a40e6db61c2 57 target_id = TARGET_ID_CH_A;
shintamainjp 0:2a40e6db61c2 58 interval_time = REPEAT_INTERVAL_MS_CH_A;
shintamainjp 0:2a40e6db61c2 59 break;
shintamainjp 0:2a40e6db61c2 60 case ChB:
shintamainjp 0:2a40e6db61c2 61 target_id = TARGET_ID_CH_B;
shintamainjp 0:2a40e6db61c2 62 interval_time = REPEAT_INTERVAL_MS_CH_B;
shintamainjp 0:2a40e6db61c2 63 break;
shintamainjp 0:2a40e6db61c2 64 case ChC:
shintamainjp 0:2a40e6db61c2 65 target_id = TARGET_ID_CH_C;
shintamainjp 0:2a40e6db61c2 66 interval_time = REPEAT_INTERVAL_MS_CH_C;
shintamainjp 0:2a40e6db61c2 67 break;
shintamainjp 0:2a40e6db61c2 68 case ChD:
shintamainjp 0:2a40e6db61c2 69 target_id = TARGET_ID_CH_D;
shintamainjp 0:2a40e6db61c2 70 interval_time = REPEAT_INTERVAL_MS_CH_D;
shintamainjp 0:2a40e6db61c2 71 break;
shintamainjp 0:2a40e6db61c2 72 default:
shintamainjp 0:2a40e6db61c2 73 // printf("Unknown target channel found.\n");
shintamainjp 0:2a40e6db61c2 74 return;
shintamainjp 0:2a40e6db61c2 75 }
shintamainjp 0:2a40e6db61c2 76
shintamainjp 0:2a40e6db61c2 77 /*
shintamainjp 0:2a40e6db61c2 78 * Get a command.
shintamainjp 0:2a40e6db61c2 79 */
shintamainjp 0:2a40e6db61c2 80 uint8_t *command = getCommand(action);
shintamainjp 0:2a40e6db61c2 81 if (command != NULL) {
shintamainjp 0:2a40e6db61c2 82 static const int BITLENGTH_FOR_CHORO_Q = 6;
shintamainjp 0:2a40e6db61c2 83 uint8_t buf[1];
shintamainjp 0:2a40e6db61c2 84 buf[0] = command[0] | target_id;
shintamainjp 0:2a40e6db61c2 85
shintamainjp 0:2a40e6db61c2 86 /*
shintamainjp 0:2a40e6db61c2 87 * Transmit it.
shintamainjp 0:2a40e6db61c2 88 */
shintamainjp 0:2a40e6db61c2 89 timer.stop();
shintamainjp 0:2a40e6db61c2 90 timer.reset();
shintamainjp 0:2a40e6db61c2 91 timer.start();
shintamainjp 0:2a40e6db61c2 92 irtx.setData(buf, BITLENGTH_FOR_CHORO_Q);
shintamainjp 0:2a40e6db61c2 93 wait_ms(interval_time);
shintamainjp 1:97921a2adf78 94
shintamainjp 0:2a40e6db61c2 95 /*
shintamainjp 0:2a40e6db61c2 96 * I don't need keep a interval time if I use only a CHORO Q.
shintamainjp 0:2a40e6db61c2 97 * But kids need more CHORO Q cars sometime.
shintamainjp 0:2a40e6db61c2 98 * A keep interval time is difference by a channel.
shintamainjp 0:2a40e6db61c2 99 */
shintamainjp 0:2a40e6db61c2 100 irtx.setData(buf, BITLENGTH_FOR_CHORO_Q);
shintamainjp 0:2a40e6db61c2 101 if (keepInterval) {
shintamainjp 0:2a40e6db61c2 102 timer.stop();
shintamainjp 0:2a40e6db61c2 103 const int ms = timer.read_ms();
shintamainjp 0:2a40e6db61c2 104 wait_ms(PACKET_INTERVAL_MS - ms);
shintamainjp 0:2a40e6db61c2 105 } else {
shintamainjp 1:97921a2adf78 106 wait_ms(interval_time);
shintamainjp 0:2a40e6db61c2 107 timer.stop();
shintamainjp 0:2a40e6db61c2 108 }
shintamainjp 0:2a40e6db61c2 109 }
shintamainjp 0:2a40e6db61c2 110 }
shintamainjp 0:2a40e6db61c2 111
shintamainjp 0:2a40e6db61c2 112 uint8_t *ChoroQ::getCommand(Action action) {
shintamainjp 0:2a40e6db61c2 113 const int n = sizeof(list) / sizeof(list[0]);
shintamainjp 0:2a40e6db61c2 114 for (int i = 0; i < n; i++) {
shintamainjp 0:2a40e6db61c2 115 const action_t *p = &list[i];
shintamainjp 0:2a40e6db61c2 116 if (p->action == action) {
shintamainjp 0:2a40e6db61c2 117 return (uint8_t *)p->command;
shintamainjp 0:2a40e6db61c2 118 }
shintamainjp 0:2a40e6db61c2 119 }
shintamainjp 0:2a40e6db61c2 120 return NULL;
shintamainjp 0:2a40e6db61c2 121 }