초보 와 함께 안 드 로 이 드 4.0.3 소스 센서 의 간단 한 이식 을 배 웁 니 다.

4977 단어
가속도 센서 에 대해 우 리 는 그의 세 축의 데이터 만 알 아야 하고 안 드 로 이 드 상부 도 하나의 데이터 구조 중의 데이터 만 필요 할 뿐이다.
 
1. Liux 구동 층 에 대하 여
구동 은 주로 input 장 치 를 등록 하고 i2c 인 터 페 이 스 를 통 해 센서 레지스터 의 세 축 데 이 터 를 읽 고 이 세 개의 데 이 터 를 보고 합 니 다.
 
 
2. 안 드 로 이 드 하드웨어 추상 층
hardware \ libhardware \ \ include \ hardware 아래 sensors. h 의 헤더 파일 이 있 습 니 다. 주로 이곳 의 데이터 구 조 를 작성 하면 됩 니 다.
구 조 는 다음 과 같다.
typedef struct {
    union {
        float v[3];
        struct {
            float x;
            float y;
            float z;
        };
        struct {
            float azimuth;
            float pitch;、
 
            float roll;
        };
    };
    int8_t status;
    uint8_t reserved[3];
} sensors_vec_t;
 
/**
 * Union ofthe various types of sensor data
 * that can be returned.
 */
typedef structsensors_event_t {
    /* must be sizeof(struct sensors_event_t)*/
    int32_t version;
 
    /* sensor identifier */
    int32_t sensor;
 
    /* sensor type */
    int32_t type;
 
    /* reserved */
    int32_t reserved0;
 
    /* time is in nanosecond */
    int64_t timestamp;
 
    union {
        float           data[16];
 
        /* acceleration values are in meter persecond per second (m/s^2) */
       sensors_vec_t   acceleration;
 
        /* magnetic vector values are inmicro-Tesla (uT) */
        sensors_vec_t   magnetic;
 
        /* orientation values are in degrees */
        sensors_vec_t   orientation;
 
        /* gyroscope values are in rad/s */
        sensors_vec_t   gyro;
 
        /* temperature is in degrees centigrade(Celsius) */
        float           temperature;
 
        /* distance in centimeters */
        float           distance;
 
        /* light in SI lux units */
        float           light;
 
        /* pressure in hectopascal (hPa) */
        float           pressure;
 
        /* relative humidity in percent */
        float           relative_humidity;
    };
    uint32_t        reserved1[4];
}sensors_event_t;

한편, 안 드 로 이 드 에서 소스 코드 도 이 추상 층 을 위해 sensor 류 를 만 들 었 고 보고 한 데 이 터 를 처리 하 며 jni 에 게 제공 하여 안 드 로 이 드 상층 부 에 제공 했다.
구체 적 인 코드 는 device \ samsung \ tuna \ libsensors 이 폴 더 아래 에 있 습 니 다.
구체 적 인 이식 은 다음 과 같다.
 
static structsensor_t sSensorList[LOCAL_SENSORS + MPLSensor::numSensors] = {
      { "GP2A Light sensor",
          "Sharp",
          1, SENSORS_LIGHT_HANDLE,
          SENSOR_TYPE_LIGHT, 3000.0f, 1.0f,0.75f, 0, { } },
      { "GP2A Proximity sensor",
          "Sharp",
          1, SENSORS_PROXIMITY_HANDLE,
          SENSOR_TYPE_PROXIMITY, 5.0f, 5.0f,0.75f, 0, { } },
      { "BMP180 Pressure sensor",
          "Bosch",
          1, SENSORS_PRESSURE_HANDLE,
          SENSOR_TYPE_PRESSURE, 1100.0f, 0.01f,0.67f, 20000, { } },
};

이곳 은 자신의 설비 로 수정 해 야 한다.
 
private:
    enum {
        mpl               = 0,  //all mpl entries must be consecutive and inthis order
        mpl_accel,
        mpl_timer,
        light,
        proximity,
        pressure,
        numSensorDrivers,       // wake pipe goes here
        mpl_power,              //special handle for MPL pminteraction
        numFds,
    };

여기 서 자신의 장치 에 대응 하 는 번 호 를 선택 하 십시오.
 
inthandleToDriver(int handle) const {
        switch (handle) {
            case ID_RV:
            case ID_LA:
            case ID_GR:
            case ID_GY:
            case ID_A:
            case ID_M:
            case ID_O:
                return mpl;
            case ID_L:
                return light;
            case ID_P:
                return proximity;
            case ID_PR:
                return pressure;
        }
        return -EINVAL;
    }

여기에 서로 다른 id 에 따라 위 에 기입 한 번호 에 대응 하면 됩 니 다.예 를 들 어 내 가 있 는 곳 은 세 축의 가속도 이기 때문에,
Case ID_A:
       Return accel;
 
sensors_poll_context_t::sensors_poll_context_t()
{
    FUNC_LOG;
    MPLSensor* p_mplsen = new MPLSensor();
    setCallbackObject(p_mplsen); //setup thecallback object for handing mpl callbacks
    numSensors =
        LOCAL_SENSORS +
       p_mplsen->populateSensorList(sSensorList + LOCAL_SENSORS,
                                    sizeof(sSensorList[0]) * (ARRAY_SIZE(sSensorList) - LOCAL_SENSORS));
 
    mSensors[mpl] = p_mplsen;
    mPollFds[mpl].fd =mSensors[mpl]->getFd();
    mPollFds[mpl].events = POLLIN;
    mPollFds[mpl].revents = 0;
……
}

이곳 의 구조 함수 에는 세 축의 가속도 만 기입 하면 된다.
 
그리고 자신의 센서 에 따라 클래스 를 새로 만 듭 니 다.AccelSensor. cpp, AccelSensor. h 파일 두 개 만 들 기
구체 적 인 함 수 는 libsensor 에 있 는 것 에 따라 됩 니 다.
 
이식 후 mm 컴 파일 후 sensor. *. so 를 얻 을 수 있 습 니 다. 그 중 * 는 당신 의 Android. mk 에 따라 얻 을 수 있 습 니 다.이거 생기 면 안 드 로 이 드 시스템 뛰 어.사용 할 수 있 습 니 다.
 
3. 테스트 에 대하 여
가속도 센서 테스트 기 를 다운로드 하여 테스트 할 수도 있 고 중력 가속도 에 따라 화면 을 회전 시 켜 테스트 할 수도 있다.
 
 

좋은 웹페이지 즐겨찾기