Ejemplo n.º 1
0
int
GPSSIM::devIOCTL(unsigned long cmd, unsigned long arg)
{
	_sync.lock();

	int ret = OK;

	switch (cmd) {
	case SENSORIOCRESET:
		cmd_reset();
		break;

	default:
		/* give it to parent if no one wants it */
		ret = VirtDevObj::devIOCTL(cmd, arg);
		break;
	}

	_sync.unlock();

	return ret;
}
Ejemplo n.º 2
0
void SyncObjTest::_doTests()
{
	SyncObj so;

	bool passed = true;
	so.lock();
	so.unlock();
	reportResult("Simple lock/unlock", passed);

	uint64_t now = offsetTime();
	unsigned long wait_in_us = 5000;
	so.lock();
	int rv = so.waitOnSignal(wait_in_us);
	so.unlock();
	uint64_t after = offsetTime();
	uint64_t delta_usec = after - now;

	if (rv != ETIMEDOUT) {
		DF_LOG_ERR("waitSignal() did not return ETIMEDOUT");
		passed = false;
	}

#ifdef __APPLE__
	const float error_factor = 2.0f;
#else
	const float error_factor = 1.2f;
#endif

	bool dtime_ok = (delta_usec > wait_in_us) && (delta_usec < wait_in_us * error_factor);

	if (!dtime_ok) {
		DF_LOG_ERR("waitSignal() timeout of %luus was %" PRIu64 "us", wait_in_us, delta_usec);
		passed = false;
	}

	reportResult("waitSignal() timeout", passed && dtime_ok);
}
Ejemplo n.º 3
0
void
GPSSIM::task_main()
{

	/* loop handling received serial bytes and also configuring in between */
	while (!_task_should_exit) {

		if (_fake_gps) {
			_report_gps_pos.timestamp = hrt_absolute_time();
			_report_gps_pos.lat = (int32_t)47.378301e7f;
			_report_gps_pos.lon = (int32_t)8.538777e7f;
			_report_gps_pos.alt = (int32_t)1200e3f;
			_report_gps_pos.s_variance_m_s = 10.0f;
			_report_gps_pos.c_variance_rad = 0.1f;
			_report_gps_pos.fix_type = 3;
			_report_gps_pos.eph = 0.9f;
			_report_gps_pos.epv = 1.8f;
			_report_gps_pos.vel_n_m_s = 0.0f;
			_report_gps_pos.vel_e_m_s = 0.0f;
			_report_gps_pos.vel_d_m_s = 0.0f;
			_report_gps_pos.vel_m_s = sqrtf(_report_gps_pos.vel_n_m_s * _report_gps_pos.vel_n_m_s + _report_gps_pos.vel_e_m_s *
							_report_gps_pos.vel_e_m_s + _report_gps_pos.vel_d_m_s * _report_gps_pos.vel_d_m_s);
			_report_gps_pos.cog_rad = 0.0f;
			_report_gps_pos.vel_ned_valid = true;

			//no time and satellite information simulated

			if (!(m_pub_blocked)) {
				if (_report_gps_pos_pub != nullptr) {
					orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos);

				} else {
					_report_gps_pos_pub = orb_advertise(ORB_ID(vehicle_gps_position), &_report_gps_pos);
				}
			}

			usleep(2e5);

		} else {
			//Publish initial report that we have access to a GPS
			//Make sure to clear any stale data in case driver is reset
			memset(&_report_gps_pos, 0, sizeof(_report_gps_pos));
			_report_gps_pos.timestamp = hrt_absolute_time();
			_report_gps_pos.timestamp_time_relative = 0;

			if (!(m_pub_blocked)) {
				if (_report_gps_pos_pub != nullptr) {
					orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos);

				} else {
					_report_gps_pos_pub = orb_advertise(ORB_ID(vehicle_gps_position), &_report_gps_pos);
				}
			}

			// GPS is obviously detected successfully, reset statistics
			//_Helper->reset_update_rates();

			while ((receive(TIMEOUT_5HZ)) > 0 && !_task_should_exit) {
				/* opportunistic publishing - else invalid data would end up on the bus */

				if (!(m_pub_blocked)) {
					orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos);

					if (_p_report_sat_info) {
						if (_report_sat_info_pub != nullptr) {
							orb_publish(ORB_ID(satellite_info), _report_sat_info_pub, _p_report_sat_info);

						} else {
							_report_sat_info_pub = orb_advertise(ORB_ID(satellite_info), _p_report_sat_info);
						}
					}
				}
			}

			// FIXME - if ioctl is called then it will deadlock
			_sync.lock();
		}
	}

	PX4_INFO("exiting");

	/* tell the dtor that we are exiting */
	_task = -1;
	return;
}