void Xbox360Peripheral::SendToggle(void) { SendSpecial(serialToggle ? 0x1F : 0x1E); serialToggle = !serialToggle; }
void Xbox360Peripheral::ChatPadTimerAction(IOTimerEventSource *sender) { int nextTime, serialGot; serialGot = 0; nextTime = 1000; switch (serialTimerState) { case tsToggle: SendToggle(); if (serialActive) { if (!serialHeard) { serialActive = false; serialGot = 2; } } else { if (serialHeard) { serialTimerState = tsReset1; serialResetCount = 0; nextTime = 40; } } break; case tsMiniToggle: SendToggle(); if (serialHeard) { serialTimerState = tsSet1; nextTime = 40; } else { serialResetCount++; if (serialResetCount > 3) { serialTimerState = tsToggle; } else { serialTimerState = tsReset1; nextTime = 40; } } break; case tsReset1: SendSpecial(0x1B); serialTimerState = tsReset2; nextTime = 35; break; case tsReset2: SendSpecial(0x1B); serialTimerState = tsMiniToggle; nextTime = 150; break; case tsSet1: SendSpecial(0x18); serialTimerState = tsSet2; nextTime = 10; break; case tsSet2: SendSpecial(0x10); serialTimerState = tsSet3; nextTime = 10; break; case tsSet3: SendSpecial(0x03); serialTimerState = tsToggle; nextTime = 940; serialActive = true; serialGot = 1; break; } sender->setTimeoutMS(nextTime); // Todo: Make it take into account function execution time? serialHeard = false; // Make it happen after the timer's set, for minimum impact switch (serialGot) { case 1: SerialConnect(); break; case 2: SerialDisconnect(); break; default: break; } }