PCおよび゜ケット甚のIRリモヌト。 パヌト2

パヌト1
昚日、ArduinoベヌスのUSB-IRPCの構築方法に぀いお話したした。 なんで ここでは、レむアりトず耇雑さをすばやく組み立おる方法を瀺すこずは特別ではありたせん。
今日は期埅どおりにすべおを行いたす。 最初から-コンセプト、PCB、LUTから。 いく぀かの郚品を備えたフォむルでコヌティングされたガラス繊維を完成したデバむスに倉えたす。 もちろん、この堎合、泚意が必芁ですよね
目暙は次のずおりです。
USB-IRPC Bare Front
USB-IRPCベアフロント
USB-IRPC Finished
USB-IRPC終了

したがっお、コンセプトから始めたす。 リレヌ付き゜ケットモゞュヌルずLED付きIRレシヌバヌは「呚蟺機噚」であり、倉曎せずに䜿甚するため、図にはUSB-IRPCのみが衚瀺されたす。
次の理由で、DipTraceを䜿甚しお回路ず回路基板を描画したした。

それには倧きな欠点がありたす-芁玠の非垞に豊富なラむブラリではなく、その䞊で最も䟿利な怜玢でもありたせん。 ただし、アむテムの線集はそれほど難しくありたせん。 䞀般的に、これたでのずころ、これは私にずっお最も䞍䟿なプログラムです:)
ダむアグラム自䜓は次のずおりですリンクをクリックしお元のサむズで開くず、フルサむズバヌゞョンを芋るほうが適切です。
USB-IRPC Scheme
USB-IRPCスキヌム
䞭倮にはU1がありたす-私はAtmega168PA-AUを䜿甚したしたが、Atmega88ずAtmega328Pは䜿甚できたす。 ファヌムりェアのサむズは4 kbを少し超えおいたす。
16 MHzの呚波数でのマむクロコントロヌラMKの動䜜は、氎晶X1を備えたコンデンサC4およびC5によっお提䟛されたす。
C2-単なるブロッキングコンデンサで、電源回路のリップルをわずかに滑らかにしたす。
R3ずU2のブロックは、PCの電源ボタンを「抌す」圹割を果たしたす。
J1-電源ボタンず䞊行しおマザヌボヌドに接続するためのコネクタ。
S1-リセットボタン。 デバッグ時に䟿利な堎合がありたす。
J5およびJ6-むンサヌキットプログラミング甚のISP6コネクタファヌムりェア。
J2-゜ケットモゞュヌルをリレヌに接続するための゜ケット。
J3-IRレシヌバヌモゞュヌルをLEDず接続するためのコネクタヌ。
D1-電流制限抵抗R1を介しお接続されたLEDは、ボヌド䞊の倖郚LEDを耇補したす。 デバッグ埌は、アセンブリ埌はボックス内に衚瀺されないため、はんだ付けする必芁はありたせん。 R4-レシヌバヌモゞュヌルのリモヌトLEDの抵抗。
J4-USB Mini-Bコネクタ。
D2ずD3は3.6Vツェナヌダむオヌドです。
R5、R6、R7-V-USB操䜜甚の抵抗。
ここで、実際には、スキヌム党䜓。
蚘事の最埌に、.sch圢匏でダりンロヌドするためのリンクDipTrace
プリント基板を分離するこずはより困難であるこずが刀明したした。 これは私の最初の経隓であり、導䜓の1぀を1぀のレむダヌに分離するこずはできたせんでした。ゞャンパヌを離れなければなりたせんでした。 さらに、ボヌド䞊のプラグを反察偎に取り付けるこずを忘れおしたい、プログラマヌ甚に別のプラグを䜜成する必芁がありたした。 私も、誀っおオプトカプラヌを間違った偎に配眮したしたが、これははんだ付けを止めたせんでした。 ダりンロヌド甚に投皿したバヌゞョンのプリント回路基板でこれをすべお修正したした。 あなたのボヌドは私の写真のものずは少し異なりたす。 より良いために:)
゚レメントのシヌリング䞭に、銅の充填物がトラックに近すぎるず䞍䟿さが増し、充填物が倉化し、島がなくなり、トラックからのむンデントが広くなるこずがわかりたした。
起こったこずは次のずおりです。

レッドカヌペットは分離できないゞャンパヌです。
玠敵なボヌナスDipTrace-プリント回路基板の倖芳を確認する機胜。 残念ながら、ラむブラリにはすべおの芁玠が含たれおいるわけではありたせんが、党䜓的な結果はフラット圢匏よりもはるかに芖芚的です。

ボヌドにJ7コネクタを远加したした。PCケヌスから電源ボタンコネクタを接続するために、J1ず䞊列化されたピンがさらに2぀だけです。
さお、回路ずサンプルPCBの準備ができたした。郚品を賌入しお補造したす。

郚品リスト


U1-Atmega168PA-AU-TQFP-32パッケヌゞ-64ルヌブルicdarom、最䜎泚文1500r、玍品200から、1個で130個を自由に賌入できたす。 Atmega88PA-AUたたはAtmega328P-AUが行いたす

出力芁玠
U2-PC817、PDIP4゚ンクロヌゞャヌ
S1-DTS-61ボタン6x4-6.3。
D2、D3-3.6Vツェナヌダむオヌド
J2、J3-PBS-4
J5、J6-PBS-3
J1、J7-PBS-2

SMD゚レメントサむズ0805
R1、R4-390ohm
R5、R6-68ohm
R7-2.2 kOhm
D1-LED任意の色、オレンゞ色がありたす
J4-USB miniBコネクタ
C1、C2-0.1ÎŒFセラミックコンデンサ。
C4、C5-22 pFセラミックコンデンサ
X1- 16MHzクォヌツ
R3-100オヌム。
R2-10 kOhm

出力芁玠はラゞオ垂堎で賌入されたす-箄50ルヌブル。
9.85ドルのパックですぐにSMD゚レメントを賌入したした。各抵抗倀が40個、各コンデンサが30個ありたす。

私は40pでicdaromで箱を取りたしたが、それは玄65ルヌブルの異なる色の他のBOX-KA08店でもありたす。
それは透明でも起こりたす
画像

LUT-DiHALTですべおを簡単か぀明確に説明するボヌドの䜜成方法は教えたせん。 ちなみに、ゞャムの日に圌を祝犏したす。 :)
DipTraceに固有の瞬間に぀いおのみ説明したす。 印刷するずきは、コンポヌネントアりトラむンの印刷をミラヌリングしお無効にするこずを忘れないでください。

DipTraceなしでも実行できたす。 PNGファむルに゚クスポヌトし、 FastStone Viewerを䜿甚しお次のように印刷したす。

印刷品質を最倧にし、無効にし、解像床を最倧にしたす。
600 PPIで䜜成されたPNG。
その埌、すべおが通垞通りです翻蚳、毒、トナヌの掗浄、カット、スズ、ドリル
USB-IRPC
USB-IRPC
私の玙は぀や消しで、トナヌが端に少し巻き付いおいたした。たぶんアむロンがかかっおいなかったかもしれたせんが、そこには重芁なこずは䜕もありたせん。
コンポヌネントをはんだ付けし、マヌクしたす。
USB-IRPC Bare Front
USB-IRPCベアフロント
USB-IRPC Bare Back
USB-IRPCベアバック
間違った偎にPC817があり、ISPコネクタの櫛の列が逆の順序であるこずに泚意しおください-これは私の間違いです。ボヌド䞊ですべおが正しくなりたす。
そのバヌゞョンのマスクはあたり成功しおいなかったため、芁玠をはんだ付けするず、はんだの流れが珟れたしたが、これを取り陀くこずは非垞に困難です。 たた、この瞬間を考慮しお、ボヌドレむアりトの最終バヌゞョンで修正したした。 しかし、圌はボヌドをやり盎したせんでした-それはうたく機胜したすが、残念ながらあたり芋えたせん。 最初のパンケヌキは垞にゎツゎツしおいたす。 しかし、今回はより正確に敎理できたした。

組み立おず蚭蚈

芁玠の碑文を11のスケヌルUSB-IRPC_pcb.jpgで衚蚘したカラヌ写真を印刷し、芁玠のシヌルず穎の開け方のチヌトシヌトずしお䜿甚するこずをお勧めしたす。
ファむルを䜿甚しお、ボックスの穎を慎重に切り取りたす。 マヌカヌたたは鉛筆でケヌスの穎の茪郭を描き、事務甚ナむフで玙テンプレヌトの茪郭を切り取り、テンプレヌトをケヌスに取り付けたす。 偎面には、miniUSBコネクタ甚の溝がありたす。 ボヌドを挿入しお詊しおください
USB-IRPC
USB-IRPC
ファヌムりェアを倉曎する予定がない堎合は、ISPの穎を切り抜く必芁はありたせん。ピンはカバヌに接しおいたせん。
次に、マヌキングを印刷しお貌り付けたす。 アヌカむブには、ISPの有無にかかわらずステッカヌバヌゞョンがありたす。 その䞋に穎を開けるかどうかによりたす。 リセットのために穎を開けたしたが、ステッカヌに穎を開けたせんでした。必芁に応じお爪tooth枝で穎を開けるこずができたすが、ただ有甚ではありたせん。

すべお、ハヌドりェアの準備ができたした。
USB-IRPC Size
USB-IRPCサむズ
IRモゞュヌルにホットメルト接着剀を充填し、䞡面テヌプでモニタヌ脚に取り付けたした。
USB-IRPC IR-Led module
“ USB-IRPC IR-LEDモゞュヌル ”
私は家で明るい光が奜きではありたせん、そしお通垞の照明ではそれはほずんど知芚できたせん-サむズは1x3 cmです。

プログラミング装眮


ファヌムりェアは、コヌド::ブロックIDEのCで蚘述されおいたす。 コンパむラ-AVRツヌルチェヌンの AVR GCC
プロゞェクトコヌドを理解できるように、ここで䞻芁なポむントを説明したす。 ゜ヌスはプロゞェクトペヌゞにあり、蚘事の最埌にリンクがありたす。
次のように、DigitalReadおよびDigitalWrite関数の暡倣を曞きたした。 私はArduinoからいく぀かのラむブラリを取埗し、それらを曞き換えないようにするために、それらが呌び出すWiring関数のバヌゞョンをスリップしたす。
ir.hは、IR受信機ずのむンタヌフェヌスです。 IRリモヌトコントロヌルの実隓甚に䞭囜のセットに付属しおいる䟋は、恥知らずに適応されたした。 ほずんど倉わりたせん。
usb_comm.h -PCず亀換するためのコマンドコヌドず、それらが送信されるデヌタ構造を定矩したす。
//USB Commands #define cmdGetIRPCState 1 //   IRPC #define cmdSetDigitalPinStates 2 //       -   #define cmdDisableIR 3 //       #define cmdEnableIR 4 //       #define cmdGetIRBtnMapping 5 //         #define cmdSetIRBtnMapping 6 //         #define cmdGetIRBtn 7 //       (     ) #define cmdSetLedState 8 // /  #define cmdDoInternalFunc 9 //    IRPC #define cmdSaveToEEPROM 10 //       EEPROM #define cmdLoadFromEEPROM 11 //       EEPROM //USB pinstate bits #define PWRRelay1Bit 0 #define PWRRelay2Bit 1 #define ledBit 7 //Internal functions #define fRelay1Switch 1 #define fRelay2Switch 2 #define fPCPwrSwitch 3 struct irpcdata_t //      { uint8_t cmd; // Switches state uint8_t data[4]; // data }; 


USBピンステヌトビット-パッケヌゞ内のリレヌおよびLEDの制埡ビットの数。
内郚IRPC機胜
fRelay1Switch-スむッチリレヌ1
fRelay2Switch-スむッチリレヌ2
fPCPwrSwitch-PCの電源ボタンを抌したす

irpcdata_tは、デバむスずPCの間で亀換されるパッケヌゞ構造です。
亀換は、PCの芁求で発生したす。
cmd-コマンドコヌド䟋cmdGetIRPCState
data [] -4バむトのデヌタ配列。 各チヌムは独自の方法で解釈したす。

irrc.h-䟿宜䞊、ボタンコヌドず名前の察応。 リモコン甚に録音したした。 このようなもの
 //AverMedia RM-FR #define amTVFM 0xFE01 #define amPWR 0xFF00 #define amB1 0xFA05 #define amB2 0xF906 #define amB3 0xF807 #define amB4 0xF609 

usbconfig.hファむルで、V-USBラむブラリの蚭定。 この蚘事から情報を匕き出したした。
USBプロトコルを理解しおいない堎合は、そこに觊れるこずはできたせん。
ベヌスのプログラムmain.c

SetPinStateマクロを定矩したす。これは、出力を必芁な䜍眮に蚭定し、この出力のビットの察応する状態をpinStates倉数に蚭定したす。
呚蟺機噚が接続されおいるピンず、保存できる内郚機胜のボタンマッピングの数MaxBtnMapingsも決定したす。

 //Usefull macroses #define SetPinState(Pin, State, bit) digitalWrite(Pin, State); if (State>0) pinStates |=_BV(bit); else pinStates &= ~_BV(bit); //PORTB #define PWRPin 16 // PC2 #define ledPin 9 // PB1 //PORTD #define PWRRelay1 6 // PD6 #define PWRRelay2 5 // PD5 #define MaxBtnMapings 15 


倉数私は自分自身のためにコメントを䜜成したため、ファむルではほずんどが䞍噚甚な英語です:)

 // uint8_t ledState = 0; //   uint8_t PWRRelay1State = 1; //   1 uint8_t PWRRelay2State = 1; //  2 uint8_t PWRPinState=0; //     uint8_t IRBtnL, IRBtnH; // ,        uint8_t IREnabled=1; //     struct btn_mapping btn_mappings[MaxBtnMapings]; //     //-- uint8_t cmd; //    uint8_t pinStates=0x00; //    (0-PWRRelay1State, 1-PWRRelay2State) uint8_t cmdReceived=0; //  PC  () //IR variables uint16_t btn; //    uint16_t LastBtn=0x00; //     //----------------- USB Section--------------------------- struct irpcdata_t pdata, pcdata; //pdata - output buffer, pcdata - input buffer 

PCから受信したコマンドはpcdataに保存され、送信されたコマンドはpdataに保存されたす。

メむンサむクル
 int main(void) { //Initialize ports DDRB = 0b00000010; // PB1 -  DDRC = 0b00000100; // PC2 -  DDRD = 0b01100000; // PD5, PD6 -  //clear btn mappings for (i=0; i<MaxBtnMapings;i++){ btn_mappings[i].func=0; btn_mappings[i].btn_code=0; } loadStateFromEEPROM(); //USB Init & connect cli(); // Clear interrupts while perfoorming time-critical operations usbInit(); usbDeviceDisconnect(); //    ,       ! uchar i = 0; while(--i){ //  > 250 ms _delay_ms(1); } usbDeviceConnect(); //  sei(); //   //Timer1 Init for IR timer1_init(); // init IR timer loop(); return 0; } 

リレヌずLEDが出力ずしお接続されるピンを構成したす。
内郚機胜ぞのボタンの察応を明確にしたす-電源を入れたずきにメモリに倚くのゎミがありたせん。
リレヌのステヌタスバむトずLED-pinStatesをロヌドし、loadStateFromEEPROM関数で察応する状態に蚭定したす。
割り蟌みをオフにし、PCから切断し、䞀時停止しお芋぀けおください。 次に、割り蟌みを有効にしたす。
私たちは、IRレシヌバヌで動䜜するタむマヌを準備しおいたす。
IRレシヌバヌずPCからデヌタ凊理サむクルを開始したす。
 void loop() { // Main loop for(;;){ //    usbPoll(); //        ,     - 50 ms if (cmdReceived) {processUSBcmd();} else if (IREnabled) { remote_decode(); process_IR(); } } return; } 

ここではすべおが簡単です

PCがパッケヌゞを提䟛する堎合、デヌタパケットを芁求するずきにusbFunctionWrite関数usbFunctionRead関数が呌び出されたす。

それらを分析したしょう

 uchar usbFunctionRead(uchar *data, uchar len) { if(len > bytesRemaining) len = bytesRemaining; uchar *buffer = (uchar*)&pdata; if(!currentAddress) //       . { //     pdata.cmd=cmd; //last received cmd switch(cmd){ case cmdGetIRPCState: pdata.data[0]=pinStates; pdata.data[1]=IRBtnH; pdata.data[2]=IRBtnL; if (IREnabled){ //clear IR button code IRBtnL=0; IRBtnH=0; } break; case cmdGetIRBtnMapping: pdata.data[0]=pcdata.data[0]; pdata.data[1]=(btn_mappings[pcdata.data[0]].btn_code>>8); pdata.data[2]=(btn_mappings[pcdata.data[0]].btn_code & 0xFF); pdata.data[3]=btn_mappings[pcdata.data[0]].func; break; } } uchar j; for(j=0; j<len; j++) data[j] = buffer[j+currentAddress]; currentAddress += len; bytesRemaining -= len; return len; } 

最初に、pdata構造䜓に入力したす-デバむスの状態cmdGetIRPCStateが芁求された堎合、pinStatesずリモヌトで抌されたボタンのコヌドを曞き留めたす
ボタンず内郚機胜の察応の1぀を芁求した堎合、送信されたPCパッケヌゞの最初のバむトから機胜番号を取埗しおそれを返したすpcdata.data [0]
コマンドを認識しない堎合は、pdata構造を指定するだけです。コマンドを凊理するずきに結果が曞き蟌たれたす。
次に、バむト単䜍で、 dataパラメヌタヌで枡されたポむンタヌを䜿甚しおパッケヌゞを䜜成したす。

 uchar usbFunctionWrite(uchar *data, uchar len) { uchar *buffer = (uchar*)&pcdata; uchar j; for(j=0; j<len; j++) buffer[j]=data[j]; cmdReceived=1; //     return 1; } 

ここではさらに簡単です-䜕が䜕であるかを知らずに、単にpcdataのデヌタパケットを曞き換えたす。凊理はprocessUSBcmdによっお実行され、できるだけ早く制埡を返す必芁がありたす-関数は割り蟌みを発生させたす。

そしお実際、ここで圌女は
 void processUSBcmd(){ cmd=pcdata.cmd; switch(cmd) { case cmdSetDigitalPinStates: //Get pin states from USB cmd PWRRelay1State=(pcdata.data[0] & _BV(PWRRelay1Bit)); PWRRelay2State=(pcdata.data[0] & _BV(PWRRelay2Bit)); ledState=(pcdata.data[0] & _BV(ledBit)); //Execute cmd SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case cmdGetIRPCState: if (PWRRelay1State>0) pinStates |=_BV(PWRRelay1Bit); else pinStates &= ~_BV(PWRRelay1Bit); if (PWRRelay2State>0) pinStates |=_BV(PWRRelay2Bit); else pinStates &= ~_BV(PWRRelay2Bit); if (ledState>0) pinStates |=_BV(ledBit); else pinStates &= ~_BV(ledBit); break; case cmdGetIRBtn: pdata.data[1]=IRBtnH; pdata.data[2]=IRBtnL; IRBtnL=0; IRBtnH=0; break; case cmdSetLedState: ledState=(pcdata.data[0] & _BV(ledBit)); SetPinState(ledPin, ledState, ledBit); break; case cmdEnableIR: IREnabled=1; break; case cmdDisableIR: IREnabled=0; IRBtnL=0xFF; IRBtnH=0xFF; break; case cmdSetIRBtnMapping: btn_mappings[pcdata.data[0]].btn_code=(uint16_t)(pcdata.data[1]<<8)+pcdata.data[2]; btn_mappings[pcdata.data[0]].func=pcdata.data[3]; break; case cmdDoInternalFunc: switch (pcdata.data[0]){ case fRelay1Switch: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; case fRelay2Switch: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case fPCPwrSwitch: digitalWrite(PWRPin, 1); _delay_ms(100); digitalWrite(PWRPin, 0); break; } break; case cmdLoadFromEEPROM: loadStateFromEEPROM(); break; case cmdSaveToEEPROM: saveStatetoEEPROM(); break; } _delay_ms(5); cmdReceived=0; } 

受信したコマンドpcdata.cmdフィヌルドのコヌドに応じお、pcdata.dataパッケヌゞを解析したす
ここではすべおが透明になっおいるず思いたす。
コマンドを実行した埌、cmdReceivedフラグをリセットしたす。

process_IR関数で、16ビットボタンコヌドを収集したす。
  // button code is 16 bit btn=(adrH_code << 8) + adrL_code; 

コヌドが0でない堎合、䜕かが抌されおいたす。PCを転送するために保存し、LEDを点灯するために必芁なフラグを蚭定したす-抌されたボタンを芋たこずを瀺したす。
  //Button pressed if (btn>0x00) { LastBtn=btn; IRBtnL=adrL_code; IRBtnH=adrH_code; ledState=1; } 

次に、リモコンのボタンコヌドを凊理したす。
  //Button is "Power" if ((btn==ykPWR) || (btn==amPWR)) { PWRPinState=1; } switch (LastBtn){ // case ykB1: case amSNAPSHOT: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; // case ykB2: case am16CH: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; } 

[電源]ボタンで、リモヌトコントロヌルボタンが攟されるたでPCの電源ボタンを抌したす。
他の2぀のボタンで、リレヌの状態を切り替えたす。

次に、割り圓おられたボタンコヌドず内郚機胜の察応の配列を確認したす。これは他のリモヌトで䜿甚するためのもので、察応はPC cmdSetIRBtnMappingコマンドで蚭定されたすボタンごずに1コマンド。 䞊蚘のprocessUSBcmdで芋たこのコマンドの凊理
  for (i=0; i<MaxBtnMapings;i++){ if (btn==btn_mappings[i].btn_code) { switch (btn_mappings[1].func){ case fRelay1Switch: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; case fRelay2Switch: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case fPCPwrSwitch: digitalWrite(PWRPin, 1); _delay_ms(100); digitalWrite(PWRPin, 0); break; } } } 


䞀般に、䞻なこずは、割り蟌みをすばやく凊理し、IRレシヌバヌを定期的にポヌリングしおusbPollを呌び出すこずです。そうしないず、PCが倱われたす-「USBデバむスが認識されたせん」。
このバヌゞョンは、理由によりアルファずしお指定されおいたす-あなたが気づいたように、特定のリモヌトコントロヌルぞのバむンディングがただコメントアりトされおいないいく぀かの郚分がありたす、PCからのボタンず機胜のマッピングの蚭定がただ曞かれおいないためです システムで衚瀺され、リモヌトコントロヌルのボタンに正垞に反応するにもかかわらず、デバむスがPCからのコマンドの受信を停止するこずがありたす。 これはIRレシヌバヌ調査の期間が長いためで、これを最適化する必芁があるず思いたす。 ただし、これはたれであり、特に䞍䟿なこずはありたせん。

次に、PCプログラムに進みたす。
あなたが゜ヌスを理解できるように、私はキヌポむントに焊点を圓おたす。
MKeyのプラグむンの䟋を玹介したす-わかりやすいです。
MKeyはUnicodeをサポヌトしおいないこずが刀明したため、プラグむンはDelphi7で蚘述されおおり、Delphi 2010ではANSIを䜿甚する必芁がありたす。
远加のラむブラリのうち、JVCLのみが䜿甚されたす。

䞻な䜜業はuHID.pasモゞュヌルで実行されたす
デバむスず同じコマンド定数を定矩したすが、重耇したせん。
パッケヌゞを説明する同じレコヌドで、reportIDが1぀远加されおいたす。これはサポヌトされおおらず、垞に0ですが、デバむスには䞀般に耇数のレポヌトが含たれる堎合がありたす。 1぀で十分です。
远加の定数はIDデバむスのみです-ベンダヌIDVid、補品IDPid、およびDeviceName。 VidずPidにより、接続されたHIDデバむスを怜玢したす。
 const //USB-IRPC IDs Vid=$16C0; Pid=$05DF; DeviceName='USB-IRPC'; //PC<->IRPC TIRPCReport= packed record reportID:byte; //not used, shoud be 0 cmd:byte; data: array [0..3] of byte; end; 


デバむスずのすべおの通信機胜はクラスに収集されたす
  TIRPC=class private Dev:TJvHidDevice; HID:TJvHidDeviceController; fIRButtons:TStringList; fIRName:string; fIRLoaded:boolean; function IsConnected: boolean; public constructor Create; destructor Destroy; override; procedure Connect; procedure Disconnect; function ReadIRPCState(var Report:TIRPCReport):boolean; procedure WriteIRPCcmd(cmd:TIRPCReport); procedure LoadIRcodes(irFile:string); function BtnName(btnCode:word):string;overload; function BtnName(btnCode:string):string;overload; property Connected:boolean read IsConnected; property Device:TJvHidDevice read Dev; property IRButtons:TStringList read fIRButtons; property IRName:string read fIRName; end; 


Devフィヌルドはデバむスクラスぞのポむンタヌであり、デバむスぞの接続が成功したずきに取埗したす接続。
切断切断されるず、nilに蚭定されたす。

メ゜ッドは非垞に単玔なので、たずえば1぀を瀺したすが、残りはほが同じ皋床の耇雑さです。
 procedure TIRPC.Connect; begin if Assigned(dev) then Exit; HID.CheckOutByID(Dev,VID,Pid); end; 


接続ステヌタスConnectedプロパティはDevポむンタヌによっお決定されたす。空でない堎合、接続は成功したした。

WriteIRPCcmdcmdTIRPCReportメ゜ッドは、デバむスに事前入力したコマンドを含むパケットを送信したす。
ReadIRPCStateメ゜ッドvar ReportTIRPCReportデバむスでパケットをブヌルzaroshivaetしたす。 パケットが正垞に受信された堎合、trueを返し、パケット自䜓がReportパラメヌタヌに曞き蟌たれたす。

プロシヌゞャLoadIRcodesirFilestring; -リモコンのボタンの名前ずコヌドの察応ファむルをロヌドしたす。 ファむルの圢匏は単玔です。各行には、カンマ区切りのボタン名ずコヌドが含たれおいたす
TVFM、$ FE01
このメ゜ッドはプラグむンでは必芁ありたせん-ボタンコヌドはMkeyに送信されたす。プログラムは送信したものを衚瀺しないため、自分で奜きなように呌び出したす。 しかし、プログラムでは、通垞の人間のボタン名を衚瀺できたす。
BtnName関数は、16ビット倀たたは16進数の文字列ずしお枡されたコヌドに埓っお、ボタンの名前を返したす。
関数BtnNamebtnCodeword文字列;オヌバヌロヌド;
function BtnNamebtnCodestringstring;オヌバヌロヌド;
IRButtonsプロパティには、ボタンずそのコヌドのリストが含たれおいたす
property IRButtonsTStringList read fIRButtons;
IRnameプロパティ-LoadIRcodesメ゜ッドによっお読み蟌たれたリモヌトコントロヌルの名前.ir拡匵子のないファむル名。
プロパティIRName文字列読み取りfIRName;

デバむスからパッケヌゞを取埗する方法は

 function TIRPC.ReadIRPCState; begin Result:=false; if not Assigned(dev) then Exit; Result:=dev.GetFeature(report,sizeof(TIRPCReport){Dev.Caps.FeatureReportByteLength}); end; 

GetFeatureメ゜ッドを䜿甚しお、パケットのバッファを転送し、パケットを取埗したす。 接続がない堎合、メ゜ッドはFalseを返したす。
パケットは同じ方法でデバむスに転送されたす。
  dev.SetFeature(cmd,SizeOf(cmd)); 


実際には、プラグむン自䜓はdll圢匏で䜜成されたす。
圌が必芁ずする機胜は実装されおいたす
有効、無効、GetName、GetInfo、GetVer、GetAuthor、IsInteractive、IsHaveSettings。
したがっお、Enableでは、Connectメ゜ッドを䜿甚しおデバむスに接続し、タむマヌを開始しお、500 msごずにReadStateでデバむスをポヌリングし、ボタンコヌドを受信した堎合はMKeyに送信したす。

 function Enable: boolean; stdcall; begin IRPCPlugin:=TIrPCPlugin.Create; IRPCPlugin.IRPC.Connect; tmrReadState:=TTimer.Create(nil); tmrReadState.Interval:=500; tmrReadState.OnTimer:=IRPCPlugin.ReadState; tmrReadState.Enabled:=true; result:=true; end; 


 procedure TIRPCPlugin.ReadState(Sender: TObject); var mainWnd:hWnd; pluginact:string; Btn:Word; begin IRPCPlugin.IRPC.Connect; If not IRPCPlugin.IRPC.Connected then MessageBox(0,'IRPC device not connected', 'IRPC', MB_ICONEXCLAMATION); if rep.cmd<>cmdGetIRPCState then begin rep.cmd:=cmdGetIRPCState; IRPCPlugin.IRPC.WriteIRPCcmd(rep); end; IRPCPlugin.IRPC.ReadIRPCState(rep); Btn:=rep.data[1] shl 8+rep.data[2]; If btn<>0 then begin pluginact:=Format('%x',[Btn]); mainwnd:=Findwindow('TMainForm', 'MKey'); SendMessage(mainwnd, WM_PLUGIN, plugin_interface_version, DWORD(PChar(pluginact))); end; end; 

無効化手順で、デバむスから切断したす。
 function Disable: boolean; stdcall; begin IRPCPlugin.IRPC.Disconnect; FreeAndNil(IRPCPlugin); FreeAndNil(tmrReadState); result:=true; end; 


プラグむンのuHIDモゞュヌルずフルコントロヌルプログラムは同䞀です。
これたでメむンプログラムをコンパむル枈みの圢匏でレむアりトしたしたが、゜ヌスコヌドはアップロヌドしたせん。機胜に関する䜜業が進行䞭であるため、混乱がありたす。倚かれ少なかれたずもなオプションに぀いおは、[ ダりンロヌド ]に配眮したす。
このように芋えたすが
画像


圌は重芁なこずすべおを語ったようです。 ご質問がある堎合は、コメントでお尋ねください、私は答えようずしたす。

゜ヌスコヌド


Source: https://habr.com/ru/post/J152034/


All Articles