--- Quote Start ---
I wonder how this statement is evaluated, I fear not as an intersection, as apparently intended.
elsif (Current_state = (DISPENSE_PILL OR PILL_DETECTED OR PILL_NOT_DETECTED) ) then
The code would be much clearer with a case structure for the processes, I think,
--- Quote End ---
This suggests the Current_state signal is a std_logic_vector. Any reason why you did this and not an enumerated type?
doing an or like this will literally or the values together. So if the 3 things you put were 100, 010 and 001, it would be checking for current_state to be 111. You have to explicitly say:
if current_state = X or Current_state = Y or current_state = Z then
X =Y is a boolean return value in VHDL.