First Release
Embed:
(wiki syntax)
Show/hide line numbers
Out_MD.cpp
00001 #include "NiseKabuto.h" 00002 #include "CFunc_Out_MD.h" 00003 00004 // 32Xスペハリのタイトルがおかしい問題 00005 // ・デジタルモードのとき、発生しない 00006 // サイバースティック読み取りに原因?? 00007 // ・Ack=Hのときにウェイトを入れても効果なし 00008 // ・Start押しっぱなし現象? 00009 // ⇒In_CSの読み取り中に割り込み禁止にすることで解決? 00010 00011 // (Analog)ハングアップ問題; 00012 // この関数はメガドラからの要求の都度、呼ばれているのに、 00013 // _NowWritingが1のため、関数内に入らない問題 00014 // if(_AckCounter < 13) で直った?->だめ 00015 // (Analog)勝手にポーズ押しちゃう問題 00016 // 32Xスペハリ6面くらいまで進んだとき発生/何も操作しない状態で放置しても発生しない 00017 // ACK立ち上げ後のwait変えても効果なし 00018 // 入力クラスからは送られていない->メガドラへの送信フェーズずれた? 00019 // 00020 // ⇒2件への対策として、Analog処理作り直し。データSetにTickerを使用しないようにする。 00021 // 00022 // (Analog)武者アレスタの動作がおかしい 00023 // サイバースティック読み取りルーチンの割り込み禁止のせいかも? 00024 00025 // 00026 // Constructor 00027 // 00028 Out_MD::Out_MD( 00029 PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3, 00030 PinName pn_LH, PinName pn_REQ, PinName pn_ACK, 00031 InputStatus *inputStatus) 00032 : _OUT_D0(pn_D0), _OUT_D1(pn_D1), _OUT_D2(pn_D2), _OUT_D3(pn_D3), _OUT_LH(pn_LH), _INTR_REQ(pn_REQ), _OUT_ACK(pn_ACK), 00033 _DataBus(pn_D0, pn_D1, pn_D2, pn_D3) 00034 { 00035 _InputStatus = inputStatus; 00036 00037 Initialize(); 00038 } 00039 00040 // 00041 // Initialize 00042 // 00043 void Out_MD::Initialize() 00044 { 00045 // Class Variable Setting 00046 00047 // Pin Setting 00048 _INTR_REQ.mode(PullUp); 00049 00050 // Reset Interrupt Setting 00051 DisableModeChecker(); 00052 _INTR_REQ.fall(NULL); 00053 _DigitalStateRenewTicker.detach(); 00054 _DigitalPeriodicPollingTicker.detach(); 00055 _InputMode = _InputStatus->InputDeviceType; 00056 _SwapAC = 0; 00057 _AnalogMUSHAMethod = 0; 00058 // InitInterruptPriority(); 00059 00060 switch(_InputMode) 00061 { 00062 // 00063 // Input: CyberStick ANALOG mode 00064 // 00065 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG: 00066 // Class Variable Setting 00067 _TransferSpeed = TRANSFERSPEED_1_4__MICROSEC; // もっとも遅い速度から開始 00068 // _TransferSpeed = TRANSFERSPEED_MAX__MICROSEC; // 最速速度から開始 00069 /* 00070 if( 00071 !((_InputStatus->Buttons) & 0x00003) // Start+Selectが押されてる 00072 ) 00073 { 00074 _AnalogMUSHAMethod = 1; // 武者アレスタ向けAnalog処理 有効 00075 } 00076 */ 00077 00078 // Interrupt Setting 00079 _INTR_REQ.fall(this, &Out_MD::ISR_Analog_ReqFall); 00080 00081 00082 // Initialize pin status 00083 _OUT_D0 = 1; 00084 _OUT_D1 = 1; 00085 _OUT_D2 = 1; 00086 _OUT_D3 = 1; 00087 _OUT_LH = 0; 00088 // _OUT_LH = 1; // 常にH版 00089 _OUT_ACK = 1; // output ACK = H 00090 break; 00091 00092 // 00093 // Input: CyberStick DIGITAL mode 00094 // Input: MD6B 00095 // 00096 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL: 00097 case NiseKabuto::CONFIG_INMODE_MD6B: 00098 default: 00099 if( 00100 !((_InputStatus->Buttons) & 0x00020) // Cが押されてる 00101 ) 00102 { 00103 _SwapAC = 1; 00104 } 00105 00106 Cfunc_Out_MD_Initialize( 00107 &_OUT_D0, &_OUT_D1, &_OUT_D2, &_OUT_D3, 00108 &_OUT_LH, &_INTR_REQ, &_OUT_ACK, 00109 &_ButtonStatus, 00110 _SwapAC 00111 ); 00112 00113 EnableDigitalStateRenew(); 00114 RestartDigitalPeriodicPolling(); 00115 break; 00116 } 00117 00118 EnableModeChecker(); 00119 } 00120 /* 00121 void Out_MD::InitInterruptPriority(void) 00122 { 00123 // http://mbed.org/users/earlz/code/MbedConsole/file/370b9e559f92/main.cpp 00124 00125 NVIC_SetPriority(NonMaskableInt_IRQn, 100 ); 00126 NVIC_SetPriority(MemoryManagement_IRQn, 100); 00127 00128 NVIC_SetPriority(BusFault_IRQn, 100); 00129 NVIC_SetPriority(UsageFault_IRQn, 100); 00130 NVIC_SetPriority(SVCall_IRQn, 100); 00131 NVIC_SetPriority(DebugMonitor_IRQn, 100); 00132 NVIC_SetPriority(PendSV_IRQn, 100); 00133 NVIC_SetPriority(SysTick_IRQn, 50); 00134 NVIC_SetPriority(WDT_IRQn, 100); 00135 NVIC_SetPriority(TIMER0_IRQn, 85); 00136 NVIC_SetPriority(TIMER1_IRQn, 85); 00137 NVIC_SetPriority(TIMER2_IRQn, 85); 00138 NVIC_SetPriority(TIMER3_IRQn, 85); 00139 NVIC_SetPriority(UART0_IRQn, 75); 00140 NVIC_SetPriority(UART1_IRQn, 100); 00141 NVIC_SetPriority(UART2_IRQn, 100); 00142 NVIC_SetPriority(UART3_IRQn, 100); 00143 00144 NVIC_SetPriority(PWM1_IRQn, 100); 00145 NVIC_SetPriority(I2C0_IRQn, 100); 00146 NVIC_SetPriority(I2C1_IRQn, 100); 00147 NVIC_SetPriority(I2C2_IRQn, 100); 00148 NVIC_SetPriority(SPI_IRQn, 100); 00149 NVIC_SetPriority(SSP0_IRQn, 100); 00150 NVIC_SetPriority(SSP1_IRQn, 100); 00151 NVIC_SetPriority(PLL0_IRQn, 100); 00152 NVIC_SetPriority(RTC_IRQn, 100); 00153 NVIC_SetPriority(EINT0_IRQn, 100); 00154 NVIC_SetPriority(EINT1_IRQn, 100); 00155 00156 NVIC_SetPriority(EINT2_IRQn, 100); 00157 NVIC_SetPriority(EINT3_IRQn, 0); // 最高 00158 NVIC_SetPriority(ADC_IRQn, 100); 00159 NVIC_SetPriority(BOD_IRQn, 100); 00160 NVIC_SetPriority(USB_IRQn, 100); 00161 NVIC_SetPriority(CAN_IRQn, 100); 00162 NVIC_SetPriority(DMA_IRQn, 100); 00163 00164 NVIC_SetPriority(I2S_IRQn, 100); 00165 NVIC_SetPriority(ENET_IRQn, 100); 00166 NVIC_SetPriority(RIT_IRQn, 100); 00167 NVIC_SetPriority(MCPWM_IRQn, 100); 00168 NVIC_SetPriority(QEI_IRQn, 100); 00169 NVIC_SetPriority(PLL1_IRQn, 100); 00170 00171 } 00172 */ 00173 00174 00175 // 00176 // Set output pin status 00177 // 00178 // Input: 00179 // val: status of pins. 00180 // (MSB) ...|D3|D2|D1|D0| (LSB) 00181 // 00182 void Out_MD::SetPinValue(int val) 00183 { 00184 // 意味ない 00185 /* 00186 _DataBus = val & 0x0f; 00187 */ 00188 00189 _OUT_D0 = val & 0x01? 1 : 0; 00190 _OUT_D1 = val & 0x02? 1 : 0; 00191 _OUT_D2 = val & 0x04? 1 : 0; 00192 _OUT_D3 = val & 0x08? 1 : 0; 00193 } 00194 00195 00196 00197 00198 00199 // 00200 // 出力更新Ticker処理 00201 // 00202 void Out_MD::DigitalStateRenewMethod(void) 00203 { 00204 00205 _ButtonStatus = _InputStatus->Buttons; 00206 00207 if( (_INTR_REQ) ) 00208 { 00209 RenewDigitalPadStatus(1); 00210 } 00211 else 00212 { 00213 RenewDigitalPadStatus(0); 00214 } 00215 00216 } 00217 00218 // 00219 // デジタルパッドの該当phaseのデータを出力 00220 // 00221 void Out_MD::RenewDigitalPadStatus(char phase) 00222 { 00223 00224 switch( phase ) 00225 { 00226 case 0: 00227 // phase0出力 00228 00229 // サイバースティックのデジタルモードではStartボタンは読み取れない 00230 // (カブトガニは可能) 00231 // MD Start 00232 _OUT_ACK = ( (_ButtonStatus & 0x00010) ? 1 : 0 ); // Digital "D" 00233 00234 // MD A 00235 if(_SwapAC) 00236 { 00237 _OUT_LH =( (_ButtonStatus & 0x00020) ? 1 : 0 ); // Digital "C" 00238 } 00239 else 00240 { 00241 _OUT_LH = ( (_ButtonStatus & 0x00200) ? 1 : 0 ); // Digital "A" 00242 } 00243 _OUT_D3 = ( 0 ); 00244 _OUT_D2 = ( 0 ); 00245 00246 // MD Down 00247 _OUT_D1 = ( (_ButtonStatus & 0x01000) ? 1 : 0 ); // Digital "Down" 00248 // MD Up 00249 _OUT_D0 = ( (_ButtonStatus & 0x02000) ? 1 : 0 ); // Digital "Up" 00250 break; 00251 00252 case 1: 00253 // phase1出力 00254 00255 // MD C 00256 if(_SwapAC) 00257 { 00258 _OUT_ACK = ( (_ButtonStatus & 0x00200) ? 1 : 0 ); // Digital "A" 00259 } 00260 else 00261 { 00262 _OUT_ACK =( (_ButtonStatus & 0x00020) ? 1 : 0 ); // Digital "C" 00263 } 00264 // MD B 00265 _OUT_LH = ( (_ButtonStatus & 0x00100) ? 1 : 0 ); // Digital "B" 00266 // MD Right 00267 _OUT_D3 = ( (_ButtonStatus & 0x00400) ? 1 : 0 ); // Digital "Right" 00268 // MD Left 00269 _OUT_D2 = ( (_ButtonStatus & 0x00800) ? 1 : 0 ); // Digital "Left" 00270 // MD Down 00271 _OUT_D1 = ( (_ButtonStatus & 0x01000) ? 1 : 0 ); // Digital "Down" 00272 // MD Up 00273 _OUT_D0 = ( (_ButtonStatus & 0x02000) ? 1 : 0 ); // Digital "Up" 00274 break; 00275 00276 default: 00277 break; 00278 } 00279 } 00280 00281 00282 00283 // 00284 // 周期ポーリングの休みの間、デジタルパッド更新を行う/行わない 00285 // 00286 void Out_MD::EnableDigitalStateRenew(void) 00287 { 00288 _DigitalStateRenewTicker.attach_us( 00289 this, 00290 &Out_MD::DigitalStateRenewMethod, 00291 DIGITAL_STATE_RENEW_INTERVAL__MICROSEC 00292 ); 00293 } 00294 void Out_MD::DisableDigitalStateRenew(void) 00295 { 00296 _DigitalStateRenewTicker.detach(); 00297 } 00298 00299 // 00300 // 周期ポーリングの開始(周期?のリセット) 00301 // 00302 void Out_MD::RestartDigitalPeriodicPolling(void) 00303 { 00304 _DigitalPeriodicPollingTicker.detach(); 00305 00306 _DigitalPeriodicPollingTicker.attach_us( 00307 this, 00308 &Out_MD::DigitalPeriodicPollingMethod, 00309 DIGITAL_PERIODICPOLLING_INTERVAL__MICROSEC 00310 ); 00311 } 00312 00313 // 00314 // 周期ポーリング処理 00315 // 00316 void Out_MD::DigitalPeriodicPollingMethod(void) 00317 { 00318 // 入力タイマ処理&休みの間の更新処理 止める 00319 // DisableInput(); 00320 // DisableDigitalStateRenew(); 00321 00322 // 割り込み禁止 00323 __disable_irq(); 00324 00325 Cfunc_DigitalPeriodicPollingMethod(); 00326 00327 // 割り込み再開 00328 __enable_irq(); 00329 00330 00331 // 入力タイマ処理&休みの間の更新処理 再開 00332 // EnableDigitalStateRenew(); 00333 // EnableInput(); 00334 00335 RestartDigitalPeriodicPolling(); 00336 00337 } 00338 00339 00340 // 00341 // InputStatusのデジタルモード・アナログモード切替を見張る 00342 // 00343 void Out_MD::EnableModeChecker(void) 00344 { 00345 _ModeChecker.detach(); 00346 _ModeChecker.attach_us( 00347 this, 00348 &Out_MD::ModeCheckerMethod, 00349 MODECHECK_INTERVAL__MICROSEC 00350 ); 00351 } 00352 00353 void Out_MD::DisableModeChecker(void) 00354 { 00355 _ModeChecker.detach(); 00356 } 00357 00358 void Out_MD::ModeCheckerMethod(void) 00359 { 00360 // デジタル・アナログモードチェック 00361 if(_InputStatus->InputDeviceType != _InputMode) 00362 { 00363 // モード変わってたら再Initialize 00364 Initialize(); 00365 } 00366 } 00367 00368 // 00369 // アナログスティック用:指定Phaseのデータを出力する 00370 // 00371 // 関数内部で_TransferSpeedを変化させている 00372 // 00373 // 00374 void Out_MD::SetData_Analog_PhaseOf(char phase) 00375 { 00376 // Get InputStatus 00377 InputStatus *inp = _InputStatus; 00378 00379 // Set Data 00380 switch(phase) 00381 { 00382 case 0: 00383 // このとき、まだ1回目のAck立ち下げは行っていない 00384 SetPinValue( 00385 (((inp->Buttons) & 0x000c)) | // E1E2 00386 (((inp->Buttons) & 0x0003)) // FG 00387 ); 00388 break; 00389 00390 case 1: 00391 // 1回目のAck立ち下げ終了済み 00392 SetPinValue( 00393 (((inp->Buttons) & 0x0300) >> 6) | // AB 00394 (((inp->Buttons) & 0x0030) >> 4) // CD 00395 ); 00396 break; 00397 00398 case 2: 00399 // 2回目のAck立ち下げ終了済み 00400 SetPinValue( 00401 ((inp->Ch1) & 0x0f0) >> 4 // 2H 00402 // 0xff 00403 ); 00404 // 最速モード 00405 if(_INTR_REQ==1) 00406 { 00407 if(_TransferSpeed > TRANSFERSPEED_MAX__MICROSEC) 00408 { 00409 // printf("MAX!!!"); 00410 _TransferSpeed = TRANSFERSPEED_MAX__MICROSEC; 00411 } 00412 } 00413 break; 00414 00415 case 3: 00416 SetPinValue( 00417 ((inp->Ch0) & 0x0f0) >> 4 // 1H 00418 // 0xff 00419 ); 00420 break; 00421 00422 case 4: 00423 SetPinValue( 00424 ((inp->Ch3) & 0x0f0) >> 4 // 4H 00425 ); 00426 00427 // 1/2倍速 00428 if(_INTR_REQ==1) 00429 { 00430 if(_TransferSpeed > TRANSFERSPEED_1_2__MICROSEC) 00431 { 00432 // printf("1/2!!!"); 00433 _TransferSpeed = TRANSFERSPEED_1_2__MICROSEC; 00434 } 00435 } 00436 break; 00437 00438 case 5: 00439 SetPinValue( 00440 ((inp->Ch2) & 0x0f0) >> 4 // 3H 00441 ); 00442 break; 00443 00444 case 6: 00445 SetPinValue( 00446 (inp->Ch1) & 0x00f // 2L 00447 ); 00448 // 1/3倍速 00449 if(_INTR_REQ==1) 00450 { 00451 if(_TransferSpeed > TRANSFERSPEED_1_3__MICROSEC) 00452 { 00453 // printf("1/3!!!"); 00454 _TransferSpeed = TRANSFERSPEED_1_3__MICROSEC; 00455 } 00456 } 00457 break; 00458 00459 case 7: 00460 SetPinValue( 00461 (inp->Ch0) & 0x00f // 1L 00462 ); 00463 break; 00464 00465 case 8: 00466 SetPinValue( 00467 (inp->Ch3) & 0x00f // 4L 00468 ); 00469 00470 // 1/4倍速 00471 // いらない気もする 00472 if(_INTR_REQ==1) 00473 { 00474 if(_TransferSpeed >= TRANSFERSPEED_1_4__MICROSEC) 00475 { 00476 // printf("1/4!!!"); 00477 _TransferSpeed = TRANSFERSPEED_1_4__MICROSEC; 00478 } 00479 } 00480 break; 00481 00482 case 9: 00483 SetPinValue( 00484 (inp->Ch2) & 0x00f // 3L 00485 //カブトガニは固定値送ってるかも? 00486 //0x0a 00487 ); 00488 break; 00489 00490 case 10: 00491 SetPinValue(0xff); 00492 break; 00493 00494 case 11: 00495 SetPinValue( 00496 (((inp->Buttons) & 0x0300) >> 6) | // AB 00497 (((inp->Buttons) & 0x00c0)) >>6 // A+A' B+B' 00498 ); 00499 break; 00500 00501 00502 default: 00503 SetPinValue(0xff); 00504 break; 00505 00506 } 00507 } 00508 00509 // 00510 // ISR for REQ=L from Megadrive 00511 // 00512 void Out_MD::ISR_Analog_ReqFall() 00513 { 00514 // 全体が間延び数現象の原因? 00515 // __disable_irq(); 00516 00517 // デバッグ用:この関数が呼ばれるたび+1される 00518 (_InputStatus->Temp[2])++; 00519 00520 // 00521 // from AJOY_SUB.DOC: 00522 // -------------- 00523 //◆転送速度(各サイクルタイム) 00524 // 00525 // ┌──────┬────┐ 00526 // │ 最速モード │ 50 │ 00527 // │ 1/2倍速 │ 96 │ 00528 // │ 1/3倍速 │ 144 │ 00529 // │ 1/4倍速 │ 192 │ 00530 // └──────┴────┘ 00531 // (単位:μsec) 00532 // -------------- 00533 // ジョイコンはデータ転送要求(割り込み)により 00534 // データ転送サイクルを6回繰り返す。 00535 // -------------- 00536 // 00537 // ↑ 以下のようなことを言いたかったのか? 00538 // ・サイバースティックは12回Ackが下がり、1回~11回目に 00539 // 『◆アナログモード時のデータ』に沿ったデータを送る。 00540 // (12回目のデータは不明) 00541 // ・『データ転送サイクル』はAck2回分である(LHピンのLとHの組が1サイクル) 00542 // ・サイクルタイム=『データ転送サイクル』の周期 00543 // 00544 // このように仮定すると、Ack1回分のデータは 00545 // サイクルタイム/2の間、保持していなければならないことになる。 00546 // なので、Ack1回分のデータを、サイクルタイム/2の周期で出力することとする。 00547 // 00548 // -------------- 00549 // AJOY.DOC 00550 //※通信速度を最高速に設定した場合、アナログジョイスティックを 00551 // リセットしないかぎり、遅い速度への変更は行われない。 00552 // -------------- 00553 // 本物は遅い方向には速度を変えさせない 00554 00555 char phase = 0; // データPhase: 0からスタート 00556 char savePhase; 00557 int us_Int1, us_Int2, us_Int3, us_Int4; 00558 00559 int time10, time1, time20, time2, time3, time4, time5, time6; 00560 00561 // 32Xスペハリ対策 00562 // 待つ 00563 // wait_us(40); 00564 NiseKabuto::WaitUs(20); 00565 00566 // 現在の_TransferSpeedを元に、各時間を算出 00567 us_Int1 = (int)(_TransferSpeed /12.5 ); // 速度MAX時: 4us 00568 us_Int2 = (int)(_TransferSpeed / 8.3 ); // 速度MAX時: 6us 00569 us_Int3 = (int)(_TransferSpeed / 4.17); // 速度MAX時: 12us 00570 us_Int4 = (int)(_TransferSpeed / 3.57); // 速度MAX時: 14us 00571 00572 time10= us_Int1; 00573 time20= us_Int4; 00574 00575 time1 = us_Int2; 00576 time2 = us_Int3; 00577 time3 = us_Int3; 00578 time4 = us_Int1; 00579 time5 = us_Int3; 00580 time6 = us_Int1; 00581 00582 // AckはHから開始 00583 // LHはLから開始 00584 _OUT_ACK = 1; 00585 _OUT_LH = 0; 00586 00587 00588 00589 // サイクルタイム6回分=phase0-12 00590 00591 // 武者アレスタにおいて、サイクル2(phase2,3)のみ、値を送ると 00592 // タイトル画面でボタンが押されてしまう不具合あり。 00593 // このため、サイクル2は別のタイミングでデータを送付する。 00594 // その直前のサイクル1も改める。 00595 00596 00597 00598 // サイクル1-6 00599 for(int i=0; i<6; i++) 00600 { 00601 if(i==0) 00602 { 00603 // No1 00604 _OUT_ACK = 1; 00605 _OUT_LH = 0; 00606 NiseKabuto::WaitUs(time10); 00607 00608 // No2 00609 savePhase = phase; 00610 SetData_Analog_PhaseOf(phase++); 00611 _OUT_ACK = 1; 00612 _OUT_LH = 0; 00613 NiseKabuto::WaitUs(time20); 00614 } 00615 else 00616 { 00617 // No1 00618 _OUT_ACK = 1; 00619 _OUT_LH = 0; 00620 NiseKabuto::WaitUs(time1-5); 00621 00622 // No2 00623 savePhase = phase; 00624 SetData_Analog_PhaseOf(phase++); 00625 _OUT_ACK = 1; 00626 _OUT_LH = 0; 00627 NiseKabuto::WaitUs(time2); 00628 } 00629 00630 // No3 00631 _OUT_ACK = 0; 00632 _OUT_LH = 0; 00633 NiseKabuto::WaitUs(time3); 00634 00635 // No4 00636 _OUT_ACK = 1; 00637 _OUT_LH = 1; 00638 SetData_Analog_PhaseOf(phase++); 00639 NiseKabuto::WaitUs(time4-3); 00640 00641 // No5 00642 _OUT_ACK = 0; 00643 _OUT_LH = 1; 00644 NiseKabuto::WaitUs(time5); 00645 00646 // No6 00647 _OUT_ACK = 1; 00648 _OUT_LH = 1; 00649 NiseKabuto::WaitUs(time6-1); 00650 00651 // No7 00652 _OUT_LH = 0; 00653 SetData_Analog_PhaseOf(savePhase); 00654 } 00655 /* 00656 // サイクル1-6 00657 for(int i=0; i<6; i++) 00658 { 00659 if(i==0) 00660 { 00661 // No1 00662 _OUT_ACK = 1; 00663 _OUT_LH = 0; 00664 NiseKabuto::WaitUs(time10-2); 00665 00666 // No2 00667 savePhase = phase; 00668 SetData_Analog_PhaseOf(phase++); 00669 _OUT_ACK = 1; 00670 _OUT_LH = 0; 00671 NiseKabuto::WaitUs(time20-2); 00672 } 00673 else 00674 { 00675 // No1 00676 _OUT_ACK = 1; 00677 _OUT_LH = 0; 00678 NiseKabuto::WaitUs(time1-3); 00679 00680 // No2 00681 savePhase = phase; 00682 SetData_Analog_PhaseOf(phase++); 00683 _OUT_ACK = 1; 00684 _OUT_LH = 0; 00685 NiseKabuto::WaitUs(time2-2); 00686 } 00687 00688 // No3 00689 _OUT_ACK = 0; 00690 _OUT_LH = 0; 00691 NiseKabuto::WaitUs(time3-1); 00692 00693 // No4 00694 _OUT_ACK = 1; 00695 _OUT_LH = 1; 00696 SetData_Analog_PhaseOf(phase++); 00697 NiseKabuto::WaitUs(time4-3); 00698 00699 // No5 00700 _OUT_ACK = 0; 00701 _OUT_LH = 1; 00702 NiseKabuto::WaitUs(time5); 00703 00704 // No6 00705 _OUT_ACK = 1; 00706 _OUT_LH = 1; 00707 NiseKabuto::WaitUs(time6-1); 00708 00709 // No7 00710 _OUT_LH = 0; 00711 SetData_Analog_PhaseOf(savePhase); 00712 } 00713 */ 00714 _OUT_LH = 0; 00715 00716 // __enable_irq(); 00717 00718 } 00719 00720 00721 00722 00723 00724 00725 00726 void Out_MD::SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void)) 00727 { 00728 StartInputFunction = startInputFunction; 00729 StopInputFunction = stopInputFunction; 00730 } 00731 00732 void Out_MD::EnableInput(void) 00733 { 00734 if(_InputInstance && StartInputMethod) 00735 { 00736 (_InputInstance->*StartInputMethod)(); 00737 } 00738 else if(StartInputFunction) 00739 { 00740 StartInputFunction(); 00741 } 00742 } 00743 00744 void Out_MD::DisableInput(void) 00745 { 00746 if(_InputInstance && StopInputMethod) 00747 { 00748 (_InputInstance->*StopInputMethod)(); 00749 } 00750 else if(StopInputFunction) 00751 { 00752 StopInputFunction(); 00753 } 00754 } 00755
Generated on Thu Jul 14 2022 14:49:55 by 1.7.2