Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
NiseKabuto.cpp
00001 #include "NiseKabuto.h" 00002 #include "InputDeviceDetector.h" 00003 00004 // _InputTypeとInputStatus.InputDeviceTypeの違いは???? 00005 00006 /** 00007 -------------------------------------------------- 00008 00009 Constructor 00010 00011 -------------------------------------------------- 00012 **/ 00013 NiseKabuto::NiseKabuto(PinName inputPins[], PinName outputPins[], PinName configurePins[]) 00014 : 00015 _ConfigSwitch( 00016 configurePins[0],configurePins[1],configurePins[2],configurePins[3], 00017 configurePins[4],configurePins[5],configurePins[6],configurePins[7] 00018 ) 00019 { 00020 InitInterruptPriority(); 00021 // InitTimer0(); 00022 00023 // Pin Setting 00024 _ConfigSwitch.mode(PullUp); 00025 00026 // Detect Input device 00027 InputDeviceDetector myDetector = InputDeviceDetector(inputPins); 00028 _InputType = myDetector.GetInputType(); 00029 //printf("_InputType: %d\n",_InputType & 0xff); 00030 00031 00032 // Initialize input instance 00033 switch(_InputType) 00034 { 00035 case CONFIG_INMODE_CYBERSTICK_ANALOG: 00036 case CONFIG_INMODE_CYBERSTICK_DIGITAL: 00037 // Initialize Input: CyberStick 00038 InitInput_CyberStick(inputPins); 00039 break; 00040 00041 case CONFIG_INMODE_MD6B: 00042 // Initialize Input: MD6B 00043 InitInput_MD6B(inputPins); 00044 break; 00045 00046 default: 00047 InitInput_MD6B(inputPins); 00048 break; 00049 } 00050 00051 /* 00052 wait_ms(5000); 00053 printf("_ConfigSwitch: %d\n",_ConfigSwitch & 0xff); 00054 */ 00055 00056 // Save output mode 00057 //printf("CS:%02x\n\r",~_ConfigSwitch); 00058 _OutputType = (~_ConfigSwitch) & 0x0ff; 00059 00060 // Initialize output instance 00061 switch(_OutputType) 00062 { 00063 case CONFIGPIN_OUTMODE_SSMULCON: 00064 // Initialize Output: SS Multi Controller 00065 InitOutput_SSMulCon(outputPins); 00066 break; 00067 00068 case CONFIGPIN_OUTMODE_PCE: 00069 // Initialize Output: PCE Analog/Digital Controller 00070 InitOutput_PCE(outputPins); 00071 break; 00072 00073 case CONFIGPIN_OUTMODE_FC: 00074 // Initialize Output: Famicom Controller 00075 InitOutput_FC(outputPins); 00076 break; 00077 case CONFIGPIN_OUTMODE_MD: 00078 // Initialize Output: Megadrive analog joystick 00079 InitOutput_MD(outputPins); 00080 break; 00081 default: 00082 // Initialize Output: PlayStation3 USB Joystick 00083 InitOutput_PS3USB(); 00084 break; 00085 } 00086 } 00087 00088 00089 /** 00090 -------------------------------------------------- 00091 00092 Initialize Input Device: CyberStick 00093 00094 -------------------------------------------------- 00095 **/ 00096 void NiseKabuto::InitInput_CyberStick(PinName inputPins[]) 00097 { 00098 // Create In_CyberStick instance 00099 _In_CyberStick = new In_CyberStick( 00100 inputPins[0],inputPins[1],inputPins[2],inputPins[3], 00101 inputPins[4],inputPins[5],inputPins[6],&_InputStatus); 00102 } 00103 00104 00105 00106 /** 00107 -------------------------------------------------- 00108 00109 Initialize Input Device: Fighting Pad 6B 00110 00111 -------------------------------------------------- 00112 **/ 00113 void NiseKabuto::InitInput_MD6B(PinName inputPins[]) 00114 { 00115 // Create In_CyberStick instance 00116 _In_MD6B= new In_MD6B( 00117 inputPins[0],inputPins[1],inputPins[2],inputPins[3], 00118 inputPins[4],inputPins[5],inputPins[6],&_InputStatus); 00119 } 00120 00121 00122 00123 /** 00124 -------------------------------------------------- 00125 00126 Initialize Output Device: Megadrive analog/digital joystick 00127 00128 -------------------------------------------------- 00129 **/ 00130 void NiseKabuto::InitOutput_MD(PinName outputPins[]) 00131 { 00132 // Create Out_MD instance 00133 _Out_MD = new Out_MD( 00134 outputPins[0],outputPins[1],outputPins[2],outputPins[3], 00135 outputPins[4],outputPins[5],outputPins[6], 00136 &_InputStatus 00137 ); 00138 00139 if( _InputType == CONFIG_INMODE_CYBERSTICK_ANALOG || _InputType == CONFIG_INMODE_CYBERSTICK_DIGITAL) 00140 { 00141 _Out_MD->SetupInputControll(_In_CyberStick, &In_CyberStick::StartReading, &In_CyberStick::StopReading); 00142 } 00143 else if( _InputType == CONFIG_INMODE_MD6B ) 00144 { 00145 _Out_MD->SetupInputControll(_In_MD6B, &In_MD6B::StartReading, &In_MD6B::StopReading); 00146 } 00147 } 00148 00149 /** 00150 -------------------------------------------------- 00151 00152 Initialize Output Device: SS Multi Controller 00153 00154 -------------------------------------------------- 00155 **/ 00156 void NiseKabuto::InitOutput_SSMulCon(PinName outputPins[]) 00157 { 00158 // Create Out_SSMulCon instance 00159 _Out_SSMulCon = new Out_SSMulCon( 00160 outputPins[0],outputPins[1],outputPins[2],outputPins[3], 00161 outputPins[4],outputPins[5],outputPins[6], 00162 &_InputStatus 00163 ); 00164 00165 if( _InputType == CONFIG_INMODE_CYBERSTICK_ANALOG || _InputType == CONFIG_INMODE_CYBERSTICK_DIGITAL) 00166 { 00167 _Out_SSMulCon->SetupInputControll(_In_CyberStick, &In_CyberStick::StartReading, &In_CyberStick::StopReading); 00168 } 00169 else if( _InputType == CONFIG_INMODE_MD6B ) 00170 { 00171 _Out_SSMulCon->SetupInputControll(_In_MD6B, &In_MD6B::StartReading, &In_MD6B::StopReading); 00172 } 00173 } 00174 00175 /** 00176 -------------------------------------------------- 00177 00178 Initialize Output Device: PCE Analog/Digital Controller 00179 00180 -------------------------------------------------- 00181 **/ 00182 void NiseKabuto::InitOutput_PCE(PinName outputPins[]) 00183 { 00184 // Create Out_PCEAnalog instance 00185 _Out_PCE = new Out_PCE( 00186 outputPins[0],outputPins[1],outputPins[2],outputPins[3], 00187 outputPins[4],outputPins[5],outputPins[6], 00188 &_InputStatus 00189 ); 00190 00191 if( _InputType == CONFIG_INMODE_CYBERSTICK_ANALOG || _InputType == CONFIG_INMODE_CYBERSTICK_DIGITAL) 00192 { 00193 _Out_PCE->SetupInputControll(_In_CyberStick, &In_CyberStick::StartReading, &In_CyberStick::StopReading); 00194 } 00195 else if( _InputType == CONFIG_INMODE_MD6B ) 00196 { 00197 _Out_PCE->SetupInputControll(_In_MD6B, &In_MD6B::StartReading, &In_MD6B::StopReading); 00198 } 00199 } 00200 00201 00202 /** 00203 -------------------------------------------------- 00204 00205 Initialize Output Device: Famicom Controller 00206 00207 -------------------------------------------------- 00208 **/ 00209 void NiseKabuto::InitOutput_FC(PinName outputPins[]) 00210 { 00211 // Create Out_FC instance 00212 _Out_FC = new Out_FC( 00213 outputPins[0],outputPins[1],outputPins[2],outputPins[3], 00214 &_InputStatus 00215 ); 00216 00217 if( _InputType == CONFIG_INMODE_CYBERSTICK_ANALOG || _InputType == CONFIG_INMODE_CYBERSTICK_DIGITAL) 00218 { 00219 _Out_FC->SetupInputControll(_In_CyberStick, &In_CyberStick::StartReading, &In_CyberStick::StopReading); 00220 } 00221 else if( _InputType == CONFIG_INMODE_MD6B ) 00222 { 00223 _Out_FC->SetupInputControll(_In_MD6B, &In_MD6B::StartReading, &In_MD6B::StopReading); 00224 } 00225 } 00226 00227 /** 00228 -------------------------------------------------- 00229 00230 Initialize Output Device: PlayStation3 USB Joystick 00231 00232 -------------------------------------------------- 00233 **/ 00234 void NiseKabuto::InitOutput_PS3USB(void) 00235 { 00236 // Create Out_PS3USB instance 00237 _Out_PS3USB = new Out_PS3USB( 00238 &_InputStatus 00239 ); 00240 00241 if( _InputType == CONFIG_INMODE_CYBERSTICK_ANALOG || _InputType == CONFIG_INMODE_CYBERSTICK_DIGITAL) 00242 { 00243 _Out_PS3USB->SetupInputControll(_In_CyberStick, &In_CyberStick::StartReading, &In_CyberStick::StopReading); 00244 } 00245 else if( _InputType == CONFIG_INMODE_MD6B ) 00246 { 00247 _Out_PS3USB->SetupInputControll(_In_MD6B, &In_MD6B::StartReading, &In_MD6B::StopReading); 00248 } 00249 } 00250 00251 00252 /** 00253 -------------------------------------------------- 00254 00255 Show (for test) 00256 00257 -------------------------------------------------- 00258 **/ 00259 00260 void NiseKabuto::Show() 00261 { 00262 char strBuf[100]; 00263 00264 __disable_irq(); 00265 int val = _InputStatus.Buttons; 00266 int ch0 = _InputStatus.Ch0; 00267 int ch1 = _InputStatus.Ch1; 00268 int ch2 = _InputStatus.Ch2; 00269 int ch3 = _InputStatus.Ch3; 00270 char mode = _InputStatus.InputDeviceType; 00271 char temp0 = _InputStatus.Temp[0]; 00272 char temp1 = _InputStatus.Temp[1]; 00273 char temp2 = _InputStatus.Temp[2]; 00274 char temp3 = _InputStatus.Temp[3]; 00275 char temp4 = _InputStatus.Temp[4]; 00276 char temp5 = _InputStatus.Temp[5]; 00277 __enable_irq(); 00278 00279 strBuf[0]=0; 00280 00281 switch(mode) 00282 { 00283 case CONFIG_INMODE_CYBERSTICK_ANALOG: 00284 case CONFIG_INMODE_CYBERSTICK_DIGITAL: 00285 strcat(strBuf, "CS"); 00286 if( mode==CONFIG_INMODE_CYBERSTICK_ANALOG ) 00287 { 00288 strcat(strBuf, "AN"); 00289 } 00290 else 00291 { 00292 strcat(strBuf, "DG"); 00293 } 00294 break; 00295 00296 case CONFIG_INMODE_MD6B: 00297 strcat(strBuf, "6B"); 00298 break; 00299 } 00300 00301 switch(_OutputType) 00302 { 00303 case CONFIGPIN_OUTMODE_SSMULCON: 00304 strcat(strBuf, "->SSMC "); 00305 break; 00306 00307 case CONFIGPIN_OUTMODE_PCE: 00308 strcat(strBuf, "->PCE "); 00309 break; 00310 00311 case CONFIGPIN_OUTMODE_FC: 00312 strcat(strBuf, "->Famicom "); 00313 break; 00314 00315 case CONFIGPIN_OUTMODE_MD: 00316 strcat(strBuf, "->MD "); 00317 break; 00318 00319 default: 00320 strcat(strBuf, "->PS3USB "); 00321 break; 00322 } 00323 00324 switch(mode) 00325 { 00326 case CONFIG_INMODE_CYBERSTICK_ANALOG: 00327 case CONFIG_INMODE_CYBERSTICK_DIGITAL: 00328 strcat(strBuf, val & 0x8000? "---" : "Tup"); 00329 strcat(strBuf, val & 0x4000? "---" : "Tdw"); 00330 strcat(strBuf, val & 0x2000? "-" : "U"); 00331 strcat(strBuf, val & 0x1000? "-" : "D"); 00332 strcat(strBuf, val & 0x0800? "-" : "L"); 00333 strcat(strBuf, val & 0x0400? "-" : "R"); 00334 strcat(strBuf, val & 0x0200? "-" : "A"); 00335 strcat(strBuf, val & 0x0100? "-" : "B"); 00336 strcat(strBuf, val & 0x0020? "-" : "C"); 00337 strcat(strBuf, val & 0x0010? "-" : "D"); 00338 strcat(strBuf, val & 0x0008? "--" : "E1"); 00339 strcat(strBuf, val & 0x0004? "--" : "E2"); 00340 strcat(strBuf, val & 0x0002? "---" : "Fst"); 00341 strcat(strBuf, val & 0x0001? "---" : "Gsl"); 00342 strcat(strBuf, val & 0x0080? "--" : "A'"); 00343 strcat(strBuf, val & 0x0040? "--" : "B'"); 00344 printf("%s ",strBuf); 00345 00346 printf("CH0:%02X ", ch0); 00347 printf("CH1:%02X ", ch1); 00348 printf("CH2:%02X ", ch2); 00349 printf("CH3:%02X ", ch3); 00350 /* 00351 printf("\r\ni:%02x o:%02x %02x %02x ", temp0, temp2, temp5, temp4); // debug(in, out functions) 00352 printf("tc(%u) mr0(%u) ", LPC_TIM3->TC, LPC_TIM3->MR0); // debug(TIMER3) 00353 */ 00354 printf("\r\n"); 00355 00356 break; 00357 00358 case CONFIG_INMODE_MD6B: 00359 strcat(strBuf, val & 0x002000? "-" : "U"); 00360 strcat(strBuf, val & 0x001000? "-" : "D"); 00361 strcat(strBuf, val & 0x000800? "-" : "L"); 00362 strcat(strBuf, val & 0x000400? "-" : "R"); 00363 strcat(strBuf, val & 0x000200? "-" : "A"); 00364 strcat(strBuf, val & 0x000100? "-" : "B"); 00365 strcat(strBuf, val & 0x000020? "-" : "C"); 00366 strcat(strBuf, val & 0x040000? "-" : "X"); 00367 strcat(strBuf, val & 0x020000? "-" : "Y"); 00368 strcat(strBuf, val & 0x010000? "-" : "Z"); 00369 strcat(strBuf, val & 0x000002? "-" : "S"); 00370 strcat(strBuf, val & 0x000001? "-" : "M"); 00371 printf("%s ",strBuf); 00372 //printf("%02x %02x %02x %02x %02x %02x", temp0, temp1, temp2, temp3, temp4, temp5); 00373 /* 00374 printf("i:%02x o:%02x %02x %02x ", temp0, temp2, temp5, temp4); 00375 printf("TIM3 tc(%u) mr0(%u) diff(%d)", 00376 LPC_TIM3->TC, 00377 LPC_TIM3->MR0, 00378 int(LPC_TIM3->MR0) - int(LPC_TIM3->TC) ); 00379 */ 00380 printf("\r\n"); 00381 /* 00382 printf("\r\nIR:%08x,TCR:%08x,PR:%08x,PC:%08x,MCR:%08x,EMR:%08x,CTCR:%08x tc(%u) mr0(%u) diff(%d) pending:%u ", 00383 // NVIC_GetActive(TIMER3_IRQn), 00384 LPC_TIM3->IR, 00385 LPC_TIM3->TCR, 00386 LPC_TIM3->PR, 00387 LPC_TIM3->PC, 00388 LPC_TIM3->MCR, 00389 LPC_TIM3->EMR, 00390 LPC_TIM3->CTCR, 00391 LPC_TIM3->TC, 00392 LPC_TIM3->MR0, 00393 int(LPC_TIM3->MR0) - int(LPC_TIM3->TC), 00394 ( NVIC->ISPR[0] & ( 1<<4 ) ) ); 00395 printf("\r\n"); 00396 */ 00397 break; 00398 } 00399 00400 // 00401 // ここで実行させるのはおかしいが、暫定的に 00402 // 00403 if( (int(LPC_TIM3->MR0) - int(LPC_TIM3->TC)) <0 ) 00404 { 00405 printf("=================================================\r\n"); 00406 printf(" Resetting MR0 !!!! \r\n"); 00407 printf("=================================================\r\n"); 00408 LPC_TIM3->MR0 = LPC_TIM3->TC + 1000; 00409 } 00410 00411 } 00412 00413 void NiseKabuto::InitInterruptPriority(void) 00414 { 00415 // http://mbed.org/users/earlz/code/MbedConsole/file/370b9e559f92/main.cpp 00416 00417 NVIC_SetPriority(NonMaskableInt_IRQn, 100 ); 00418 NVIC_SetPriority(MemoryManagement_IRQn, 100); 00419 00420 NVIC_SetPriority(BusFault_IRQn, 100); 00421 NVIC_SetPriority(UsageFault_IRQn, 100); 00422 NVIC_SetPriority(SVCall_IRQn, 100); 00423 NVIC_SetPriority(DebugMonitor_IRQn, 100); 00424 NVIC_SetPriority(PendSV_IRQn, 100); 00425 NVIC_SetPriority(SysTick_IRQn, 50); 00426 NVIC_SetPriority(WDT_IRQn, 100); 00427 NVIC_SetPriority(TIMER0_IRQn, 85); 00428 NVIC_SetPriority(TIMER1_IRQn, 85); 00429 NVIC_SetPriority(TIMER2_IRQn, 85); 00430 NVIC_SetPriority(TIMER3_IRQn, 85); 00431 NVIC_SetPriority(UART0_IRQn, 75); 00432 NVIC_SetPriority(UART1_IRQn, 100); 00433 NVIC_SetPriority(UART2_IRQn, 100); 00434 NVIC_SetPriority(UART3_IRQn, 100); 00435 00436 NVIC_SetPriority(PWM1_IRQn, 100); 00437 NVIC_SetPriority(I2C0_IRQn, 100); 00438 NVIC_SetPriority(I2C1_IRQn, 100); 00439 NVIC_SetPriority(I2C2_IRQn, 100); 00440 NVIC_SetPriority(SPI_IRQn, 100); 00441 NVIC_SetPriority(SSP0_IRQn, 100); 00442 NVIC_SetPriority(SSP1_IRQn, 100); 00443 NVIC_SetPriority(PLL0_IRQn, 100); 00444 NVIC_SetPriority(RTC_IRQn, 100); 00445 NVIC_SetPriority(EINT0_IRQn, 100); 00446 NVIC_SetPriority(EINT1_IRQn, 100); 00447 00448 NVIC_SetPriority(EINT2_IRQn, 100); 00449 NVIC_SetPriority(EINT3_IRQn, 20); // 最高 00450 NVIC_SetPriority(ADC_IRQn, 100); 00451 NVIC_SetPriority(BOD_IRQn, 100); 00452 NVIC_SetPriority(USB_IRQn, 100); 00453 NVIC_SetPriority(CAN_IRQn, 100); 00454 NVIC_SetPriority(DMA_IRQn, 100); 00455 00456 NVIC_SetPriority(I2S_IRQn, 100); 00457 NVIC_SetPriority(ENET_IRQn, 100); 00458 NVIC_SetPriority(RIT_IRQn, 100); 00459 NVIC_SetPriority(MCPWM_IRQn, 100); 00460 NVIC_SetPriority(QEI_IRQn, 100); 00461 NVIC_SetPriority(PLL1_IRQn, 100); 00462 00463 } 00464 00465 00466 void NiseKabuto::WaitUs(uint32_t nus) 00467 { 00468 uint32_t countNop, countNopMAX; 00469 countNopMAX = 24; // 96MHz動作のmbedで、1usになるような値にする 00470 00471 for(uint32_t i=0; i<nus; i++) 00472 { 00473 countNop = countNopMAX; 00474 while(countNop--) 00475 { 00476 __nop(); 00477 } 00478 } 00479 00480 } 00481
Generated on Thu Jul 14 2022 14:49:55 by
1.7.2