: $Id: nstim.mod,v 1.24 2006/04/03 19:18:18 billl Exp $

NEURON	{ 
  ARTIFICIAL_CELL NStim
  RANGE interval, number, start, end
  RANGE noise,type,id
}

PARAMETER {
  interval	= 10 (ms) <1e-9,1e9>: time between spikes (msec)
  number	= 10 <0,1e9>	: number of spikes
  start		= 50 (ms)	: start of first spike
  noise		= 0 <0,1>	: amount of randomeaness (0.0 - 1.0)
  end		= 1e9 (ms)	: time to terminate train
}

ASSIGNED {
  event (ms)
  on
  endt (ms)
  type
  id
}

CONSTRUCTOR {
  VERBATIM 
  { if (ifarg(1)) { id= *getarg(1); } else { id= -1; }
    if (ifarg(2)) { type= *getarg(2); } else { type= 1; }
  }
  ENDVERBATIM
}

PROCEDURE seed (x) {
  set_seed(x)
}

INITIAL {
  on = 0
  if (noise < 0) { noise = 0 }
  if (noise > 1) { noise = 1 }
  if (interval <= 0.) { interval = .01 (ms) }
  if (start>=0 && number>0 && end>0) {
    event = start + invl(interval) - interval*(1. - noise)
    if (event < 0) { event = 0 }
    net_send(event, 3)
  }
}	

PROCEDURE init_sequence (t(ms)) {
  if (number > 0) {
    on = 1
    event = t
    endt = t + 1e-6 + interval*(number-1)
  }
}

FUNCTION invl (mean (ms)) (ms) {
  if (noise == 0) {
    invl = mean
  } else {
    invl = (1. - noise)*mean + noise*mean*exprand(1)
  }
}

NET_RECEIVE (w) {
  if (flag == 0) { : external event
    if (w > 0 && on == 0) { : turn on spike sequence
      init_sequence(t)
      net_send(0, 1)
    } else if (w < 0 && on == 1) { : turn off spiking
      on = 0
    }
  }
  if (flag == 3) { : from INITIAL
    if (on == 0) {
      init_sequence(t)
      net_send(0, 1)
    }
  }
  if (flag == 1 && on == 1) {
    net_event(t)
    event = event + invl(interval)
    if (event > endt || event > end) {
      on = 0
    } else {
      net_send(event - t, 1)
    }
  }
}

FUNCTION fflag () { fflag=1 }