IRC Helicopter "HonyBee" Propo decode test program
これは、赤外線コントロールヘリコプター"HonyBee"のPropoからの送信データを解析して、PCに表示させるテストプログラムです。 詳しくは、 http://suupen-make.blogspot.jp/2013/06/irc-helicopter-honybeembedtest-program.html を参照してください。
CodecIRPropoHonyBee/DecodeHonyBee.cpp@0:f9e49220c97a, 2013-06-23 (annotated)
- Committer:
- suupen
- Date:
- Sun Jun 23 07:28:06 2013 +0000
- Revision:
- 0:f9e49220c97a
IRC Helicopter "HonyBee" Propo decode test program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
suupen | 0:f9e49220c97a | 1 | /** |
suupen | 0:f9e49220c97a | 2 | * IR Propo Decode class |
suupen | 0:f9e49220c97a | 3 | * Version 0.0 130623 |
suupen | 0:f9e49220c97a | 4 | * |
suupen | 0:f9e49220c97a | 5 | * Writer:suupen |
suupen | 0:f9e49220c97a | 6 | */ |
suupen | 0:f9e49220c97a | 7 | #include "CodecHonyBee.h" |
suupen | 0:f9e49220c97a | 8 | #include "DecodeHonyBee.h" |
suupen | 0:f9e49220c97a | 9 | |
suupen | 0:f9e49220c97a | 10 | /** |
suupen | 0:f9e49220c97a | 11 | * Constructor DecodeHonyBee |
suupen | 0:f9e49220c97a | 12 | * |
suupen | 0:f9e49220c97a | 13 | */ |
suupen | 0:f9e49220c97a | 14 | DecodeHonyBee::DecodeHonyBee(){ |
suupen | 0:f9e49220c97a | 15 | // nothing |
suupen | 0:f9e49220c97a | 16 | } |
suupen | 0:f9e49220c97a | 17 | |
suupen | 0:f9e49220c97a | 18 | /** |
suupen | 0:f9e49220c97a | 19 | * Destructor. |
suupen | 0:f9e49220c97a | 20 | */ |
suupen | 0:f9e49220c97a | 21 | DecodeHonyBee::~DecodeHonyBee(){ |
suupen | 0:f9e49220c97a | 22 | // nothing |
suupen | 0:f9e49220c97a | 23 | } |
suupen | 0:f9e49220c97a | 24 | |
suupen | 0:f9e49220c97a | 25 | |
suupen | 0:f9e49220c97a | 26 | /** |
suupen | 0:f9e49220c97a | 27 | * Get HonyBee controller data. |
suupen | 0:f9e49220c97a | 28 | * |
suupen | 0:f9e49220c97a | 29 | * @param data Pointer to propo recive data. |
suupen | 0:f9e49220c97a | 30 | * |
suupen | 0:f9e49220c97a | 31 | * @param HonyBee Pointer to HonyBee. |
suupen | 0:f9e49220c97a | 32 | * |
suupen | 0:f9e49220c97a | 33 | * @return receive answer : ture:recive ok false:recive ng. |
suupen | 0:f9e49220c97a | 34 | */ |
suupen | 0:f9e49220c97a | 35 | bool DecodeHonyBee::decode(uint8_t *data, CodecHonyBee::honyBeePropo_t *honyBee) { |
suupen | 0:f9e49220c97a | 36 | |
suupen | 0:f9e49220c97a | 37 | bool ans = false; |
suupen | 0:f9e49220c97a | 38 | uint8_t wk1 = 0,wk2; |
suupen | 0:f9e49220c97a | 39 | int8_t ladder; |
suupen | 0:f9e49220c97a | 40 | uint8_t dat[3]; |
suupen | 0:f9e49220c97a | 41 | uint8_t i; |
suupen | 0:f9e49220c97a | 42 | |
suupen | 0:f9e49220c97a | 43 | // MSB to LSB |
suupen | 0:f9e49220c97a | 44 | for(i = 0; i < 8; i++){ |
suupen | 0:f9e49220c97a | 45 | |
suupen | 0:f9e49220c97a | 46 | dat[0] = dat[0] << 1; |
suupen | 0:f9e49220c97a | 47 | dat[1] = dat[1] << 1; |
suupen | 0:f9e49220c97a | 48 | dat[2] = dat[2] << 1; |
suupen | 0:f9e49220c97a | 49 | |
suupen | 0:f9e49220c97a | 50 | if(((data[0] >> i) & 0x01) == 0x01){dat[0] |= 0x01;} |
suupen | 0:f9e49220c97a | 51 | if(((data[1] >> i) & 0x01) == 0x01){dat[1] |= 0x01;} |
suupen | 0:f9e49220c97a | 52 | if(((data[2] >> i) & 0x01) == 0x01){dat[2] |= 0x01;} |
suupen | 0:f9e49220c97a | 53 | } |
suupen | 0:f9e49220c97a | 54 | |
suupen | 0:f9e49220c97a | 55 | // parity calculate |
suupen | 0:f9e49220c97a | 56 | for(uint8_t c=0; c < 8; c+=2){ |
suupen | 0:f9e49220c97a | 57 | wk1 += ((dat[0] >> c) & 0x03); |
suupen | 0:f9e49220c97a | 58 | wk1 += ((dat[1] >> c) & 0x03); |
suupen | 0:f9e49220c97a | 59 | } |
suupen | 0:f9e49220c97a | 60 | wk1 += ((dat[2] >> 6) & 0x02); |
suupen | 0:f9e49220c97a | 61 | |
suupen | 0:f9e49220c97a | 62 | wk1 &= 0x03; |
suupen | 0:f9e49220c97a | 63 | if(wk1 == 0x00){wk1 = 0x03;} |
suupen | 0:f9e49220c97a | 64 | else if(wk1 == 0x03){wk1 = 0x00;} |
suupen | 0:f9e49220c97a | 65 | |
suupen | 0:f9e49220c97a | 66 | wk2 = (dat[2] >> 5) & 0x03; |
suupen | 0:f9e49220c97a | 67 | |
suupen | 0:f9e49220c97a | 68 | if(wk1 == wk2){ |
suupen | 0:f9e49220c97a | 69 | // parity ok |
suupen | 0:f9e49220c97a | 70 | ans =true; |
suupen | 0:f9e49220c97a | 71 | honyBee->count++; |
suupen | 0:f9e49220c97a | 72 | honyBee->band = (dat[0] >> 2) & 0x03; |
suupen | 0:f9e49220c97a | 73 | honyBee->slottle = ((dat[0] << 2) & 0x0c) | ((dat[1] >> 6) & 0x03); |
suupen | 0:f9e49220c97a | 74 | honyBee->trim = (dat[1] >> 2) & 0x0f; |
suupen | 0:f9e49220c97a | 75 | ladder = ((dat[1] << 1) & 0x06) | ((dat[2] >> 7) & 0x01); |
suupen | 0:f9e49220c97a | 76 | if(0x04 == (ladder & 0x04)){ladder |= 0xf8;} |
suupen | 0:f9e49220c97a | 77 | honyBee->ladder = ladder; |
suupen | 0:f9e49220c97a | 78 | } |
suupen | 0:f9e49220c97a | 79 | else{ |
suupen | 0:f9e49220c97a | 80 | // parity ng |
suupen | 0:f9e49220c97a | 81 | // nothing |
suupen | 0:f9e49220c97a | 82 | ans = false; |
suupen | 0:f9e49220c97a | 83 | honyBee->band = 0x0F; |
suupen | 0:f9e49220c97a | 84 | } |
suupen | 0:f9e49220c97a | 85 | |
suupen | 0:f9e49220c97a | 86 | return ans; |
suupen | 0:f9e49220c97a | 87 | } |
suupen | 0:f9e49220c97a | 88 | |
suupen | 0:f9e49220c97a | 89 | |
suupen | 0:f9e49220c97a | 90 | /** |
suupen | 0:f9e49220c97a | 91 | * Normalize HonyBee data. |
suupen | 0:f9e49220c97a | 92 | * |
suupen | 0:f9e49220c97a | 93 | * @param buf Pointer to propo recive data. |
suupen | 0:f9e49220c97a | 94 | * |
suupen | 0:f9e49220c97a | 95 | * @param propo normalize propo data. |
suupen | 0:f9e49220c97a | 96 | * |
suupen | 0:f9e49220c97a | 97 | * @return receive answer : ture:recive ok false:recive ng. |
suupen | 0:f9e49220c97a | 98 | */ |
suupen | 0:f9e49220c97a | 99 | bool DecodeHonyBee::normalize(uint8_t *buf, CodecHonyBee::normalizePropo_t *propo) { |
suupen | 0:f9e49220c97a | 100 | bool ans = false; |
suupen | 0:f9e49220c97a | 101 | bool decodeCheck =false; |
suupen | 0:f9e49220c97a | 102 | |
suupen | 0:f9e49220c97a | 103 | CodecHonyBee::honyBeePropo_t HonyBee; |
suupen | 0:f9e49220c97a | 104 | decodeCheck = DecodeHonyBee::decode(buf, &HonyBee); |
suupen | 0:f9e49220c97a | 105 | |
suupen | 0:f9e49220c97a | 106 | if(decodeCheck == true){ |
suupen | 0:f9e49220c97a | 107 | ans = true; |
suupen | 0:f9e49220c97a | 108 | |
suupen | 0:f9e49220c97a | 109 | propo->count++;// = HonyBee.count; |
suupen | 0:f9e49220c97a | 110 | |
suupen | 0:f9e49220c97a | 111 | switch(HonyBee.band){ |
suupen | 0:f9e49220c97a | 112 | case CodecHonyBee::BAND_A: |
suupen | 0:f9e49220c97a | 113 | propo->band = 1; |
suupen | 0:f9e49220c97a | 114 | break; |
suupen | 0:f9e49220c97a | 115 | case CodecHonyBee::BAND_B: |
suupen | 0:f9e49220c97a | 116 | propo->band = 2; |
suupen | 0:f9e49220c97a | 117 | break; |
suupen | 0:f9e49220c97a | 118 | case CodecHonyBee::BAND_C: |
suupen | 0:f9e49220c97a | 119 | propo->band = 3; |
suupen | 0:f9e49220c97a | 120 | break; |
suupen | 0:f9e49220c97a | 121 | default: |
suupen | 0:f9e49220c97a | 122 | propo->band = 0; |
suupen | 0:f9e49220c97a | 123 | break; |
suupen | 0:f9e49220c97a | 124 | } |
suupen | 0:f9e49220c97a | 125 | |
suupen | 0:f9e49220c97a | 126 | if(HonyBee.slottle > CodecHonyBee::SLOTTLE_MAX){HonyBee.slottle = CodecHonyBee::SLOTTLE_MAX;} |
suupen | 0:f9e49220c97a | 127 | propo->slottle = (float)HonyBee.slottle / CodecHonyBee::SLOTTLE_MAX; |
suupen | 0:f9e49220c97a | 128 | |
suupen | 0:f9e49220c97a | 129 | if(HonyBee.ladder >= 0){ |
suupen | 0:f9e49220c97a | 130 | if(HonyBee.ladder > CodecHonyBee::LADDER_MAX){HonyBee.ladder = CodecHonyBee::LADDER_MAX;} |
suupen | 0:f9e49220c97a | 131 | propo->ladder = (float)HonyBee.ladder / CodecHonyBee::LADDER_MAX; |
suupen | 0:f9e49220c97a | 132 | } |
suupen | 0:f9e49220c97a | 133 | else{ |
suupen | 0:f9e49220c97a | 134 | if(HonyBee.ladder < CodecHonyBee::LADDER_MIN){HonyBee.ladder = CodecHonyBee::LADDER_MIN;} |
suupen | 0:f9e49220c97a | 135 | propo->ladder = -((float)HonyBee.ladder / CodecHonyBee::LADDER_MIN); |
suupen | 0:f9e49220c97a | 136 | } |
suupen | 0:f9e49220c97a | 137 | |
suupen | 0:f9e49220c97a | 138 | #if 0 // not use |
suupen | 0:f9e49220c97a | 139 | if(HonyBee.elevator >= 0){ |
suupen | 0:f9e49220c97a | 140 | if(HonyBee.elevator > CodecHonyBee::ELEVATOR_MAX){HonyBee.elevator = CodecHonyBee::ELEVATOR_MAX;} |
suupen | 0:f9e49220c97a | 141 | propo->elevator = (float)HonyBee.elevator / CodecHonyBee::ELEVATOR_MAX; |
suupen | 0:f9e49220c97a | 142 | } |
suupen | 0:f9e49220c97a | 143 | else{ |
suupen | 0:f9e49220c97a | 144 | if(HonyBee.elevator < CodecHonyBee::ELEVATOR_MIN){HonyBee.elevator = CodecHonyBee::ELEVATOR_MIN;} |
suupen | 0:f9e49220c97a | 145 | propo->elevator = -((float)HonyBee.elevator / CodecHonyBee::ELEVATOR_MIN); |
suupen | 0:f9e49220c97a | 146 | } |
suupen | 0:f9e49220c97a | 147 | #endif // not use |
suupen | 0:f9e49220c97a | 148 | |
suupen | 0:f9e49220c97a | 149 | switch (HonyBee.trim){ |
suupen | 0:f9e49220c97a | 150 | case CodecHonyBee::TRIM_LEFT: |
suupen | 0:f9e49220c97a | 151 | propo->trim = -1.0; |
suupen | 0:f9e49220c97a | 152 | break; |
suupen | 0:f9e49220c97a | 153 | case CodecHonyBee::TRIM_RIGHT: |
suupen | 0:f9e49220c97a | 154 | propo->trim = 1.0; |
suupen | 0:f9e49220c97a | 155 | break; |
suupen | 0:f9e49220c97a | 156 | default: |
suupen | 0:f9e49220c97a | 157 | // case CodecHonyBee::TRIM_NEUTRAL: |
suupen | 0:f9e49220c97a | 158 | propo->trim = 0.0; |
suupen | 0:f9e49220c97a | 159 | break; |
suupen | 0:f9e49220c97a | 160 | } |
suupen | 0:f9e49220c97a | 161 | |
suupen | 0:f9e49220c97a | 162 | } |
suupen | 0:f9e49220c97a | 163 | else{ |
suupen | 0:f9e49220c97a | 164 | // NG |
suupen | 0:f9e49220c97a | 165 | ans = false; |
suupen | 0:f9e49220c97a | 166 | } |
suupen | 0:f9e49220c97a | 167 | |
suupen | 0:f9e49220c97a | 168 | return ans; |
suupen | 0:f9e49220c97a | 169 | } |
suupen | 0:f9e49220c97a | 170 | |
suupen | 0:f9e49220c97a | 171 | |
suupen | 0:f9e49220c97a | 172 |