Couldn't you charge by doing something like this?
note: This isn't real code, just the basic idea.
Start
stateTransitionOnTriggerUp[1] = "Ready";
stateTransitionOnTriggerdown[4] = "Charge1";
Charge1
stateTransitionOnTriggerUp[1] = "Ready";
stateTransitionOnTriggerdown[4] = "Charge2";
Charge2
stateTransitionOnTriggerUp[1] = "Ready";
stateTransitionOnTriggerdown[4] = "Charge3";
Charge3
stateTransitionOnTriggerUp[1] = "Ready";
stateTransitionOnTriggerdown[4] = "Fire";
Fire
"Stuff for the shot"
And using state transition times?