Bagikan melalui


Membaca data dari perangkat keras

Topik ini menunjukkan kepada Anda bagaimana driver sensor sampel membaca data dari perangkat keras sensor (akselerometer) sebagai respons terhadap permintaan baca.

Biasanya "ujung atas" driver sensor dirancang untuk dapat diakses oleh aplikasi yang dapat terhubung ke sensor, untuk membaca data. Dalam driver sensor sampel, "ujung atas" driver langsung terkait dengan fungsi pembacaan data untuk membaca data sampel dari akselerometer. Bagian berikut menjelaskan bagaimana pembacaan data diimplementasikan dalam driver sensor sampel.

Menangani permintaan baca

  1. Klik file client.cpp untuk membukanya, dan temukan fungsi OnInterruptIsr .

  2. Temukan kode berikut:

    // 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);
    

    Kode sebelumnya terlebih dahulu memperoleh kunci pada perangkat, lalu menentukan sumber interupsi, menggunakan fungsi I2CSensorReadRegister . Kode akhirnya melepaskan kunci pada perangkat.

  3. Temukan kode berikut:

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

    Setelah driver sensor berhasil menentukan sumber gangguan, driver sensor menggunakan WdfInterruptQueueWorkItemForIsr untuk membuat item kerja antrean untuk kerangka kerja.

Membaca data sensor

Driver sensor sampel menggunakan GetData untuk mengambil instans sensor, memperoleh kunci pada perangkat, lalu membaca data sensor. Saat panggilan fungsi GetData kembali, kunci dilepaskan.

  1. Dalam file client.cpp , temukan fungsi OnInterruptWorkItem . Kemudian dalam fungsi tersebut, tinjau kode berikut:

    // Invoke the function that Reads the device data
       WdfInterruptAcquireLock(Interrupt);
       Status = pAccDevice->GetData();
       WdfInterruptReleaseLock(Interrupt);
    
  2. Temukan fungsi GetData , dan temukan kode berikut:

    // 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);
    

    Kode sebelumnya mengesampingkan buffer ukuran DataBuffer, dan membaca data perangkat ke dalam buffer tersebut, melalui koneksi I2C.

  3. Temukan kode berikut:

    // Add timestamp
    FILETIME Timestamp = {};
    GetSystemTimeAsFileTime(&Timestamp);
    InitPropVariantFromFileTime(&Timestamp, &(m_pSensorData->List[SENSOR_DATA_TIMESTAMP].Value));
    
    SensorsCxSensorDataReady(m_SensorInstance, m_pSensorData);
    

    Kode sebelumnya menambahkan stempel waktu ke data perangkat, lalu menyimpan data ke lokasi dalam konteks perangkat, dan menggunakan m_pSensorData untuk mengarahkannya. Ini membuat data tersedia lebih jauh ke tumpukan, ke ekstensi kelas.

  4. Tutup file client.cpp.