ChoroQ
ChoroQ.cpp@0:2a40e6db61c2, 2010-09-19 (annotated)
- Committer:
- shintamainjp
- Date:
- Sun Sep 19 23:30:35 2010 +0000
- Revision:
- 0:2a40e6db61c2
- Child:
- 1:97921a2adf78
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:2a40e6db61c2 | 94 | /* |
shintamainjp | 0:2a40e6db61c2 | 95 | * I don't need keep a interval time if I use only a CHORO Q. |
shintamainjp | 0:2a40e6db61c2 | 96 | * But kids need more CHORO Q cars sometime. |
shintamainjp | 0:2a40e6db61c2 | 97 | * A keep interval time is difference by a channel. |
shintamainjp | 0:2a40e6db61c2 | 98 | */ |
shintamainjp | 0:2a40e6db61c2 | 99 | irtx.setData(buf, BITLENGTH_FOR_CHORO_Q); |
shintamainjp | 0:2a40e6db61c2 | 100 | if (keepInterval) { |
shintamainjp | 0:2a40e6db61c2 | 101 | timer.stop(); |
shintamainjp | 0:2a40e6db61c2 | 102 | const int ms = timer.read_ms(); |
shintamainjp | 0:2a40e6db61c2 | 103 | wait_ms(PACKET_INTERVAL_MS - ms); |
shintamainjp | 0:2a40e6db61c2 | 104 | } else { |
shintamainjp | 0:2a40e6db61c2 | 105 | timer.stop(); |
shintamainjp | 0:2a40e6db61c2 | 106 | } |
shintamainjp | 0:2a40e6db61c2 | 107 | } |
shintamainjp | 0:2a40e6db61c2 | 108 | } |
shintamainjp | 0:2a40e6db61c2 | 109 | |
shintamainjp | 0:2a40e6db61c2 | 110 | uint8_t *ChoroQ::getCommand(Action action) { |
shintamainjp | 0:2a40e6db61c2 | 111 | const int n = sizeof(list) / sizeof(list[0]); |
shintamainjp | 0:2a40e6db61c2 | 112 | for (int i = 0; i < n; i++) { |
shintamainjp | 0:2a40e6db61c2 | 113 | const action_t *p = &list[i]; |
shintamainjp | 0:2a40e6db61c2 | 114 | if (p->action == action) { |
shintamainjp | 0:2a40e6db61c2 | 115 | return (uint8_t *)p->command; |
shintamainjp | 0:2a40e6db61c2 | 116 | } |
shintamainjp | 0:2a40e6db61c2 | 117 | } |
shintamainjp | 0:2a40e6db61c2 | 118 | return NULL; |
shintamainjp | 0:2a40e6db61c2 | 119 | } |