IRC Helicopter "HonyBee" Propo decode test program

Dependencies:   RemoteIR mbed

これは、赤外線コントロールヘリコプター"HonyBee"のPropoからの送信データを解析して、PCに表示させるテストプログラムです。 詳しくは、 http://suupen-make.blogspot.jp/2013/06/irc-helicopter-honybeembedtest-program.html を参照してください。

CodecIRPropoHonyBee/DecodeHonyBee.cpp

Committer:
suupen
Date:
2013-06-23
Revision:
0:f9e49220c97a

File content as of revision 0:f9e49220c97a:

/**
 * IR Propo Decode class
 * Version 0.0  130623
 *
 * Writer:suupen
 */
 #include "CodecHonyBee.h"
 #include "DecodeHonyBee.h"
 
 /**
 * Constructor DecodeHonyBee
 *
 */
 DecodeHonyBee::DecodeHonyBee(){
    // nothing
 }
 
 /**
 * Destructor.
 */
 DecodeHonyBee::~DecodeHonyBee(){
    // nothing
 }
 

/**
 * Get HonyBee controller data.
 *
 * @param data Pointer to propo recive data.
 *
 * @param HonyBee Pointer to HonyBee.
 *
 * @return receive answer : ture:recive ok   false:recive ng.
 */
bool DecodeHonyBee::decode(uint8_t *data, CodecHonyBee::honyBeePropo_t *honyBee) {

    bool ans = false;
    uint8_t wk1 = 0,wk2;
    int8_t ladder;
    uint8_t dat[3];
    uint8_t i;
    
    // MSB to LSB
    for(i = 0; i < 8; i++){
        
        dat[0] = dat[0] << 1;
        dat[1] = dat[1] << 1;
        dat[2] = dat[2] << 1;
        
        if(((data[0] >> i) & 0x01) == 0x01){dat[0] |= 0x01;}
        if(((data[1] >> i) & 0x01) == 0x01){dat[1] |= 0x01;}
        if(((data[2] >> i) & 0x01) == 0x01){dat[2] |= 0x01;}
    }
    
    // parity calculate
    for(uint8_t c=0; c < 8; c+=2){
        wk1 += ((dat[0] >> c) & 0x03);
        wk1 += ((dat[1] >> c) & 0x03);
    }
    wk1 += ((dat[2] >> 6) & 0x02);
    
    wk1 &= 0x03;
    if(wk1 == 0x00){wk1 = 0x03;}
    else if(wk1 == 0x03){wk1 = 0x00;}
    
    wk2 = (dat[2] >> 5) & 0x03;
    
    if(wk1 ==  wk2){
        // parity ok
        ans =true;
        honyBee->count++;
        honyBee->band = (dat[0] >> 2) & 0x03;
        honyBee->slottle = ((dat[0] << 2) & 0x0c) | ((dat[1] >> 6) & 0x03);
        honyBee->trim = (dat[1] >> 2) & 0x0f;
        ladder = ((dat[1] << 1) & 0x06) | ((dat[2] >> 7) & 0x01);
        if(0x04 == (ladder & 0x04)){ladder |= 0xf8;}
        honyBee->ladder = ladder;
    }
    else{
        // parity ng
        // nothing
        ans = false;
        honyBee->band = 0x0F;
    }
    
    return ans;
}


/**
 * Normalize HonyBee data.
 *
 * @param buf Pointer to propo recive data.
 *
 * @param propo normalize propo data.
 *
 * @return receive answer : ture:recive ok   false:recive ng.
 */
bool DecodeHonyBee::normalize(uint8_t *buf, CodecHonyBee::normalizePropo_t *propo) {
    bool ans = false;
    bool decodeCheck =false;
    
    CodecHonyBee::honyBeePropo_t HonyBee;
    decodeCheck = DecodeHonyBee::decode(buf, &HonyBee);
    
    if(decodeCheck == true){
        ans = true;
     
        propo->count++;// = HonyBee.count;
        
        switch(HonyBee.band){
        case CodecHonyBee::BAND_A:
            propo->band = 1;
            break;
        case CodecHonyBee::BAND_B:
            propo->band = 2;
            break;
        case CodecHonyBee::BAND_C:
            propo->band = 3;
            break;
        default:
            propo->band = 0;
            break;
        }
        
        if(HonyBee.slottle > CodecHonyBee::SLOTTLE_MAX){HonyBee.slottle = CodecHonyBee::SLOTTLE_MAX;}
        propo->slottle = (float)HonyBee.slottle / CodecHonyBee::SLOTTLE_MAX;
        
        if(HonyBee.ladder >= 0){
            if(HonyBee.ladder > CodecHonyBee::LADDER_MAX){HonyBee.ladder = CodecHonyBee::LADDER_MAX;}
            propo->ladder = (float)HonyBee.ladder / CodecHonyBee::LADDER_MAX;
        }
        else{
            if(HonyBee.ladder < CodecHonyBee::LADDER_MIN){HonyBee.ladder = CodecHonyBee::LADDER_MIN;}        
            propo->ladder = -((float)HonyBee.ladder / CodecHonyBee::LADDER_MIN);
        }

#if 0 // not use        
        if(HonyBee.elevator >= 0){
            if(HonyBee.elevator > CodecHonyBee::ELEVATOR_MAX){HonyBee.elevator = CodecHonyBee::ELEVATOR_MAX;}       
            propo->elevator = (float)HonyBee.elevator / CodecHonyBee::ELEVATOR_MAX;
        }
        else{
            if(HonyBee.elevator < CodecHonyBee::ELEVATOR_MIN){HonyBee.elevator = CodecHonyBee::ELEVATOR_MIN;}
            propo->elevator = -((float)HonyBee.elevator / CodecHonyBee::ELEVATOR_MIN);
        }
#endif // not use
        
        switch (HonyBee.trim){
        case CodecHonyBee::TRIM_LEFT:
            propo->trim = -1.0;
            break;
        case CodecHonyBee::TRIM_RIGHT:
            propo->trim = 1.0;
            break;
        default:
//      case CodecHonyBee::TRIM_NEUTRAL:
            propo->trim = 0.0;
            break;        
        }
  
    }
    else{
        // NG
        ans = false;
    }

    return ans;
}