So as it turns out, one can differentiate between up-crossings (negative to positive) and down-crossings (positive to negative). Since I am only interested in up-crossings, I can set up the following to meet my needs:
# Stopping conditions:
condition(u, t, integrator) = u[1] # when x=0
function affect!(integrator)
# extract counter from the "cache"
event_num = integrator.p[2]
# update crossing amount
event_num += 1
# if crossings = n_crossings, terminate, else nothing
event_num == n_cross ? terminate!(integrator) : nothing
# update the "cache" value
integrator.p[2] = event_num
end
cb = ContinuousCallback(condition, affect!;
affect_neg! = nothing)