First Release

Dependencies:   USBDevice

Committer:
sankichi
Date:
Sat Jul 27 14:19:33 2013 +0000
Revision:
1:6c392ebcd4d4
Parent:
0:e1265f6b3565
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sankichi 0:e1265f6b3565 1 #include "NiseKabuto.h"
sankichi 0:e1265f6b3565 2 #include "CFunc_Out_MD.h"
sankichi 0:e1265f6b3565 3
sankichi 0:e1265f6b3565 4 // 32Xスペハリのタイトルがおかしい問題
sankichi 0:e1265f6b3565 5 // ・デジタルモードのとき、発生しない
sankichi 0:e1265f6b3565 6 // サイバースティック読み取りに原因??
sankichi 0:e1265f6b3565 7 // ・Ack=Hのときにウェイトを入れても効果なし
sankichi 0:e1265f6b3565 8 // ・Start押しっぱなし現象?
sankichi 0:e1265f6b3565 9 // ⇒In_CSの読み取り中に割り込み禁止にすることで解決?
sankichi 0:e1265f6b3565 10
sankichi 0:e1265f6b3565 11 // (Analog)ハングアップ問題;
sankichi 0:e1265f6b3565 12 // この関数はメガドラからの要求の都度、呼ばれているのに、
sankichi 0:e1265f6b3565 13 // _NowWritingが1のため、関数内に入らない問題
sankichi 0:e1265f6b3565 14 // if(_AckCounter < 13) で直った?->だめ
sankichi 0:e1265f6b3565 15 // (Analog)勝手にポーズ押しちゃう問題
sankichi 0:e1265f6b3565 16 // 32Xスペハリ6面くらいまで進んだとき発生/何も操作しない状態で放置しても発生しない
sankichi 0:e1265f6b3565 17 // ACK立ち上げ後のwait変えても効果なし
sankichi 0:e1265f6b3565 18 // 入力クラスからは送られていない->メガドラへの送信フェーズずれた?
sankichi 0:e1265f6b3565 19 //
sankichi 0:e1265f6b3565 20 // ⇒2件への対策として、Analog処理作り直し。データSetにTickerを使用しないようにする。
sankichi 0:e1265f6b3565 21 //
sankichi 0:e1265f6b3565 22 // (Analog)武者アレスタの動作がおかしい
sankichi 0:e1265f6b3565 23 // サイバースティック読み取りルーチンの割り込み禁止のせいかも?
sankichi 0:e1265f6b3565 24
sankichi 0:e1265f6b3565 25 //
sankichi 0:e1265f6b3565 26 // Constructor
sankichi 0:e1265f6b3565 27 //
sankichi 0:e1265f6b3565 28 Out_MD::Out_MD(
sankichi 0:e1265f6b3565 29 PinName pn_D0, PinName pn_D1, PinName pn_D2, PinName pn_D3,
sankichi 0:e1265f6b3565 30 PinName pn_LH, PinName pn_REQ, PinName pn_ACK,
sankichi 0:e1265f6b3565 31 InputStatus *inputStatus)
sankichi 0:e1265f6b3565 32 : _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),
sankichi 0:e1265f6b3565 33 _DataBus(pn_D0, pn_D1, pn_D2, pn_D3)
sankichi 0:e1265f6b3565 34 {
sankichi 0:e1265f6b3565 35 _InputStatus = inputStatus;
sankichi 0:e1265f6b3565 36
sankichi 0:e1265f6b3565 37 Initialize();
sankichi 0:e1265f6b3565 38 }
sankichi 0:e1265f6b3565 39
sankichi 0:e1265f6b3565 40 //
sankichi 0:e1265f6b3565 41 // Initialize
sankichi 0:e1265f6b3565 42 //
sankichi 0:e1265f6b3565 43 void Out_MD::Initialize()
sankichi 0:e1265f6b3565 44 {
sankichi 0:e1265f6b3565 45 // Class Variable Setting
sankichi 0:e1265f6b3565 46
sankichi 0:e1265f6b3565 47 // Pin Setting
sankichi 0:e1265f6b3565 48 _INTR_REQ.mode(PullUp);
sankichi 0:e1265f6b3565 49
sankichi 0:e1265f6b3565 50 // Reset Interrupt Setting
sankichi 0:e1265f6b3565 51 DisableModeChecker();
sankichi 0:e1265f6b3565 52 _INTR_REQ.fall(NULL);
sankichi 0:e1265f6b3565 53 _DigitalStateRenewTicker.detach();
sankichi 0:e1265f6b3565 54 _DigitalPeriodicPollingTicker.detach();
sankichi 0:e1265f6b3565 55 _InputMode = _InputStatus->InputDeviceType;
sankichi 0:e1265f6b3565 56 _SwapAC = 0;
sankichi 0:e1265f6b3565 57 _AnalogMUSHAMethod = 0;
sankichi 0:e1265f6b3565 58 // InitInterruptPriority();
sankichi 0:e1265f6b3565 59
sankichi 0:e1265f6b3565 60 switch(_InputMode)
sankichi 0:e1265f6b3565 61 {
sankichi 0:e1265f6b3565 62 //
sankichi 0:e1265f6b3565 63 // Input: CyberStick ANALOG mode
sankichi 0:e1265f6b3565 64 //
sankichi 0:e1265f6b3565 65 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_ANALOG:
sankichi 0:e1265f6b3565 66 // Class Variable Setting
sankichi 0:e1265f6b3565 67 _TransferSpeed = TRANSFERSPEED_1_4__MICROSEC; // もっとも遅い速度から開始
sankichi 0:e1265f6b3565 68 // _TransferSpeed = TRANSFERSPEED_MAX__MICROSEC; // 最速速度から開始
sankichi 0:e1265f6b3565 69 /*
sankichi 0:e1265f6b3565 70 if(
sankichi 0:e1265f6b3565 71 !((_InputStatus->Buttons) & 0x00003) // Start+Selectが押されてる
sankichi 0:e1265f6b3565 72 )
sankichi 0:e1265f6b3565 73 {
sankichi 0:e1265f6b3565 74 _AnalogMUSHAMethod = 1; // 武者アレスタ向けAnalog処理 有効
sankichi 0:e1265f6b3565 75 }
sankichi 0:e1265f6b3565 76 */
sankichi 0:e1265f6b3565 77
sankichi 0:e1265f6b3565 78 // Interrupt Setting
sankichi 0:e1265f6b3565 79 _INTR_REQ.fall(this, &Out_MD::ISR_Analog_ReqFall);
sankichi 0:e1265f6b3565 80
sankichi 0:e1265f6b3565 81
sankichi 0:e1265f6b3565 82 // Initialize pin status
sankichi 0:e1265f6b3565 83 _OUT_D0 = 1;
sankichi 0:e1265f6b3565 84 _OUT_D1 = 1;
sankichi 0:e1265f6b3565 85 _OUT_D2 = 1;
sankichi 0:e1265f6b3565 86 _OUT_D3 = 1;
sankichi 0:e1265f6b3565 87 _OUT_LH = 0;
sankichi 0:e1265f6b3565 88 // _OUT_LH = 1; // 常にH版
sankichi 0:e1265f6b3565 89 _OUT_ACK = 1; // output ACK = H
sankichi 0:e1265f6b3565 90 break;
sankichi 0:e1265f6b3565 91
sankichi 0:e1265f6b3565 92 //
sankichi 0:e1265f6b3565 93 // Input: CyberStick DIGITAL mode
sankichi 0:e1265f6b3565 94 // Input: MD6B
sankichi 0:e1265f6b3565 95 //
sankichi 0:e1265f6b3565 96 case NiseKabuto::CONFIG_INMODE_CYBERSTICK_DIGITAL:
sankichi 0:e1265f6b3565 97 case NiseKabuto::CONFIG_INMODE_MD6B:
sankichi 0:e1265f6b3565 98 default:
sankichi 0:e1265f6b3565 99 if(
sankichi 0:e1265f6b3565 100 !((_InputStatus->Buttons) & 0x00020) // Cが押されてる
sankichi 0:e1265f6b3565 101 )
sankichi 0:e1265f6b3565 102 {
sankichi 0:e1265f6b3565 103 _SwapAC = 1;
sankichi 0:e1265f6b3565 104 }
sankichi 0:e1265f6b3565 105
sankichi 0:e1265f6b3565 106 Cfunc_Out_MD_Initialize(
sankichi 0:e1265f6b3565 107 &_OUT_D0, &_OUT_D1, &_OUT_D2, &_OUT_D3,
sankichi 0:e1265f6b3565 108 &_OUT_LH, &_INTR_REQ, &_OUT_ACK,
sankichi 0:e1265f6b3565 109 &_ButtonStatus,
sankichi 0:e1265f6b3565 110 _SwapAC
sankichi 0:e1265f6b3565 111 );
sankichi 0:e1265f6b3565 112
sankichi 0:e1265f6b3565 113 EnableDigitalStateRenew();
sankichi 0:e1265f6b3565 114 RestartDigitalPeriodicPolling();
sankichi 0:e1265f6b3565 115 break;
sankichi 0:e1265f6b3565 116 }
sankichi 0:e1265f6b3565 117
sankichi 0:e1265f6b3565 118 EnableModeChecker();
sankichi 0:e1265f6b3565 119 }
sankichi 0:e1265f6b3565 120 /*
sankichi 0:e1265f6b3565 121 void Out_MD::InitInterruptPriority(void)
sankichi 0:e1265f6b3565 122 {
sankichi 0:e1265f6b3565 123 // http://mbed.org/users/earlz/code/MbedConsole/file/370b9e559f92/main.cpp
sankichi 0:e1265f6b3565 124
sankichi 0:e1265f6b3565 125 NVIC_SetPriority(NonMaskableInt_IRQn, 100 );
sankichi 0:e1265f6b3565 126 NVIC_SetPriority(MemoryManagement_IRQn, 100);
sankichi 0:e1265f6b3565 127
sankichi 0:e1265f6b3565 128 NVIC_SetPriority(BusFault_IRQn, 100);
sankichi 0:e1265f6b3565 129 NVIC_SetPriority(UsageFault_IRQn, 100);
sankichi 0:e1265f6b3565 130 NVIC_SetPriority(SVCall_IRQn, 100);
sankichi 0:e1265f6b3565 131 NVIC_SetPriority(DebugMonitor_IRQn, 100);
sankichi 0:e1265f6b3565 132 NVIC_SetPriority(PendSV_IRQn, 100);
sankichi 0:e1265f6b3565 133 NVIC_SetPriority(SysTick_IRQn, 50);
sankichi 0:e1265f6b3565 134 NVIC_SetPriority(WDT_IRQn, 100);
sankichi 0:e1265f6b3565 135 NVIC_SetPriority(TIMER0_IRQn, 85);
sankichi 0:e1265f6b3565 136 NVIC_SetPriority(TIMER1_IRQn, 85);
sankichi 0:e1265f6b3565 137 NVIC_SetPriority(TIMER2_IRQn, 85);
sankichi 0:e1265f6b3565 138 NVIC_SetPriority(TIMER3_IRQn, 85);
sankichi 0:e1265f6b3565 139 NVIC_SetPriority(UART0_IRQn, 75);
sankichi 0:e1265f6b3565 140 NVIC_SetPriority(UART1_IRQn, 100);
sankichi 0:e1265f6b3565 141 NVIC_SetPriority(UART2_IRQn, 100);
sankichi 0:e1265f6b3565 142 NVIC_SetPriority(UART3_IRQn, 100);
sankichi 0:e1265f6b3565 143
sankichi 0:e1265f6b3565 144 NVIC_SetPriority(PWM1_IRQn, 100);
sankichi 0:e1265f6b3565 145 NVIC_SetPriority(I2C0_IRQn, 100);
sankichi 0:e1265f6b3565 146 NVIC_SetPriority(I2C1_IRQn, 100);
sankichi 0:e1265f6b3565 147 NVIC_SetPriority(I2C2_IRQn, 100);
sankichi 0:e1265f6b3565 148 NVIC_SetPriority(SPI_IRQn, 100);
sankichi 0:e1265f6b3565 149 NVIC_SetPriority(SSP0_IRQn, 100);
sankichi 0:e1265f6b3565 150 NVIC_SetPriority(SSP1_IRQn, 100);
sankichi 0:e1265f6b3565 151 NVIC_SetPriority(PLL0_IRQn, 100);
sankichi 0:e1265f6b3565 152 NVIC_SetPriority(RTC_IRQn, 100);
sankichi 0:e1265f6b3565 153 NVIC_SetPriority(EINT0_IRQn, 100);
sankichi 0:e1265f6b3565 154 NVIC_SetPriority(EINT1_IRQn, 100);
sankichi 0:e1265f6b3565 155
sankichi 0:e1265f6b3565 156 NVIC_SetPriority(EINT2_IRQn, 100);
sankichi 0:e1265f6b3565 157 NVIC_SetPriority(EINT3_IRQn, 0); // 最高
sankichi 0:e1265f6b3565 158 NVIC_SetPriority(ADC_IRQn, 100);
sankichi 0:e1265f6b3565 159 NVIC_SetPriority(BOD_IRQn, 100);
sankichi 0:e1265f6b3565 160 NVIC_SetPriority(USB_IRQn, 100);
sankichi 0:e1265f6b3565 161 NVIC_SetPriority(CAN_IRQn, 100);
sankichi 0:e1265f6b3565 162 NVIC_SetPriority(DMA_IRQn, 100);
sankichi 0:e1265f6b3565 163
sankichi 0:e1265f6b3565 164 NVIC_SetPriority(I2S_IRQn, 100);
sankichi 0:e1265f6b3565 165 NVIC_SetPriority(ENET_IRQn, 100);
sankichi 0:e1265f6b3565 166 NVIC_SetPriority(RIT_IRQn, 100);
sankichi 0:e1265f6b3565 167 NVIC_SetPriority(MCPWM_IRQn, 100);
sankichi 0:e1265f6b3565 168 NVIC_SetPriority(QEI_IRQn, 100);
sankichi 0:e1265f6b3565 169 NVIC_SetPriority(PLL1_IRQn, 100);
sankichi 0:e1265f6b3565 170
sankichi 0:e1265f6b3565 171 }
sankichi 0:e1265f6b3565 172 */
sankichi 0:e1265f6b3565 173
sankichi 0:e1265f6b3565 174
sankichi 0:e1265f6b3565 175 //
sankichi 0:e1265f6b3565 176 // Set output pin status
sankichi 0:e1265f6b3565 177 //
sankichi 0:e1265f6b3565 178 // Input:
sankichi 0:e1265f6b3565 179 // val: status of pins.
sankichi 0:e1265f6b3565 180 // (MSB) ...|D3|D2|D1|D0| (LSB)
sankichi 0:e1265f6b3565 181 //
sankichi 0:e1265f6b3565 182 void Out_MD::SetPinValue(int val)
sankichi 0:e1265f6b3565 183 {
sankichi 0:e1265f6b3565 184 // 意味ない
sankichi 0:e1265f6b3565 185 /*
sankichi 0:e1265f6b3565 186 _DataBus = val & 0x0f;
sankichi 0:e1265f6b3565 187 */
sankichi 0:e1265f6b3565 188
sankichi 0:e1265f6b3565 189 _OUT_D0 = val & 0x01? 1 : 0;
sankichi 0:e1265f6b3565 190 _OUT_D1 = val & 0x02? 1 : 0;
sankichi 0:e1265f6b3565 191 _OUT_D2 = val & 0x04? 1 : 0;
sankichi 0:e1265f6b3565 192 _OUT_D3 = val & 0x08? 1 : 0;
sankichi 0:e1265f6b3565 193 }
sankichi 0:e1265f6b3565 194
sankichi 0:e1265f6b3565 195
sankichi 0:e1265f6b3565 196
sankichi 0:e1265f6b3565 197
sankichi 0:e1265f6b3565 198
sankichi 0:e1265f6b3565 199 //
sankichi 0:e1265f6b3565 200 // 出力更新Ticker処理
sankichi 0:e1265f6b3565 201 //
sankichi 0:e1265f6b3565 202 void Out_MD::DigitalStateRenewMethod(void)
sankichi 0:e1265f6b3565 203 {
sankichi 0:e1265f6b3565 204
sankichi 0:e1265f6b3565 205 _ButtonStatus = _InputStatus->Buttons;
sankichi 0:e1265f6b3565 206
sankichi 0:e1265f6b3565 207 if( (_INTR_REQ) )
sankichi 0:e1265f6b3565 208 {
sankichi 0:e1265f6b3565 209 RenewDigitalPadStatus(1);
sankichi 0:e1265f6b3565 210 }
sankichi 0:e1265f6b3565 211 else
sankichi 0:e1265f6b3565 212 {
sankichi 0:e1265f6b3565 213 RenewDigitalPadStatus(0);
sankichi 0:e1265f6b3565 214 }
sankichi 0:e1265f6b3565 215
sankichi 0:e1265f6b3565 216 }
sankichi 0:e1265f6b3565 217
sankichi 0:e1265f6b3565 218 //
sankichi 0:e1265f6b3565 219 // デジタルパッドの該当phaseのデータを出力
sankichi 0:e1265f6b3565 220 //
sankichi 0:e1265f6b3565 221 void Out_MD::RenewDigitalPadStatus(char phase)
sankichi 0:e1265f6b3565 222 {
sankichi 0:e1265f6b3565 223
sankichi 0:e1265f6b3565 224 switch( phase )
sankichi 0:e1265f6b3565 225 {
sankichi 0:e1265f6b3565 226 case 0:
sankichi 0:e1265f6b3565 227 // phase0出力
sankichi 0:e1265f6b3565 228
sankichi 0:e1265f6b3565 229 // サイバースティックのデジタルモードではStartボタンは読み取れない
sankichi 0:e1265f6b3565 230 // (カブトガニは可能)
sankichi 0:e1265f6b3565 231 // MD Start
sankichi 0:e1265f6b3565 232 _OUT_ACK = ( (_ButtonStatus & 0x00010) ? 1 : 0 ); // Digital "D"
sankichi 0:e1265f6b3565 233
sankichi 0:e1265f6b3565 234 // MD A
sankichi 0:e1265f6b3565 235 if(_SwapAC)
sankichi 0:e1265f6b3565 236 {
sankichi 0:e1265f6b3565 237 _OUT_LH =( (_ButtonStatus & 0x00020) ? 1 : 0 ); // Digital "C"
sankichi 0:e1265f6b3565 238 }
sankichi 0:e1265f6b3565 239 else
sankichi 0:e1265f6b3565 240 {
sankichi 0:e1265f6b3565 241 _OUT_LH = ( (_ButtonStatus & 0x00200) ? 1 : 0 ); // Digital "A"
sankichi 0:e1265f6b3565 242 }
sankichi 0:e1265f6b3565 243 _OUT_D3 = ( 0 );
sankichi 0:e1265f6b3565 244 _OUT_D2 = ( 0 );
sankichi 0:e1265f6b3565 245
sankichi 0:e1265f6b3565 246 // MD Down
sankichi 0:e1265f6b3565 247 _OUT_D1 = ( (_ButtonStatus & 0x01000) ? 1 : 0 ); // Digital "Down"
sankichi 0:e1265f6b3565 248 // MD Up
sankichi 0:e1265f6b3565 249 _OUT_D0 = ( (_ButtonStatus & 0x02000) ? 1 : 0 ); // Digital "Up"
sankichi 0:e1265f6b3565 250 break;
sankichi 0:e1265f6b3565 251
sankichi 0:e1265f6b3565 252 case 1:
sankichi 0:e1265f6b3565 253 // phase1出力
sankichi 0:e1265f6b3565 254
sankichi 0:e1265f6b3565 255 // MD C
sankichi 0:e1265f6b3565 256 if(_SwapAC)
sankichi 0:e1265f6b3565 257 {
sankichi 0:e1265f6b3565 258 _OUT_ACK = ( (_ButtonStatus & 0x00200) ? 1 : 0 ); // Digital "A"
sankichi 0:e1265f6b3565 259 }
sankichi 0:e1265f6b3565 260 else
sankichi 0:e1265f6b3565 261 {
sankichi 0:e1265f6b3565 262 _OUT_ACK =( (_ButtonStatus & 0x00020) ? 1 : 0 ); // Digital "C"
sankichi 0:e1265f6b3565 263 }
sankichi 0:e1265f6b3565 264 // MD B
sankichi 0:e1265f6b3565 265 _OUT_LH = ( (_ButtonStatus & 0x00100) ? 1 : 0 ); // Digital "B"
sankichi 0:e1265f6b3565 266 // MD Right
sankichi 0:e1265f6b3565 267 _OUT_D3 = ( (_ButtonStatus & 0x00400) ? 1 : 0 ); // Digital "Right"
sankichi 0:e1265f6b3565 268 // MD Left
sankichi 0:e1265f6b3565 269 _OUT_D2 = ( (_ButtonStatus & 0x00800) ? 1 : 0 ); // Digital "Left"
sankichi 0:e1265f6b3565 270 // MD Down
sankichi 0:e1265f6b3565 271 _OUT_D1 = ( (_ButtonStatus & 0x01000) ? 1 : 0 ); // Digital "Down"
sankichi 0:e1265f6b3565 272 // MD Up
sankichi 0:e1265f6b3565 273 _OUT_D0 = ( (_ButtonStatus & 0x02000) ? 1 : 0 ); // Digital "Up"
sankichi 0:e1265f6b3565 274 break;
sankichi 0:e1265f6b3565 275
sankichi 0:e1265f6b3565 276 default:
sankichi 0:e1265f6b3565 277 break;
sankichi 0:e1265f6b3565 278 }
sankichi 0:e1265f6b3565 279 }
sankichi 0:e1265f6b3565 280
sankichi 0:e1265f6b3565 281
sankichi 0:e1265f6b3565 282
sankichi 0:e1265f6b3565 283 //
sankichi 0:e1265f6b3565 284 // 周期ポーリングの休みの間、デジタルパッド更新を行う/行わない
sankichi 0:e1265f6b3565 285 //
sankichi 0:e1265f6b3565 286 void Out_MD::EnableDigitalStateRenew(void)
sankichi 0:e1265f6b3565 287 {
sankichi 0:e1265f6b3565 288 _DigitalStateRenewTicker.attach_us(
sankichi 0:e1265f6b3565 289 this,
sankichi 0:e1265f6b3565 290 &Out_MD::DigitalStateRenewMethod,
sankichi 0:e1265f6b3565 291 DIGITAL_STATE_RENEW_INTERVAL__MICROSEC
sankichi 0:e1265f6b3565 292 );
sankichi 0:e1265f6b3565 293 }
sankichi 0:e1265f6b3565 294 void Out_MD::DisableDigitalStateRenew(void)
sankichi 0:e1265f6b3565 295 {
sankichi 0:e1265f6b3565 296 _DigitalStateRenewTicker.detach();
sankichi 0:e1265f6b3565 297 }
sankichi 0:e1265f6b3565 298
sankichi 0:e1265f6b3565 299 //
sankichi 0:e1265f6b3565 300 // 周期ポーリングの開始(周期?のリセット)
sankichi 0:e1265f6b3565 301 //
sankichi 0:e1265f6b3565 302 void Out_MD::RestartDigitalPeriodicPolling(void)
sankichi 0:e1265f6b3565 303 {
sankichi 0:e1265f6b3565 304 _DigitalPeriodicPollingTicker.detach();
sankichi 0:e1265f6b3565 305
sankichi 0:e1265f6b3565 306 _DigitalPeriodicPollingTicker.attach_us(
sankichi 0:e1265f6b3565 307 this,
sankichi 0:e1265f6b3565 308 &Out_MD::DigitalPeriodicPollingMethod,
sankichi 0:e1265f6b3565 309 DIGITAL_PERIODICPOLLING_INTERVAL__MICROSEC
sankichi 0:e1265f6b3565 310 );
sankichi 0:e1265f6b3565 311 }
sankichi 0:e1265f6b3565 312
sankichi 0:e1265f6b3565 313 //
sankichi 0:e1265f6b3565 314 // 周期ポーリング処理
sankichi 0:e1265f6b3565 315 //
sankichi 0:e1265f6b3565 316 void Out_MD::DigitalPeriodicPollingMethod(void)
sankichi 0:e1265f6b3565 317 {
sankichi 0:e1265f6b3565 318 // 入力タイマ処理&休みの間の更新処理 止める
sankichi 0:e1265f6b3565 319 // DisableInput();
sankichi 0:e1265f6b3565 320 // DisableDigitalStateRenew();
sankichi 0:e1265f6b3565 321
sankichi 0:e1265f6b3565 322 // 割り込み禁止
sankichi 0:e1265f6b3565 323 __disable_irq();
sankichi 0:e1265f6b3565 324
sankichi 0:e1265f6b3565 325 Cfunc_DigitalPeriodicPollingMethod();
sankichi 0:e1265f6b3565 326
sankichi 0:e1265f6b3565 327 // 割り込み再開
sankichi 0:e1265f6b3565 328 __enable_irq();
sankichi 0:e1265f6b3565 329
sankichi 0:e1265f6b3565 330
sankichi 0:e1265f6b3565 331 // 入力タイマ処理&休みの間の更新処理 再開
sankichi 0:e1265f6b3565 332 // EnableDigitalStateRenew();
sankichi 0:e1265f6b3565 333 // EnableInput();
sankichi 0:e1265f6b3565 334
sankichi 0:e1265f6b3565 335 RestartDigitalPeriodicPolling();
sankichi 0:e1265f6b3565 336
sankichi 0:e1265f6b3565 337 }
sankichi 0:e1265f6b3565 338
sankichi 0:e1265f6b3565 339
sankichi 0:e1265f6b3565 340 //
sankichi 0:e1265f6b3565 341 // InputStatusのデジタルモード・アナログモード切替を見張る
sankichi 0:e1265f6b3565 342 //
sankichi 0:e1265f6b3565 343 void Out_MD::EnableModeChecker(void)
sankichi 0:e1265f6b3565 344 {
sankichi 0:e1265f6b3565 345 _ModeChecker.detach();
sankichi 0:e1265f6b3565 346 _ModeChecker.attach_us(
sankichi 0:e1265f6b3565 347 this,
sankichi 0:e1265f6b3565 348 &Out_MD::ModeCheckerMethod,
sankichi 0:e1265f6b3565 349 MODECHECK_INTERVAL__MICROSEC
sankichi 0:e1265f6b3565 350 );
sankichi 0:e1265f6b3565 351 }
sankichi 0:e1265f6b3565 352
sankichi 0:e1265f6b3565 353 void Out_MD::DisableModeChecker(void)
sankichi 0:e1265f6b3565 354 {
sankichi 0:e1265f6b3565 355 _ModeChecker.detach();
sankichi 0:e1265f6b3565 356 }
sankichi 0:e1265f6b3565 357
sankichi 0:e1265f6b3565 358 void Out_MD::ModeCheckerMethod(void)
sankichi 0:e1265f6b3565 359 {
sankichi 0:e1265f6b3565 360 // デジタル・アナログモードチェック
sankichi 0:e1265f6b3565 361 if(_InputStatus->InputDeviceType != _InputMode)
sankichi 0:e1265f6b3565 362 {
sankichi 0:e1265f6b3565 363 // モード変わってたら再Initialize
sankichi 0:e1265f6b3565 364 Initialize();
sankichi 0:e1265f6b3565 365 }
sankichi 0:e1265f6b3565 366 }
sankichi 0:e1265f6b3565 367
sankichi 0:e1265f6b3565 368 //
sankichi 0:e1265f6b3565 369 // アナログスティック用:指定Phaseのデータを出力する
sankichi 0:e1265f6b3565 370 //
sankichi 0:e1265f6b3565 371 // 関数内部で_TransferSpeedを変化させている
sankichi 0:e1265f6b3565 372 //
sankichi 0:e1265f6b3565 373 //
sankichi 0:e1265f6b3565 374 void Out_MD::SetData_Analog_PhaseOf(char phase)
sankichi 0:e1265f6b3565 375 {
sankichi 0:e1265f6b3565 376 // Get InputStatus
sankichi 0:e1265f6b3565 377 InputStatus *inp = _InputStatus;
sankichi 0:e1265f6b3565 378
sankichi 0:e1265f6b3565 379 // Set Data
sankichi 0:e1265f6b3565 380 switch(phase)
sankichi 0:e1265f6b3565 381 {
sankichi 0:e1265f6b3565 382 case 0:
sankichi 0:e1265f6b3565 383 // このとき、まだ1回目のAck立ち下げは行っていない
sankichi 0:e1265f6b3565 384 SetPinValue(
sankichi 0:e1265f6b3565 385 (((inp->Buttons) & 0x000c)) | // E1E2
sankichi 0:e1265f6b3565 386 (((inp->Buttons) & 0x0003)) // FG
sankichi 0:e1265f6b3565 387 );
sankichi 0:e1265f6b3565 388 break;
sankichi 0:e1265f6b3565 389
sankichi 0:e1265f6b3565 390 case 1:
sankichi 0:e1265f6b3565 391 // 1回目のAck立ち下げ終了済み
sankichi 0:e1265f6b3565 392 SetPinValue(
sankichi 0:e1265f6b3565 393 (((inp->Buttons) & 0x0300) >> 6) | // AB
sankichi 0:e1265f6b3565 394 (((inp->Buttons) & 0x0030) >> 4) // CD
sankichi 0:e1265f6b3565 395 );
sankichi 0:e1265f6b3565 396 break;
sankichi 0:e1265f6b3565 397
sankichi 0:e1265f6b3565 398 case 2:
sankichi 0:e1265f6b3565 399 // 2回目のAck立ち下げ終了済み
sankichi 0:e1265f6b3565 400 SetPinValue(
sankichi 0:e1265f6b3565 401 ((inp->Ch1) & 0x0f0) >> 4 // 2H
sankichi 0:e1265f6b3565 402 // 0xff
sankichi 0:e1265f6b3565 403 );
sankichi 0:e1265f6b3565 404 // 最速モード
sankichi 0:e1265f6b3565 405 if(_INTR_REQ==1)
sankichi 0:e1265f6b3565 406 {
sankichi 0:e1265f6b3565 407 if(_TransferSpeed > TRANSFERSPEED_MAX__MICROSEC)
sankichi 0:e1265f6b3565 408 {
sankichi 0:e1265f6b3565 409 // printf("MAX!!!");
sankichi 0:e1265f6b3565 410 _TransferSpeed = TRANSFERSPEED_MAX__MICROSEC;
sankichi 0:e1265f6b3565 411 }
sankichi 0:e1265f6b3565 412 }
sankichi 0:e1265f6b3565 413 break;
sankichi 0:e1265f6b3565 414
sankichi 0:e1265f6b3565 415 case 3:
sankichi 0:e1265f6b3565 416 SetPinValue(
sankichi 0:e1265f6b3565 417 ((inp->Ch0) & 0x0f0) >> 4 // 1H
sankichi 0:e1265f6b3565 418 // 0xff
sankichi 0:e1265f6b3565 419 );
sankichi 0:e1265f6b3565 420 break;
sankichi 0:e1265f6b3565 421
sankichi 0:e1265f6b3565 422 case 4:
sankichi 0:e1265f6b3565 423 SetPinValue(
sankichi 0:e1265f6b3565 424 ((inp->Ch3) & 0x0f0) >> 4 // 4H
sankichi 0:e1265f6b3565 425 );
sankichi 0:e1265f6b3565 426
sankichi 0:e1265f6b3565 427 // 1/2倍速
sankichi 0:e1265f6b3565 428 if(_INTR_REQ==1)
sankichi 0:e1265f6b3565 429 {
sankichi 0:e1265f6b3565 430 if(_TransferSpeed > TRANSFERSPEED_1_2__MICROSEC)
sankichi 0:e1265f6b3565 431 {
sankichi 0:e1265f6b3565 432 // printf("1/2!!!");
sankichi 0:e1265f6b3565 433 _TransferSpeed = TRANSFERSPEED_1_2__MICROSEC;
sankichi 0:e1265f6b3565 434 }
sankichi 0:e1265f6b3565 435 }
sankichi 0:e1265f6b3565 436 break;
sankichi 0:e1265f6b3565 437
sankichi 0:e1265f6b3565 438 case 5:
sankichi 0:e1265f6b3565 439 SetPinValue(
sankichi 0:e1265f6b3565 440 ((inp->Ch2) & 0x0f0) >> 4 // 3H
sankichi 0:e1265f6b3565 441 );
sankichi 0:e1265f6b3565 442 break;
sankichi 0:e1265f6b3565 443
sankichi 0:e1265f6b3565 444 case 6:
sankichi 0:e1265f6b3565 445 SetPinValue(
sankichi 0:e1265f6b3565 446 (inp->Ch1) & 0x00f // 2L
sankichi 0:e1265f6b3565 447 );
sankichi 0:e1265f6b3565 448 // 1/3倍速
sankichi 0:e1265f6b3565 449 if(_INTR_REQ==1)
sankichi 0:e1265f6b3565 450 {
sankichi 0:e1265f6b3565 451 if(_TransferSpeed > TRANSFERSPEED_1_3__MICROSEC)
sankichi 0:e1265f6b3565 452 {
sankichi 0:e1265f6b3565 453 // printf("1/3!!!");
sankichi 0:e1265f6b3565 454 _TransferSpeed = TRANSFERSPEED_1_3__MICROSEC;
sankichi 0:e1265f6b3565 455 }
sankichi 0:e1265f6b3565 456 }
sankichi 0:e1265f6b3565 457 break;
sankichi 0:e1265f6b3565 458
sankichi 0:e1265f6b3565 459 case 7:
sankichi 0:e1265f6b3565 460 SetPinValue(
sankichi 0:e1265f6b3565 461 (inp->Ch0) & 0x00f // 1L
sankichi 0:e1265f6b3565 462 );
sankichi 0:e1265f6b3565 463 break;
sankichi 0:e1265f6b3565 464
sankichi 0:e1265f6b3565 465 case 8:
sankichi 0:e1265f6b3565 466 SetPinValue(
sankichi 0:e1265f6b3565 467 (inp->Ch3) & 0x00f // 4L
sankichi 0:e1265f6b3565 468 );
sankichi 0:e1265f6b3565 469
sankichi 0:e1265f6b3565 470 // 1/4倍速
sankichi 0:e1265f6b3565 471 // いらない気もする
sankichi 0:e1265f6b3565 472 if(_INTR_REQ==1)
sankichi 0:e1265f6b3565 473 {
sankichi 0:e1265f6b3565 474 if(_TransferSpeed >= TRANSFERSPEED_1_4__MICROSEC)
sankichi 0:e1265f6b3565 475 {
sankichi 0:e1265f6b3565 476 // printf("1/4!!!");
sankichi 0:e1265f6b3565 477 _TransferSpeed = TRANSFERSPEED_1_4__MICROSEC;
sankichi 0:e1265f6b3565 478 }
sankichi 0:e1265f6b3565 479 }
sankichi 0:e1265f6b3565 480 break;
sankichi 0:e1265f6b3565 481
sankichi 0:e1265f6b3565 482 case 9:
sankichi 0:e1265f6b3565 483 SetPinValue(
sankichi 0:e1265f6b3565 484 (inp->Ch2) & 0x00f // 3L
sankichi 0:e1265f6b3565 485 //カブトガニは固定値送ってるかも?
sankichi 0:e1265f6b3565 486 //0x0a
sankichi 0:e1265f6b3565 487 );
sankichi 0:e1265f6b3565 488 break;
sankichi 0:e1265f6b3565 489
sankichi 0:e1265f6b3565 490 case 10:
sankichi 0:e1265f6b3565 491 SetPinValue(0xff);
sankichi 0:e1265f6b3565 492 break;
sankichi 0:e1265f6b3565 493
sankichi 0:e1265f6b3565 494 case 11:
sankichi 0:e1265f6b3565 495 SetPinValue(
sankichi 0:e1265f6b3565 496 (((inp->Buttons) & 0x0300) >> 6) | // AB
sankichi 0:e1265f6b3565 497 (((inp->Buttons) & 0x00c0)) >>6 // A+A' B+B'
sankichi 0:e1265f6b3565 498 );
sankichi 0:e1265f6b3565 499 break;
sankichi 0:e1265f6b3565 500
sankichi 0:e1265f6b3565 501
sankichi 0:e1265f6b3565 502 default:
sankichi 0:e1265f6b3565 503 SetPinValue(0xff);
sankichi 0:e1265f6b3565 504 break;
sankichi 0:e1265f6b3565 505
sankichi 0:e1265f6b3565 506 }
sankichi 0:e1265f6b3565 507 }
sankichi 0:e1265f6b3565 508
sankichi 0:e1265f6b3565 509 //
sankichi 0:e1265f6b3565 510 // ISR for REQ=L from Megadrive
sankichi 0:e1265f6b3565 511 //
sankichi 0:e1265f6b3565 512 void Out_MD::ISR_Analog_ReqFall()
sankichi 0:e1265f6b3565 513 {
sankichi 0:e1265f6b3565 514 // 全体が間延び数現象の原因?
sankichi 0:e1265f6b3565 515 // __disable_irq();
sankichi 0:e1265f6b3565 516
sankichi 0:e1265f6b3565 517 // デバッグ用:この関数が呼ばれるたび+1される
sankichi 0:e1265f6b3565 518 (_InputStatus->Temp[2])++;
sankichi 0:e1265f6b3565 519
sankichi 0:e1265f6b3565 520 //
sankichi 0:e1265f6b3565 521 // from AJOY_SUB.DOC:
sankichi 0:e1265f6b3565 522 // --------------
sankichi 0:e1265f6b3565 523 //◆転送速度(各サイクルタイム)
sankichi 0:e1265f6b3565 524 //
sankichi 0:e1265f6b3565 525 // ┌──────┬────┐
sankichi 0:e1265f6b3565 526 // │ 最速モード │ 50 │
sankichi 0:e1265f6b3565 527 // │ 1/2倍速 │ 96 │
sankichi 0:e1265f6b3565 528 // │ 1/3倍速 │ 144 │
sankichi 0:e1265f6b3565 529 // │ 1/4倍速 │ 192 │
sankichi 0:e1265f6b3565 530 // └──────┴────┘
sankichi 0:e1265f6b3565 531 // (単位:μsec)
sankichi 0:e1265f6b3565 532 // --------------
sankichi 0:e1265f6b3565 533 // ジョイコンはデータ転送要求(割り込み)により
sankichi 0:e1265f6b3565 534 // データ転送サイクルを6回繰り返す。
sankichi 0:e1265f6b3565 535 // --------------
sankichi 0:e1265f6b3565 536 //
sankichi 0:e1265f6b3565 537 // ↑ 以下のようなことを言いたかったのか?
sankichi 0:e1265f6b3565 538 // ・サイバースティックは12回Ackが下がり、1回~11回目に
sankichi 0:e1265f6b3565 539 // 『◆アナログモード時のデータ』に沿ったデータを送る。
sankichi 0:e1265f6b3565 540 // (12回目のデータは不明)
sankichi 0:e1265f6b3565 541 // ・『データ転送サイクル』はAck2回分である(LHピンのLとHの組が1サイクル)
sankichi 0:e1265f6b3565 542 // ・サイクルタイム=『データ転送サイクル』の周期
sankichi 0:e1265f6b3565 543 //
sankichi 0:e1265f6b3565 544 // このように仮定すると、Ack1回分のデータは
sankichi 0:e1265f6b3565 545 // サイクルタイム/2の間、保持していなければならないことになる。
sankichi 0:e1265f6b3565 546 // なので、Ack1回分のデータを、サイクルタイム/2の周期で出力することとする。
sankichi 0:e1265f6b3565 547 //
sankichi 0:e1265f6b3565 548 // --------------
sankichi 0:e1265f6b3565 549 // AJOY.DOC
sankichi 0:e1265f6b3565 550 //※通信速度を最高速に設定した場合、アナログジョイスティックを
sankichi 0:e1265f6b3565 551 // リセットしないかぎり、遅い速度への変更は行われない。
sankichi 0:e1265f6b3565 552 // --------------
sankichi 0:e1265f6b3565 553 // 本物は遅い方向には速度を変えさせない
sankichi 0:e1265f6b3565 554
sankichi 0:e1265f6b3565 555 char phase = 0; // データPhase: 0からスタート
sankichi 0:e1265f6b3565 556 char savePhase;
sankichi 0:e1265f6b3565 557 int us_Int1, us_Int2, us_Int3, us_Int4;
sankichi 0:e1265f6b3565 558
sankichi 0:e1265f6b3565 559 int time10, time1, time20, time2, time3, time4, time5, time6;
sankichi 0:e1265f6b3565 560
sankichi 0:e1265f6b3565 561 // 32Xスペハリ対策
sankichi 0:e1265f6b3565 562 // 待つ
sankichi 0:e1265f6b3565 563 // wait_us(40);
sankichi 0:e1265f6b3565 564 NiseKabuto::WaitUs(20);
sankichi 0:e1265f6b3565 565
sankichi 0:e1265f6b3565 566 // 現在の_TransferSpeedを元に、各時間を算出
sankichi 0:e1265f6b3565 567 us_Int1 = (int)(_TransferSpeed /12.5 ); // 速度MAX時: 4us
sankichi 0:e1265f6b3565 568 us_Int2 = (int)(_TransferSpeed / 8.3 ); // 速度MAX時: 6us
sankichi 0:e1265f6b3565 569 us_Int3 = (int)(_TransferSpeed / 4.17); // 速度MAX時: 12us
sankichi 0:e1265f6b3565 570 us_Int4 = (int)(_TransferSpeed / 3.57); // 速度MAX時: 14us
sankichi 0:e1265f6b3565 571
sankichi 0:e1265f6b3565 572 time10= us_Int1;
sankichi 0:e1265f6b3565 573 time20= us_Int4;
sankichi 0:e1265f6b3565 574
sankichi 0:e1265f6b3565 575 time1 = us_Int2;
sankichi 0:e1265f6b3565 576 time2 = us_Int3;
sankichi 0:e1265f6b3565 577 time3 = us_Int3;
sankichi 0:e1265f6b3565 578 time4 = us_Int1;
sankichi 0:e1265f6b3565 579 time5 = us_Int3;
sankichi 0:e1265f6b3565 580 time6 = us_Int1;
sankichi 0:e1265f6b3565 581
sankichi 0:e1265f6b3565 582 // AckはHから開始
sankichi 0:e1265f6b3565 583 // LHはLから開始
sankichi 0:e1265f6b3565 584 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 585 _OUT_LH = 0;
sankichi 0:e1265f6b3565 586
sankichi 0:e1265f6b3565 587
sankichi 0:e1265f6b3565 588
sankichi 0:e1265f6b3565 589 // サイクルタイム6回分=phase0-12
sankichi 0:e1265f6b3565 590
sankichi 0:e1265f6b3565 591 // 武者アレスタにおいて、サイクル2(phase2,3)のみ、値を送ると
sankichi 0:e1265f6b3565 592 // タイトル画面でボタンが押されてしまう不具合あり。
sankichi 0:e1265f6b3565 593 // このため、サイクル2は別のタイミングでデータを送付する。
sankichi 0:e1265f6b3565 594 // その直前のサイクル1も改める。
sankichi 0:e1265f6b3565 595
sankichi 0:e1265f6b3565 596
sankichi 0:e1265f6b3565 597
sankichi 0:e1265f6b3565 598 // サイクル1-6
sankichi 0:e1265f6b3565 599 for(int i=0; i<6; i++)
sankichi 0:e1265f6b3565 600 {
sankichi 0:e1265f6b3565 601 if(i==0)
sankichi 0:e1265f6b3565 602 {
sankichi 0:e1265f6b3565 603 // No1
sankichi 0:e1265f6b3565 604 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 605 _OUT_LH = 0;
sankichi 0:e1265f6b3565 606 NiseKabuto::WaitUs(time10);
sankichi 0:e1265f6b3565 607
sankichi 0:e1265f6b3565 608 // No2
sankichi 0:e1265f6b3565 609 savePhase = phase;
sankichi 0:e1265f6b3565 610 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 611 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 612 _OUT_LH = 0;
sankichi 0:e1265f6b3565 613 NiseKabuto::WaitUs(time20);
sankichi 0:e1265f6b3565 614 }
sankichi 0:e1265f6b3565 615 else
sankichi 0:e1265f6b3565 616 {
sankichi 0:e1265f6b3565 617 // No1
sankichi 0:e1265f6b3565 618 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 619 _OUT_LH = 0;
sankichi 0:e1265f6b3565 620 NiseKabuto::WaitUs(time1-5);
sankichi 0:e1265f6b3565 621
sankichi 0:e1265f6b3565 622 // No2
sankichi 0:e1265f6b3565 623 savePhase = phase;
sankichi 0:e1265f6b3565 624 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 625 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 626 _OUT_LH = 0;
sankichi 0:e1265f6b3565 627 NiseKabuto::WaitUs(time2);
sankichi 0:e1265f6b3565 628 }
sankichi 0:e1265f6b3565 629
sankichi 0:e1265f6b3565 630 // No3
sankichi 0:e1265f6b3565 631 _OUT_ACK = 0;
sankichi 0:e1265f6b3565 632 _OUT_LH = 0;
sankichi 0:e1265f6b3565 633 NiseKabuto::WaitUs(time3);
sankichi 0:e1265f6b3565 634
sankichi 0:e1265f6b3565 635 // No4
sankichi 0:e1265f6b3565 636 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 637 _OUT_LH = 1;
sankichi 0:e1265f6b3565 638 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 639 NiseKabuto::WaitUs(time4-3);
sankichi 0:e1265f6b3565 640
sankichi 0:e1265f6b3565 641 // No5
sankichi 0:e1265f6b3565 642 _OUT_ACK = 0;
sankichi 0:e1265f6b3565 643 _OUT_LH = 1;
sankichi 0:e1265f6b3565 644 NiseKabuto::WaitUs(time5);
sankichi 0:e1265f6b3565 645
sankichi 0:e1265f6b3565 646 // No6
sankichi 0:e1265f6b3565 647 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 648 _OUT_LH = 1;
sankichi 0:e1265f6b3565 649 NiseKabuto::WaitUs(time6-1);
sankichi 0:e1265f6b3565 650
sankichi 0:e1265f6b3565 651 // No7
sankichi 0:e1265f6b3565 652 _OUT_LH = 0;
sankichi 0:e1265f6b3565 653 SetData_Analog_PhaseOf(savePhase);
sankichi 0:e1265f6b3565 654 }
sankichi 0:e1265f6b3565 655 /*
sankichi 0:e1265f6b3565 656 // サイクル1-6
sankichi 0:e1265f6b3565 657 for(int i=0; i<6; i++)
sankichi 0:e1265f6b3565 658 {
sankichi 0:e1265f6b3565 659 if(i==0)
sankichi 0:e1265f6b3565 660 {
sankichi 0:e1265f6b3565 661 // No1
sankichi 0:e1265f6b3565 662 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 663 _OUT_LH = 0;
sankichi 0:e1265f6b3565 664 NiseKabuto::WaitUs(time10-2);
sankichi 0:e1265f6b3565 665
sankichi 0:e1265f6b3565 666 // No2
sankichi 0:e1265f6b3565 667 savePhase = phase;
sankichi 0:e1265f6b3565 668 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 669 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 670 _OUT_LH = 0;
sankichi 0:e1265f6b3565 671 NiseKabuto::WaitUs(time20-2);
sankichi 0:e1265f6b3565 672 }
sankichi 0:e1265f6b3565 673 else
sankichi 0:e1265f6b3565 674 {
sankichi 0:e1265f6b3565 675 // No1
sankichi 0:e1265f6b3565 676 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 677 _OUT_LH = 0;
sankichi 0:e1265f6b3565 678 NiseKabuto::WaitUs(time1-3);
sankichi 0:e1265f6b3565 679
sankichi 0:e1265f6b3565 680 // No2
sankichi 0:e1265f6b3565 681 savePhase = phase;
sankichi 0:e1265f6b3565 682 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 683 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 684 _OUT_LH = 0;
sankichi 0:e1265f6b3565 685 NiseKabuto::WaitUs(time2-2);
sankichi 0:e1265f6b3565 686 }
sankichi 0:e1265f6b3565 687
sankichi 0:e1265f6b3565 688 // No3
sankichi 0:e1265f6b3565 689 _OUT_ACK = 0;
sankichi 0:e1265f6b3565 690 _OUT_LH = 0;
sankichi 0:e1265f6b3565 691 NiseKabuto::WaitUs(time3-1);
sankichi 0:e1265f6b3565 692
sankichi 0:e1265f6b3565 693 // No4
sankichi 0:e1265f6b3565 694 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 695 _OUT_LH = 1;
sankichi 0:e1265f6b3565 696 SetData_Analog_PhaseOf(phase++);
sankichi 0:e1265f6b3565 697 NiseKabuto::WaitUs(time4-3);
sankichi 0:e1265f6b3565 698
sankichi 0:e1265f6b3565 699 // No5
sankichi 0:e1265f6b3565 700 _OUT_ACK = 0;
sankichi 0:e1265f6b3565 701 _OUT_LH = 1;
sankichi 0:e1265f6b3565 702 NiseKabuto::WaitUs(time5);
sankichi 0:e1265f6b3565 703
sankichi 0:e1265f6b3565 704 // No6
sankichi 0:e1265f6b3565 705 _OUT_ACK = 1;
sankichi 0:e1265f6b3565 706 _OUT_LH = 1;
sankichi 0:e1265f6b3565 707 NiseKabuto::WaitUs(time6-1);
sankichi 0:e1265f6b3565 708
sankichi 0:e1265f6b3565 709 // No7
sankichi 0:e1265f6b3565 710 _OUT_LH = 0;
sankichi 0:e1265f6b3565 711 SetData_Analog_PhaseOf(savePhase);
sankichi 0:e1265f6b3565 712 }
sankichi 0:e1265f6b3565 713 */
sankichi 0:e1265f6b3565 714 _OUT_LH = 0;
sankichi 0:e1265f6b3565 715
sankichi 0:e1265f6b3565 716 // __enable_irq();
sankichi 0:e1265f6b3565 717
sankichi 0:e1265f6b3565 718 }
sankichi 0:e1265f6b3565 719
sankichi 0:e1265f6b3565 720
sankichi 0:e1265f6b3565 721
sankichi 0:e1265f6b3565 722
sankichi 0:e1265f6b3565 723
sankichi 0:e1265f6b3565 724
sankichi 0:e1265f6b3565 725
sankichi 0:e1265f6b3565 726 void Out_MD::SetupInputControll(void (*startInputFunction)(void), void (*stopInputFunction)(void))
sankichi 0:e1265f6b3565 727 {
sankichi 0:e1265f6b3565 728 StartInputFunction = startInputFunction;
sankichi 0:e1265f6b3565 729 StopInputFunction = stopInputFunction;
sankichi 0:e1265f6b3565 730 }
sankichi 0:e1265f6b3565 731
sankichi 0:e1265f6b3565 732 void Out_MD::EnableInput(void)
sankichi 0:e1265f6b3565 733 {
sankichi 0:e1265f6b3565 734 if(_InputInstance && StartInputMethod)
sankichi 0:e1265f6b3565 735 {
sankichi 0:e1265f6b3565 736 (_InputInstance->*StartInputMethod)();
sankichi 0:e1265f6b3565 737 }
sankichi 0:e1265f6b3565 738 else if(StartInputFunction)
sankichi 0:e1265f6b3565 739 {
sankichi 0:e1265f6b3565 740 StartInputFunction();
sankichi 0:e1265f6b3565 741 }
sankichi 0:e1265f6b3565 742 }
sankichi 0:e1265f6b3565 743
sankichi 0:e1265f6b3565 744 void Out_MD::DisableInput(void)
sankichi 0:e1265f6b3565 745 {
sankichi 0:e1265f6b3565 746 if(_InputInstance && StopInputMethod)
sankichi 0:e1265f6b3565 747 {
sankichi 0:e1265f6b3565 748 (_InputInstance->*StopInputMethod)();
sankichi 0:e1265f6b3565 749 }
sankichi 0:e1265f6b3565 750 else if(StopInputFunction)
sankichi 0:e1265f6b3565 751 {
sankichi 0:e1265f6b3565 752 StopInputFunction();
sankichi 0:e1265f6b3565 753 }
sankichi 0:e1265f6b3565 754 }
sankichi 0:e1265f6b3565 755