초보 와 함께 안 드 로 이 드 4.0.3 소스 센서 의 간단 한 이식 을 배 웁 니 다.
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. 테스트 에 대하 여
가속도 센서 테스트 기 를 다운로드 하여 테스트 할 수도 있 고 중력 가속도 에 따라 화면 을 회전 시 켜 테스트 할 수도 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.