Esempio n. 1
0
void max21100Decode(void) {
    volatile uint8_t *d = max21100Data.rxBuf;
    int32_t acc[3], temp, gyo[3];
    float divisor;
    int i;

    for (i = 0; i < 3; i++) {
        acc[i] = 0;
        gyo[i] = 0;
    }
    temp = 0;

    divisor = (float)MAX21100_SLOTS;
    for (i = 0; i < MAX21100_SLOTS; i++) {
        int j = i*MAX21100_SLOT_SIZE;

        // check if we are in the middle of a transaction for this slot
        if (i == max21100Data.slot && max21100Data.spiFlag == 0) {
            divisor -= 1.0f;
        }
        else {
            gyo[0] += (int16_t)__rev16(*(uint16_t *)&d[j+1]);
            gyo[1] += (int16_t)__rev16(*(uint16_t *)&d[j+3]);
            gyo[2] += (int16_t)__rev16(*(uint16_t *)&d[j+5]);

            acc[0] += (int16_t)__rev16(*(uint16_t *)&d[j+7]);
            acc[1] += (int16_t)__rev16(*(uint16_t *)&d[j+9]);
            acc[2] += (int16_t)__rev16(*(uint16_t *)&d[j+11]);

            temp += (int16_t)__rev16(*(uint16_t *)&d[j+19]);
        }
    }

    divisor = 1.0f / divisor;

    max21100Data.rawTemp = temp * divisor * (1.0f / 255.0f);
    max21100Data.temp = utilFilter(&max21100Data.tempFilter, max21100Data.rawTemp);

    max21100ScaleAcc(acc, max21100Data.rawAcc, divisor);
    max21100CalibAcc(max21100Data.rawAcc, max21100Data.acc);

    max21100ScaleGyo(gyo, max21100Data.rawGyo, divisor);
    max21100CalibGyo(max21100Data.rawGyo, max21100Data.gyo);

    max21100Data.lastUpdate = timerMicros();
}
Esempio n. 2
0
float utilFilter3(utilFilter_t *f, float signal) {
    return utilFilter(&f[0], utilFilter(&f[1], utilFilter(&f[2], signal)));
}
Esempio n. 3
0
// calculate radio reception quality
static void radioReceptionQuality(radioInstance_t *r, int8_t q) {
    r->quality = utilFilter(&r->qualityFilter, (float)(q + 1)) * 0.5f * 100.0f;
}