PX4中GPS回调函数流程

●类的继承关系

A. GPSHelper
B. GPSBaseStationSupport
C.GPSDriverUBX

A, GPSHelper

GPSHelper::GPSHelper(/*Z1*/GPSCallbackPtr callback, void *callback_user)
	: /*Z1*/_callback(callback), _callback_user(callback_user)
{
}

B,GPSBaseStationSupport

class GPSBaseStationSupport : public GPSHelper
{
public:
	GPSBaseStationSupport(/*Z1*/GPSCallbackPtr callback, void *callback_user)
		: GPSHelper(/*Z1*/callback, callback_user) {}
}

C: GPSDriverUBX

// _helper = new GPSDriverUBX(_interface, /*Z1*/&GPS::callback, this, &_report_gps_pos, _p_report_sat_info,gps_ubx_dynmodel);
// GPS::callback --> _callback(callback)
GPSDriverUBX::GPSDriverUBX(Interface gpsInterface, /*Z1*/GPSCallbackPtr callback, void *callback_user,
			   struct vehicle_gps_position_s *gps_position,
			   struct satellite_info_s *satellite_info,
			   uint8_t dynamic_model)
	: GPSBaseStationSupport(/*Z1*/callback, callback_user)
	, _gps_position(gps_position)
	, _satellite_info(satellite_info)
	, _interface(gpsInterface)
	, _dyn_model(dynamic_model)
{
	decodeInit();
}

通过基类指针实例化子类对象(多态)

// Firmware/src/drivers/gps/gps.cpp:693
 _helper = new GPSDriverUBX(_interface, /*Z1*/&GPS::callback, this, &_report_gps_pos, _p_report_sat_info,gps_ubx_dynmodel);
 
//GPS::callback --> _callback(callback)

回调三部曲:
1、定义回调函数
2、定义实现回调函数的"调用函数"
3、实现函数回调

1、定义回调函数:

// Firmware/src/drivers/gps/gps.cpp:446
int GPS::setBaudrate(unsigned baud)
{
    ...
	/* fill the struct for the new configuration */
	tcgetattr(_serial_fd, &uart_config);
    ...
}

2-定义实现回调函数的"调用函数":

// Firmware/src/drivers/gps/gps.cpp:310
int GPS::callback(GPSCallbackType type, void *data1, int data2, void *user)
{
	GPS *gps = (GPS *)user;
	switch (type) {
	case GPSCallbackType::readDeviceData: {
			int num_read = gps->pollOrRead((uint8_t *)data1, data2, *((int *)data1));

			if (num_read > 0) {
				gps->dumpGpsData((uint8_t *)data1, (size_t)num_read, false);
			}

			return num_read;
		}
	case GPSCallbackType::writeDeviceData:
		gps->dumpGpsData((uint8_t *)data1, (size_t)data2, true);
		return write(gps->_serial_fd, data1, (size_t)data2);

	case GPSCallbackType::setBaudrate:
		return gps->setBaudrate(data2);
    ...
	return 0;
}

3、实现函数回调:

// Firmware/src/drivers/gps/devices/src/ubx.cpp:104
GPSDriverUBX::configure(unsigned &baudrate, OutputMode output_mode)
{
	...
	setBaudrate(test_baudrate);
	...
}

// Firmware/src/drivers/gps/devices/src/gps_helper.h:228
int setBaudrate(int baudrate)
{
	return _callback(GPSCallbackType::setBaudrate, nullptr, baudrate, _callback_user);
	/*
	根据上述继承关系,和构造函数可知:
	_callback = &GPS::callback;
	*/
}


发布了14 篇原创文章 · 获赞 9 · 访问量 1581

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/102930514