Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
Klik file client.cpp untuk membukanya, dan temukan fungsi OnInterruptIsr .
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.
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.
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);
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.
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.
Tutup file client.cpp.