First Release

Dependencies:   USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Out_MD.cpp Source File

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