mirror of https://github.com/ArduPilot/ardupilot
GCS_MAVLink: allow non-register device access with devop
useful for i2c devices such as LW20 lidar
This commit is contained in:
parent
75c5d6e1bf
commit
58b739db18
|
@ -33,7 +33,9 @@ void GCS_MAVLINK::handle_device_op_read(const mavlink_message_t &msg)
|
||||||
AP_HAL::OwnPtr<AP_HAL::Device> dev = nullptr;
|
AP_HAL::OwnPtr<AP_HAL::Device> dev = nullptr;
|
||||||
uint8_t retcode = 0;
|
uint8_t retcode = 0;
|
||||||
uint8_t data[sizeof(mavlink_device_op_read_reply_t::data)] {};
|
uint8_t data[sizeof(mavlink_device_op_read_reply_t::data)] {};
|
||||||
|
bool ret = false;
|
||||||
|
uint8_t regstart = packet.regstart;
|
||||||
|
|
||||||
if (packet.bustype == DEVICE_OP_BUSTYPE_I2C) {
|
if (packet.bustype == DEVICE_OP_BUSTYPE_I2C) {
|
||||||
dev = hal.i2c_mgr->get_device(packet.bus, packet.address);
|
dev = hal.i2c_mgr->get_device(packet.bus, packet.address);
|
||||||
} else if (packet.bustype == DEVICE_OP_BUSTYPE_SPI) {
|
} else if (packet.bustype == DEVICE_OP_BUSTYPE_SPI) {
|
||||||
|
@ -50,17 +52,24 @@ void GCS_MAVLINK::handle_device_op_read(const mavlink_message_t &msg)
|
||||||
retcode = 3;
|
retcode = 3;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (!dev->read_registers(packet.regstart, data, packet.count)) {
|
if (regstart == 0xff) {
|
||||||
retcode = 4;
|
// assume raw transfer, non-register interface
|
||||||
dev->get_semaphore()->give();
|
ret = dev->transfer(nullptr, 0, data, packet.count);
|
||||||
goto fail;
|
// reply using register start 0 for display purposes
|
||||||
|
regstart = 0;
|
||||||
|
} else {
|
||||||
|
ret = dev->read_registers(packet.regstart, data, packet.count);
|
||||||
}
|
}
|
||||||
dev->get_semaphore()->give();
|
dev->get_semaphore()->give();
|
||||||
|
if (!ret) {
|
||||||
|
retcode = 4;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
mavlink_msg_device_op_read_reply_send(
|
mavlink_msg_device_op_read_reply_send(
|
||||||
chan,
|
chan,
|
||||||
packet.request_id,
|
packet.request_id,
|
||||||
retcode,
|
retcode,
|
||||||
packet.regstart,
|
regstart,
|
||||||
packet.count,
|
packet.count,
|
||||||
data);
|
data);
|
||||||
return;
|
return;
|
||||||
|
@ -101,10 +110,17 @@ void GCS_MAVLINK::handle_device_op_write(const mavlink_message_t &msg)
|
||||||
retcode = 3;
|
retcode = 3;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
for (uint8_t i=0; i<packet.count; i++) {
|
if (packet.regstart == 0xff) {
|
||||||
if (!dev->write_register(packet.regstart+i, packet.data[i])) {
|
// assume raw transfer, non-register interface
|
||||||
|
if (!dev->transfer(packet.data, packet.count, nullptr, 0)) {
|
||||||
retcode = 4;
|
retcode = 4;
|
||||||
break;
|
}
|
||||||
|
} else {
|
||||||
|
for (uint8_t i=0; i<packet.count; i++) {
|
||||||
|
if (!dev->write_register(packet.regstart+i, packet.data[i])) {
|
||||||
|
retcode = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dev->get_semaphore()->give();
|
dev->get_semaphore()->give();
|
||||||
|
|
Loading…
Reference in New Issue