mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 06:28:27 -04:00
AP_Mount: Siyi gets improved model detection
# Conflicts: # libraries/AP_Mount/AP_Mount_Siyi.cpp
This commit is contained in:
parent
fa70a56a65
commit
9a5acec243
@ -21,6 +21,16 @@ extern const AP_HAL::HAL& hal;
|
|||||||
#define AP_MOUNT_SIYI_DEBUG 0
|
#define AP_MOUNT_SIYI_DEBUG 0
|
||||||
#define debug(fmt, args ...) do { if (AP_MOUNT_SIYI_DEBUG) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Siyi: " fmt, ## args); } } while (0)
|
#define debug(fmt, args ...) do { if (AP_MOUNT_SIYI_DEBUG) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Siyi: " fmt, ## args); } } while (0)
|
||||||
|
|
||||||
|
// hardware lookup table indexed by HardwareModel enum values
|
||||||
|
const AP_Mount_Siyi::HWInfo AP_Mount_Siyi::hardware_lookup_table[] {
|
||||||
|
{{'0','0'}, "Unknown"},
|
||||||
|
{{'7','5'}, "A2"},
|
||||||
|
{{'7','3'}, "A8"},
|
||||||
|
{{'6','B'}, "ZR10"},
|
||||||
|
{{'7','8'}, "ZR30"},
|
||||||
|
{{'7','A'}, "ZT30"},
|
||||||
|
};
|
||||||
|
|
||||||
// init - performs any required initialisation for this instance
|
// init - performs any required initialisation for this instance
|
||||||
void AP_Mount_Siyi::init()
|
void AP_Mount_Siyi::init()
|
||||||
{
|
{
|
||||||
@ -52,6 +62,9 @@ void AP_Mount_Siyi::update()
|
|||||||
if (!_got_firmware_version) {
|
if (!_got_firmware_version) {
|
||||||
request_firmware_version();
|
request_firmware_version();
|
||||||
return;
|
return;
|
||||||
|
} else if (!_got_hardware_id) {
|
||||||
|
request_hardware_id();
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
request_configuration();
|
request_configuration();
|
||||||
}
|
}
|
||||||
@ -307,9 +320,6 @@ void AP_Mount_Siyi::process_packet()
|
|||||||
}
|
}
|
||||||
_got_firmware_version = true;
|
_got_firmware_version = true;
|
||||||
|
|
||||||
// set hardware version based on message length
|
|
||||||
_hardware_model = (_parsed_msg.data_bytes_received <= 8) ? HardwareModel::A8 : HardwareModel::ZR10;
|
|
||||||
|
|
||||||
// consume and display camera firmware version
|
// consume and display camera firmware version
|
||||||
_cam_firmware_version = {
|
_cam_firmware_version = {
|
||||||
_msg_buff[_msg_buff_data_start+2], // firmware major version
|
_msg_buff[_msg_buff_data_start+2], // firmware major version
|
||||||
@ -340,9 +350,19 @@ void AP_Mount_Siyi::process_packet()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SiyiCommandId::HARDWARE_ID:
|
case SiyiCommandId::HARDWARE_ID: {
|
||||||
// unsupported
|
// lookup first two digits of hardware id
|
||||||
|
const uint8_t hwid0 = _msg_buff[_msg_buff_data_start];
|
||||||
|
const uint8_t hwid1 = _msg_buff[_msg_buff_data_start+1];
|
||||||
|
for (uint8_t i=1; i<ARRAY_SIZE(hardware_lookup_table); i++) {
|
||||||
|
if (hwid0 == hardware_lookup_table[i].hwid[0] && hwid1 == hardware_lookup_table[i].hwid[1]) {
|
||||||
|
_hardware_model = (HardwareModel)i;
|
||||||
|
gcs().send_text(MAV_SEVERITY_INFO, "Mount: Siyi %s", get_model_name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_got_hardware_id = true;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SiyiCommandId::AUTO_FOCUS:
|
case SiyiCommandId::AUTO_FOCUS:
|
||||||
#if AP_MOUNT_SIYI_DEBUG
|
#if AP_MOUNT_SIYI_DEBUG
|
||||||
@ -684,11 +704,14 @@ float AP_Mount_Siyi::get_zoom_mult_max() const
|
|||||||
switch (_hardware_model) {
|
switch (_hardware_model) {
|
||||||
case HardwareModel::UNKNOWN:
|
case HardwareModel::UNKNOWN:
|
||||||
return 0;
|
return 0;
|
||||||
|
case HardwareModel::A2:
|
||||||
case HardwareModel::A8:
|
case HardwareModel::A8:
|
||||||
// a8 has 6x digital zoom
|
// a8 has 6x digital zoom
|
||||||
return 6;
|
return 6;
|
||||||
case HardwareModel::ZR10:
|
case HardwareModel::ZR10:
|
||||||
// zr10 has 30x hybrid zoom (optical + digital)
|
case HardwareModel::ZR30:
|
||||||
|
case HardwareModel::ZT30:
|
||||||
|
// 30x hybrid zoom (optical + digital)
|
||||||
return 30;
|
return 30;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -785,21 +808,25 @@ void AP_Mount_Siyi::send_camera_information(mavlink_channel_t chan) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t vendor_name[32] = "Siyi";
|
static const uint8_t vendor_name[32] = "Siyi";
|
||||||
static uint8_t model_name[32] = "Unknown";
|
static uint8_t model_name[32] {};
|
||||||
const uint32_t fw_version = _cam_firmware_version.major | (_cam_firmware_version.minor << 8) | (_cam_firmware_version.patch << 16);
|
const uint32_t fw_version = _cam_firmware_version.major | (_cam_firmware_version.minor << 8) | (_cam_firmware_version.patch << 16);
|
||||||
const char cam_definition_uri[140] {};
|
const char cam_definition_uri[140] {};
|
||||||
|
|
||||||
|
// copy model name
|
||||||
|
strncpy((char *)model_name, get_model_name(), sizeof(model_name)-1);
|
||||||
|
|
||||||
// focal length
|
// focal length
|
||||||
|
// To-Do: check these values are correct for A2, ZR30, ZT30
|
||||||
float focal_length_mm = 0;
|
float focal_length_mm = 0;
|
||||||
switch (_hardware_model) {
|
switch (_hardware_model) {
|
||||||
case HardwareModel::UNKNOWN:
|
case HardwareModel::UNKNOWN:
|
||||||
break;
|
case HardwareModel::A2:
|
||||||
case HardwareModel::A8:
|
case HardwareModel::A8:
|
||||||
strncpy((char *)model_name, "A8", sizeof(model_name));
|
|
||||||
focal_length_mm = 21;
|
focal_length_mm = 21;
|
||||||
break;
|
break;
|
||||||
case HardwareModel::ZR10:
|
case HardwareModel::ZR10:
|
||||||
strncpy((char *)model_name, "ZR10", sizeof(model_name));
|
case HardwareModel::ZR30:
|
||||||
|
case HardwareModel::ZT30:
|
||||||
// focal length range from 5.15 ~ 47.38
|
// focal length range from 5.15 ~ 47.38
|
||||||
focal_length_mm = 5.15;
|
focal_length_mm = 5.15;
|
||||||
break;
|
break;
|
||||||
@ -846,4 +873,14 @@ void AP_Mount_Siyi::send_camera_settings(mavlink_channel_t chan) const
|
|||||||
NaN); // focusLevel float, percentage from 0 to 100, NaN if unknown
|
NaN); // focusLevel float, percentage from 0 to 100, NaN if unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get model name string. returns "Unknown" if hardware model is not yet known
|
||||||
|
const char* AP_Mount_Siyi::get_model_name() const
|
||||||
|
{
|
||||||
|
uint8_t model_idx = (uint8_t)_hardware_model;
|
||||||
|
if (model_idx < ARRAY_SIZE(hardware_lookup_table)) {
|
||||||
|
return hardware_lookup_table[model_idx].model_name;
|
||||||
|
}
|
||||||
|
return hardware_lookup_table[0].model_name;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // HAL_MOUNT_SIYI_ENABLED
|
#endif // HAL_MOUNT_SIYI_ENABLED
|
||||||
|
@ -137,9 +137,12 @@ private:
|
|||||||
|
|
||||||
// hardware model enum
|
// hardware model enum
|
||||||
enum class HardwareModel : uint8_t {
|
enum class HardwareModel : uint8_t {
|
||||||
UNKNOWN,
|
UNKNOWN = 0,
|
||||||
|
A2,
|
||||||
A8,
|
A8,
|
||||||
ZR10
|
ZR10,
|
||||||
|
ZR30,
|
||||||
|
ZT30
|
||||||
} _hardware_model;
|
} _hardware_model;
|
||||||
|
|
||||||
// gimbal mounting method/direction
|
// gimbal mounting method/direction
|
||||||
@ -197,10 +200,14 @@ private:
|
|||||||
// update zoom controller
|
// update zoom controller
|
||||||
void update_zoom_control();
|
void update_zoom_control();
|
||||||
|
|
||||||
|
// get model name string, returns nullptr if hardware id is unknown
|
||||||
|
const char* get_model_name() const;
|
||||||
|
|
||||||
// internal variables
|
// internal variables
|
||||||
AP_HAL::UARTDriver *_uart; // uart connected to gimbal
|
AP_HAL::UARTDriver *_uart; // uart connected to gimbal
|
||||||
bool _initialised; // true once the driver has been initialised
|
bool _initialised; // true once the driver has been initialised
|
||||||
bool _got_firmware_version; // true once gimbal firmware version has been received
|
bool _got_firmware_version; // true once gimbal firmware version has been received
|
||||||
|
bool _got_hardware_id; // true once hardware id ha been received
|
||||||
struct {
|
struct {
|
||||||
uint8_t major;
|
uint8_t major;
|
||||||
uint8_t minor;
|
uint8_t minor;
|
||||||
@ -240,6 +247,13 @@ private:
|
|||||||
float _zoom_rate_target; // current zoom rate target
|
float _zoom_rate_target; // current zoom rate target
|
||||||
float _zoom_mult; // most recent actual zoom multiple received from camera
|
float _zoom_mult; // most recent actual zoom multiple received from camera
|
||||||
uint32_t _last_zoom_control_ms; // system time that zoom control was last run
|
uint32_t _last_zoom_control_ms; // system time that zoom control was last run
|
||||||
|
|
||||||
|
// hardware lookup table indexed by HardwareModel enum values (see above)
|
||||||
|
struct HWInfo {
|
||||||
|
uint8_t hwid[2];
|
||||||
|
const char* model_name;
|
||||||
|
};
|
||||||
|
static const HWInfo hardware_lookup_table[];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // HAL_MOUNT_SIYISERIAL_ENABLED
|
#endif // HAL_MOUNT_SIYISERIAL_ENABLED
|
||||||
|
Loading…
Reference in New Issue
Block a user