Another vote for a state machine approach.
I'd also look at using an array of structs to store the data associated with each tap - there's too much repetition in loop.
A simple improvement you could make is to use the constants you have defined for the pin numbers. In this routine in particular, it might help you see a way to simplify:
int GlassFill(int TapSole, int FillTime)
Note also here that not every execution path has a return value. Not that it matters because you never use it anyway.
Also, Don't Repeat Yourself: EmergencyStop should call MotorStop rather than replicating what it does.