基于Wave Panel 的HID 設(shè)備通訊接口設(shè)計
2. 3 寫報表
與讀報表相反,寫報表是指主機(jī)向HID 設(shè)備輸出數(shù)據(jù).寫報表對延遲的要求較高,但這一功能不是必需的,根據(jù)HID 設(shè)備的實(shí)際用途而定 .鼠標(biāo).鍵盤.游戲桿等較簡單的設(shè)備只向主機(jī)發(fā)送數(shù)據(jù),這些數(shù)據(jù)通常是一些控制信息和狀態(tài)信息 ,例如改變HID 設(shè)備液晶屏上的顯示信息.控制設(shè)備上發(fā)光元件的亮滅等.
應(yīng)用程序的寫報表線程流程與讀報表線程類似,首先將要輸出的數(shù)據(jù)按Wave Panel 規(guī)定的數(shù)據(jù)格式進(jìn)行封裝,復(fù)制到一個緩沖區(qū)內(nèi),再調(diào)用WriteFile()將緩沖區(qū)數(shù)據(jù)輸出到Wave Panel 即可,這些信息主要是與視頻幀狀態(tài)變化相關(guān)的信息.
2. 4 設(shè)備關(guān)閉
設(shè)備關(guān)閉模塊功能比較簡單.當(dāng)主機(jī)與WavePanel 的通訊結(jié)束時,調(diào)用CloseHandle( ) 將打開的Wave Panel 關(guān)閉即可.
3 Wave Panel 通訊接口的設(shè)計
以上述通訊過程為基礎(chǔ),設(shè)計一個名為CHid-Comm 的通訊接口,其總體框架為:
其中,成員函數(shù)OpenDevice()和CloseDevice()分別用于識別.打開和關(guān)閉Wave Panel.ReadReport-Thread()用于創(chuàng)建讀報表線程.由于線程為異步方式執(zhí)行,因此ReadReportThread( ) 在調(diào)用ReadFile( ) 時要使用一個OVERLAPPED 結(jié)構(gòu)變量,該變量含有一個I/ O 完成后觸發(fā)事件的句柄.當(dāng)HID 設(shè)備沒有向主機(jī)輸入數(shù)據(jù)時,事件處于無信號狀態(tài),線程被阻塞;當(dāng)有數(shù)據(jù)輸入時,事件被觸發(fā),線程恢復(fù)運(yùn)行,接收并將數(shù)據(jù)保存在讀報表緩沖區(qū),供數(shù)據(jù)解析函數(shù)使用.WriteReportThread()與ReadReportThread( ) 的功能類似,用于創(chuàng)建寫報表線程.
成員變量VID.PID 和PVN 用于保存三項(xiàng)屬性值,ReadBuffer 和WriteBuffer 分別定義讀報表緩沖區(qū)和寫報表緩沖區(qū),其大小由HID 設(shè)備的輸入報表和輸出報表長度決定.S 實(shí)際上,該接口不僅可以用于WavePanel,同樣也適用于其它HID 設(shè)備.只需要重新設(shè)置VID.PID 和PVN 值以及ReadBuffer.WriteBuffer 緩沖區(qū)的大小,而無須對識別.打開.讀寫報表等功能進(jìn)行修改.
圖3 是主機(jī)應(yīng)用程序調(diào)用CHidComm 接口實(shí)現(xiàn)與Wave Panel 通訊的情況.以十六進(jìn)制形式輸出讀報表緩沖區(qū)的值,并顯示控制器狀態(tài)變化情況.需要注意的一個重要問題是Wave Panel 輸入報表并不使用報表ID,在這種情況下應(yīng)將讀報表緩沖區(qū)ReadBuffer 的第0 字節(jié)設(shè)置為0×00,否則讀報表線程將無法接收到輸入報表.
4 結(jié)束語
Wave Panel 是一類較復(fù)雜的視頻編輯HID 設(shè)備,沒有提供Windows 環(huán)境下的通訊功能.基于WavePanel 對Windows 環(huán)境下的HID 設(shè)備通訊進(jìn)行研究,能夠解決許多UNIX.Linux.Mac 等操作系統(tǒng)支持的專用HID 設(shè)備無法在Windows 環(huán)境下使用的問題.較之現(xiàn)有的一些解決方案,設(shè)計的CHidComm 接口具有較強(qiáng)的通用性,并可以方便地對功能進(jìn)行擴(kuò)展.今后的工作主要是擴(kuò)展該接口在64 位Windows 環(huán)境下的功能.
評論