하드웨어에서 데이터 읽기
이 항목에서는 샘플 센서 드라이버가 읽기 요청에 대한 응답으로 센서 하드웨어(가속도계)에서 데이터를 읽는 방법을 보여 줍니다.
일반적으로 센서 드라이버의 "최상위"는 데이터를 읽기 위해 센서에 연결할 수 있는 애플리케이션에 액세스할 수 있도록 설계되었습니다. 샘플 센서 드라이버에서 드라이버의 "최상위"는 가속도계에서 샘플 데이터를 읽기 위한 데이터 읽기 함수에 직접 연결됩니다. 다음 섹션에서는 샘플 센서 드라이버에서 데이터 읽기가 구현된 방법을 설명합니다.
읽기 요청 처리
- client.cpp 파일을 클릭하여 열고 OnInterruptIsr 함수를 찾습니다.
- 다음 코드를 찾습니다.
// Read the Interrupt source
BYTE IntSrcBuffer = 0;
WdfWaitLockAcquire(pAccDevice->m_I2CWaitLock, NULL);
Status = I2CSensorReadRegister(pAccDevice->m_I2CIoTarget, ADXL345_INT_SOURCE, &IntSrcBuffer, sizeof(IntSrcBuffer));
WdfWaitLockRelease(pAccDevice->m_I2CWaitLock);
앞의 코드는 먼저 디바이스에 대한 잠금을 획득한 다음 I2CSensorReadRegister 함수를 사용하여 인터럽트 소스를 결정합니다. 코드는 마침내 디바이스에서 잠금을 해제합니다.
- 다음 코드를 찾습니다.
// Create work item
InterruptRecognized = TRUE;
BOOLEAN WorkItemQueued = WdfInterruptQueueWorkItemForIsr(Interrupt);
TraceVerbose("%!FUNC! Work item %s queued for interrupt", WorkItemQueued ? "" : " already");
센서 드라이버가 인터럽트의 원본을 성공적으로 확인한 후 센서 드라이버는 WdfInterruptQueueWorkItemForIsr 를 사용하여 프레임워크에 대한 대기 작업 항목을 만듭니다.
센서 데이터 읽기
샘플 센서 드라이버는 GetData 를 사용하여 센서 인스턴스를 검색하고 디바이스에 대한 잠금을 획득한 다음 센서 데이터를 읽습니다. GetData 함수 호출이 반환되면 잠금이 해제됩니다.
- client.cpp 파일 내에서 OnInterruptWorkItem 함수를 찾습니다. 그런 다음, 해당 함수 내에서 다음 코드를 검토합니다.
// Invoke the function that Reads the device data
WdfInterruptAcquireLock(Interrupt);
Status = pAccDevice->GetData();
WdfInterruptReleaseLock(Interrupt);
- GetData 함수를 찾고 다음 코드를 찾습니다.
// Read the device data BYTE DataBuffer[ADXL345_DATA_REPORT_SIZE_BYTES]; WdfWaitLockAcquire(m_I2CWaitLock, NULL); Status = I2CSensorReadRegister(m_I2CIoTarget, ADXL345_DATA_X0, &DataBuffer[0], sizeof(DataBuffer)); WdfWaitLockRelease(m_I2CWaitLock);
앞의 코드는 DataBuffer 크기의 버퍼를 따로 설정하고 I2C 연결을 통해 디바이스 데이터를 해당 버퍼로 읽습니다.
- 다음 코드를 찾습니다.
// Add timestamp FILETIME Timestamp = {}; GetSystemTimeAsFileTime(&Timestamp); InitPropVariantFromFileTime(&Timestamp, &(m_pSensorData->List[SENSOR_DATA_TIMESTAMP].Value)); SensorsCxSensorDataReady(m_SensorInstance, m_pSensorData);
앞의 코드는 디바이스 데이터에 타임스탬프를 추가한 다음 디바이스 컨텍스트의 위치에 데이터를 저장하고 m_pSensorData 사용하여 가리킵니다. 이렇게 하면 스택에서 클래스 확장까지 데이터를 추가로 사용할 수 있습니다.
- client.cpp 파일을 닫습니다.