Example #1
0
void		read_in_mem(t_vm *vm)
{
  t_proc	*proc;

  for (proc = vm->proc; proc; proc = proc->next)
    if (proc->cur_work == READING)
    {
      if (!proc->rw->size || (proc->rw->cur_pos < proc->rw->size))
      {
	read_mem_value(vm, proc);
	inc_pc(proc->pc);
	proc->rw->cur_pos++;
      }
      if (!(proc->rw->cur_pos < 2) && !proc->rw->size)
      {
        proc->rw->size = get_inst_size(proc->rw->inst);
        proc->rw->delay = get_inst_delay(proc->rw->inst) + 1;
      }
      if (proc->rw->size && proc->rw->cur_pos >= proc->rw->size)
      {
        proc->cur_work = WAITING;
	if (vm->flags & TRACE)
	  trace_mode(vm, proc);
      }
    }
}
static void pacemaker_input_handler(const void* arg)
{
	ModelImpl::Dispatcher* disp = (ModelImpl::Dispatcher*)arg;

	for (;;)
	{
		ModelImpl::DelayedThread::signal_wait(1);
		while (pc.readable())
		{
			switch (pc.getc() & 0xDF)
			{
			case 'N': trace_mode("Normal mode");  disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_normal); break;
			case 'S': trace_mode("Sleep mode"); disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_sleep); break;
			case 'E': trace_mode("Sports mode"); disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_sports); break;
			case 'M': trace_mode("Manual mode"); disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_manual); break;

				// these two will have no effect if we are not in manual mode, the signal will just be cleared next tick
			case 'A': disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_gen_1); break;
			case 'V': disp->fire_channel(&Model::GLOBAL_CHANNEL_VAR_testPM_gen_0); break; // XXXX gen2
			case 'O':
				int val = 0;
				for (;;)
				{
					char c = (char)pc.getc();
					if (c >= '0' && c <= '9')
						val = val * 10 + c - '0';
					else
					{
						if (c == '\r' || c == '\n')
						{
							Model::SystemVariables.int_GLOBAL_cur_msti = val;
							pclock.lock();
							pc.printf("Observation period set to: %imsec\r\n", val);
							pclock.unlock();
						}
						break;
					}
				}
				break;
			}
		}
	}
}
void init_as_pacemaker(ModelImpl::Dispatcher& disp)
{
	trace_mode("*** STARTING AS PACEMAKER ***");

	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Apace, print_event, (void*)"APACE");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Vpace, print_event, (void*)"VPACE");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Asense, print_event, (void*)"ASENSE");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Vsense, print_event, (void*)"VSENSE");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Asignal, print_event, (void*)"ASIGNAL");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_Vsignal, print_event, (void*)"VSIGNAL");

	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_AlarmL, show_alarm, (void*)"TOO LOW! ");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_AlarmH, show_alarm, (void*)"TOO HIGH!");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_NoAlarm, show_alarm, (void*)"NORMAL   ");

	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_testPM_normal, show_mode, (void*)"Normal mode ");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_testPM_sleep, show_mode, (void*)"Sleep mode");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_testPM_sports, show_mode, (void*)"Sports mode");
	disp.set_channel_fire_cb(&Model::GLOBAL_CHANNEL_VAR_testPM_manual, show_mode, (void*)"Manual mode");

	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Apace, LED1, ModelImpl::SendChannelModePulseUp, 250000);
	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Vpace, LED2, ModelImpl::SendChannelModePulseUp, 250000);
	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Asense, LED3, ModelImpl::SendChannelModePulseUp, 250000);
	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Vsense, LED4, ModelImpl::SendChannelModePulseUp, 250000);

	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Apace, PM_PIN_PACE_A, ModelImpl::SendChannelModePulseUp, 40000);
	disp.set_channel_action(&Model::GLOBAL_CHANNEL_VAR_Vpace, PM_PIN_PACE_V, ModelImpl::SendChannelModePulseUp, 40000);

	disp.set_receive_input(&Model::GLOBAL_CHANNEL_VAR_Asignal, PM_PIN_SIGNAL_A, PullDown, ModelImpl::ReceiveChannelInterruptRise);
	disp.set_receive_input(&Model::GLOBAL_CHANNEL_VAR_Vsignal, PM_PIN_SIGNAL_V, PullDown, ModelImpl::ReceiveChannelInterruptRise);

	disp.set_state_enter_cb(&Model::PM_DisplayAndAlarm_STATE_ShowRate, show_rate, NULL);

	disp.add_process(&Model::PM_ModeSwitch_PROCESS_STATE);
	disp.add_process(&Model::PM_Sensor_A_PROCESS_STATE);
	disp.add_process(&Model::PM_Sensor_V_PROCESS_STATE);
	disp.add_process(&Model::PM_Pacer_AA_PROCESS_STATE);
	disp.add_process(&Model::PM_Leds_Apace_PROCESS_STATE);
	disp.add_process(&Model::PM_Leds_Asense_PROCESS_STATE);
	disp.add_process(&Model::PM_Leds_Vpace_PROCESS_STATE);
	disp.add_process(&Model::PM_Leds_Vsense_PROCESS_STATE);
	disp.add_process(&Model::PM_DisplayAndAlarm_PROCESS_STATE);

	input_thread.init(pacemaker_input_handler, &disp);
}