   else if (!active && ignitionMode != OFF)
     disableCoil();
 
-  //Fire Ignition
-  switch(ignitionMode)
-  {
-    case FIRE:
-      dischargeCoil();
-      if (multiFire) remainingCount = multiCount - 1;
-      updateTimer = true;
-      break;
-    case MULTIFIRE:
-      dischargeCoil();
-      remainingCount--;
-      updateTimer = true;
-      break;
-  }
-  
-  if (updateTimer == true) 
-  {
-    stopTimer1();
-    updateTimer = false;
-    timerCount++;
-    
-    if (debug && loopsSinceSerialWrite >= serialOutLoops)
-    {
-      Serial.print("Timer Reached - ");
-      Serial.print(timerCount);
-      Serial.print(", ");
-    }
-    
-    ignitionMode = nextMode(ignitionMode);
-    
-    //Set the delay period (Head of Mode)
-    switch(ignitionMode)
-    {
-      case OFF:
-        dischargeCoil();
-        break;
-      case DWELL:
-        //Charging Coil
-        chargeCoil();
-        startTimer1(dwell);
-        break;
-      case MF_WAIT:
-        //Waiting (MultiFire)
-        startTimer1(multiDelay);
-        break;
-      case MF_DWELL:
-        //Charging Coil
-        chargeCoil();
-        startTimer1(dwell);
-        break;
-      case WAIT:
-        //Waiting (Frequency)
-        startTimer1(period);
-        break;
-    }
-  }
+  completeIgnitionCycle();
   
   if (debug && loopsSinceSerialWrite >= serialOutLoops)
   {

// -------------------------
volatile bool active = false;
byte ignitionMode = OFF;
volatile bool updateTimer = true;
volatile unsigned long tachPrevious = 0;
volatile unsigned long tachCurrent = 0;
unsigned long tachDuration0 = 0;

}

// -------------------------
//      Ignition Cycle
// -------------------------
bool completeIgnitionCycle()
{
  for (;;)
  {
    //Run a Complete Ignition Cycle
    switch(ignitionMode)
    {
      case OFF:
        dischargeCoil();
        break;
      case DWELL:
        //Charging Coil
        chargeCoil();
        delayAtLeast(dwell);
        break;
      case FIRE:
        dischargeCoil();
        if (multiFire) remainingCount = multiCount - 1;
        break;
      case MF_WAIT:
        //Waiting (MultiFire)
        delayAtLeast(multiDelay);
        break;
      case MF_DWELL:
        //Charging Coil
        chargeCoil();
        delayAtLeast(dwell);
        break;
      case MULTIFIRE:
        dischargeCoil();
        remainingCount--;
        break;
      case WAIT:
        //Waiting (Frequency)
        delayAtLeast(period);
        break;
    }
    
    ignitionMode = nextMode(ignitionMode);

    if (ignitionMode == WAIT) return true;
    else if (!active || ignitionMode == OFF) return false;
  }
}

byte nextMode(byte mode)
