Status I2CGpioHardwareBus::Receive(byte cmd, byte& value)
{
    auto result = i2cReadByteData(_i2cHandle, cmd);
    checkStatus(result, Status::ReceiveFail);

    value = byte(result & 0x000000FF);

    return Status::Ok;
}
Esempio n. 2
0
void DataAquisition::run()
{
     //Variablendeklaration
     int handle = 0;
     int dataready = 0;

     int winkel_old= 999;

    while(1)
    {

         int dataX_MSB = 0;
         int dataX_LSB = 0;
         int dataY_MSB = 0;
         int dataY_LSB = 0;
         int dataZ_MSB = 0;
         int dataZ_LSB = 0;

         signed short int dataX = 0;
         signed short int dataY = 0;
         signed short int dataZ = 0;

         int winkel = 0;
         double tangens = 0;
         double dataX_ABS = 0;
         double dataZ_ABS = 0;

          //i2c

         handle = i2cOpen(1,0x55,0);

             i2cSwitchCombined(1);               // WICHTIG! Enable "Repeated Start"!!

             gpioWrite(13,1);                    // MMA8491_EN = 1
             gpioDelay(2000);                   // Ton (minimales Delay)

             i2cWriteByte(handle,0x00);
             dataready = i2cReadByte(handle);

             if((dataready & 0x08) == 0x08)      // Falls neue Daten Verfügbar
             {
                 dataX_MSB = i2cReadByteData(handle,0x01);
                 dataX_LSB = i2cReadByteData(handle,0x02);
                 dataY_MSB = i2cReadByteData(handle,0x03);
                 dataY_LSB = i2cReadByteData(handle,0x04);
                 dataZ_MSB = i2cReadByteData(handle,0x05);
                 dataZ_LSB = i2cReadByteData(handle,0x06);

                 dataX = dataX_LSB + (dataX_MSB << 8);
                 dataY = dataY_LSB + (dataY_MSB << 8);
                 dataZ = dataZ_LSB + (dataZ_MSB << 8);

                 //Absolutwert und Wandlung in Double
                 dataX_ABS = abs(dataX);
                 dataZ_ABS = abs(dataZ);

                 //Berechnung Tangens
                 tangens = (dataX_ABS)/(dataZ_ABS);

                 //Berechnung Winkel
                 winkel = (atan(tangens))*180 / PI;

                 //Unterscheidung Quadrant
                 if((dataZ >= 0) & (dataX >= 0))         // Rechts unten
                     winkel = winkel;
                 else if((dataZ <= 0) & (dataX >= 0))    // Rechts oben
                     winkel = 180 - winkel;
                 else if((dataZ <= 0) & (dataX <= 0))    // Links oben
                     winkel = 180 + winkel;
                 else if((dataZ >= 0) & (dataX <= 0))    // Links unten
                     winkel = 360 - winkel ;
             }

        i2cClose(handle);
        gpioWrite(13,0);                    // MMA8491_EN = 0

        if (winkel < 3 || winkel > 357)
        {
            winkel = 0;
        }


        //Filter gegen Stösse und Schläge
        if(winkel_old != 999)
        {
                if(winkel > (winkel_old+10))
                {
                    winkel = (winkel_old+10);
                }
                else if(winkel < (winkel_old-10))
                {
                    winkel = (winkel_old-10);
                }
        }

        if(fps == "2")
        {
            if(i%5 == 0)
            {
                angleArray[(i/5)] = winkel;
            }
        }
        else if(fps == "30")
        {
            angleArray[i] = winkel;
            angleArray[++i] = winkel;
            angleArray[++i] = winkel;
        }
        else
        {
            angleArray[i] = winkel;
        }
        winkel_old = winkel;
        i++;
        msleep(92);
    }
}