하드웨어에서 데이터 읽기

이 항목에서는 샘플 센서 드라이버가 읽기 요청에 대한 응답으로 센서 하드웨어(가속도계)에서 데이터를 읽는 방법을 보여 줍니다.

일반적으로 센서 드라이버의 "최상위"는 데이터를 읽기 위해 센서에 연결할 수 있는 애플리케이션에 액세스할 수 있도록 설계되었습니다. 샘플 센서 드라이버에서 드라이버의 "최상위"는 가속도계에서 샘플 데이터를 읽기 위한 데이터 읽기 함수에 직접 연결됩니다. 다음 섹션에서는 샘플 센서 드라이버에서 데이터 읽기가 구현된 방법을 설명합니다.

읽기 요청 처리

  1. client.cpp 파일을 클릭하여 열고 OnInterruptIsr 함수를 찾습니다.
  2. 다음 코드를 찾습니다.
// 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 함수를 사용하여 인터럽트 소스를 결정합니다. 코드는 마침내 디바이스에서 잠금을 해제합니다.

  1. 다음 코드를 찾습니다.
// Create work item
   InterruptRecognized = TRUE;

   BOOLEAN WorkItemQueued = WdfInterruptQueueWorkItemForIsr(Interrupt);
   TraceVerbose("%!FUNC! Work item %s queued for interrupt", WorkItemQueued ? "" : " already");

센서 드라이버가 인터럽트의 원본을 성공적으로 확인한 후 센서 드라이버는 WdfInterruptQueueWorkItemForIsr 를 사용하여 프레임워크에 대한 대기 작업 항목을 만듭니다.

센서 데이터 읽기

샘플 센서 드라이버는 GetData 를 사용하여 센서 인스턴스를 검색하고 디바이스에 대한 잠금을 획득한 다음 센서 데이터를 읽습니다. GetData 함수 호출이 반환되면 잠금이 해제됩니다.

  1. client.cpp 파일 내에서 OnInterruptWorkItem 함수를 찾습니다. 그런 다음, 해당 함수 내에서 다음 코드를 검토합니다.
// Invoke the function that Reads the device data
   WdfInterruptAcquireLock(Interrupt);
   Status = pAccDevice->GetData();
   WdfInterruptReleaseLock(Interrupt);
  1. 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 연결을 통해 디바이스 데이터를 해당 버퍼로 읽습니다.

  1. 다음 코드를 찾습니다.
    // Add timestamp
    FILETIME Timestamp = {};
    GetSystemTimeAsFileTime(&Timestamp);
    InitPropVariantFromFileTime(&Timestamp, &(m_pSensorData->List[SENSOR_DATA_TIMESTAMP].Value));
    
    SensorsCxSensorDataReady(m_SensorInstance, m_pSensorData);
    

앞의 코드는 디바이스 데이터에 타임스탬프를 추가한 다음 디바이스 컨텍스트의 위치에 데이터를 저장하고 m_pSensorData 사용하여 가리킵니다. 이렇게 하면 스택에서 클래스 확장까지 데이터를 추가로 사용할 수 있습니다.

  1. client.cpp 파일을 닫습니다.