●类的继承关系
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;
*/
}