static void
wakeup_all_tdaemons(void)
{
	int i;

	for (i = 0; i < _sd_num_daemons; i++)
		daemon_wakeup(i);
}
Exemple #2
0
void
registers_set(uint8_t page, uint8_t offset, const uint16_t *values, unsigned num_values)
{

	switch (page) {

		/* handle bulk controls input */
	case PX4IO_PAGE_CONTROLS:

		/* copy channel data */
		while ((offset < PX4IO_CONTROL_CHANNELS) && (num_values > 0)) {

			/* XXX range-check value? */
			r_page_controls[offset] = *values;

			offset++;
			num_values--;
			values++;
		}

		system_state.fmu_data_received_time = hrt_absolute_time();
		r_status_flags |= PX4IO_P_STATUS_FLAGS_FMU_OK;
		r_status_flags &= ~PX4IO_P_STATUS_FLAGS_RAW_PWM;
		
		// wake up daemon to trigger mixer
		daemon_wakeup();
		break;

		/* handle raw PWM input */
	case PX4IO_PAGE_DIRECT_PWM:

		/* copy channel data */
		while ((offset < PX4IO_CONTROL_CHANNELS) && (num_values > 0)) {

			/* XXX range-check value? */
			r_page_servos[offset] = *values;

			offset++;
			num_values--;
			values++;
		}

		system_state.fmu_data_received_time = hrt_absolute_time();
		r_status_flags |= PX4IO_P_STATUS_FLAGS_FMU_OK | PX4IO_P_STATUS_FLAGS_RAW_PWM;

		// wake up the main thread to trigger mixer
		daemon_wakeup();
		break;

		/* handle setup for servo failsafe values */
	case PX4IO_PAGE_FAILSAFE_PWM:

		/* copy channel data */
		while ((offset < PX4IO_CONTROL_CHANNELS) && (num_values > 0)) {

			/* XXX range-check value? */
			r_page_servo_failsafe[offset] = *values;

			offset++;
			num_values--;
			values++;
		}
		break;

		/* handle text going to the mixer parser */
	case PX4IO_PAGE_MIXERLOAD:
		mixer_handle_text(values, num_values * sizeof(*values));
		break;

	default:
		/* avoid offset wrap */
		if ((offset + num_values) > 255)
			num_values = 255 - offset;

		/* iterate individual registers, set each in turn */
		while (num_values--) {
			if (registers_set_one(page, offset, *values))
				break;
			offset++;
			values++;
		}
	}
}
static int
_fork_test_daemon(int num_disks, int test_typ, int loop_cnt, int from, int seed)
{
	int i;
	int type;
	int dowait = 0, verify = 0;

	if (num_disks == -1) {
		return (test_control(test_typ, loop_cnt, from, seed));
	}

	type = test_typ;
	cmn_err(CE_NOTE,
	    "!sd_test %d %d %d %d %d", num_disks, type, loop_cnt, from, seed);
	if (type == 100) {
		test_stop = 1;
		return (0);
	}

	if (type == 99) {
		/* Set some parameters for other tests */
		switch (num_disks) {
			/* Params set for this test */
#if 0
			case 302 :
				_sd_write_len = loop_cnt;
				break;
			case 303 :
				_sd_write_len = loop_cnt;
				break;
			case 304 :
				_sd_trk_zero = loop_cnt;
				_sd_trk_size = from;
				break;
			case 305 :
				_sd_min_blks = loop_cnt;
				_sd_max_blks = from;
				break;
#endif
			default :
				cmn_err(CE_WARN,
				    "!Usage : sd_test <test_num> 99"
				    " <param1> <param2> <param3>");
				break;
		}
		return (0);
	}		/* type == 99 */

	if (type > 1000) {
		dowait = 1;
		type -= 1000;
	}
	if (type > 1000) {
		verify = 1;
		type -= 1000;
	}

again:
	set_parameters();

	for (i = from; i < (from+num_disks); i++) {
		if (daemon_awake(i)) {
			cmn_err(CE_WARN, "!Daemon %d awake!?", i);
			return (-1);
		}
		if (daemon_nexist(i)) {
			cmn_err(CE_WARN, "!Daemon %d nexist!?", i);
			return (-1);
		}

		gld[i].type = type;
		gld[i].loop = loop_cnt;
		gld[i].seed = seed;
		daemon_wakeup(i);
	}
	cmn_err(CE_CONT, "!%d daemons woken (test %d)\n", num_disks, type);
	if (num_disks <= 0)
		return (0);

	if (dowait) {
	wait:
		mutex_enter(&tdaemon_lock);
		if (!cv_wait_sig(&_wait_daemons, &tdaemon_lock)) {
			mutex_exit(&tdaemon_lock);
			test_stop = 1;
			cmn_err(CE_WARN, "!Interrupt: stopping tests");
			return (-1); /* interrupt */
		}
		mutex_exit(&tdaemon_lock);

		/* wait for all to stop */
		if (test_stop)
			return (-1);
		for (i = from; i < (from+num_disks); i++) {
			if (daemon_awake(i))
				goto wait;
		}
	}
	if (verify) {
		verify = 0;
		type++;		/* next test */
		goto again;
	}
	return (0);
}