mirror of https://github.com/ArduPilot/ardupilot
AP_Periph: added simulation of DroneCAN servo status
allows for testing of DroneCAN servo logging in SITL
This commit is contained in:
parent
a47aaef2b4
commit
13807f24d7
|
@ -568,6 +568,15 @@ public:
|
||||||
uint16_t pool_peak_percent();
|
uint16_t pool_peak_percent();
|
||||||
void set_rgb_led(uint8_t red, uint8_t green, uint8_t blue);
|
void set_rgb_led(uint8_t red, uint8_t green, uint8_t blue);
|
||||||
|
|
||||||
|
#if AP_SIM_ENABLED
|
||||||
|
// update simulation of servos
|
||||||
|
void sim_update_actuator(uint8_t actuator_id);
|
||||||
|
struct {
|
||||||
|
uint32_t mask;
|
||||||
|
uint32_t last_send_ms;
|
||||||
|
} sim_actuator;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct dronecan_protocol_t {
|
struct dronecan_protocol_t {
|
||||||
CanardInstance canard;
|
CanardInstance canard;
|
||||||
uint32_t canard_memory_pool[HAL_CAN_POOL_SIZE/sizeof(uint32_t)];
|
uint32_t canard_memory_pool[HAL_CAN_POOL_SIZE/sizeof(uint32_t)];
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
#include <AP_HAL/AP_HAL.h>
|
#include <AP_HAL/AP_HAL.h>
|
||||||
#ifdef HAL_PERIPH_ENABLE_RC_OUT
|
#ifdef HAL_PERIPH_ENABLE_RC_OUT
|
||||||
#include "AP_Periph.h"
|
#include "AP_Periph.h"
|
||||||
|
#if AP_SIM_ENABLED
|
||||||
|
#include <dronecan_msgs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// magic value from UAVCAN driver packet
|
// magic value from UAVCAN driver packet
|
||||||
// dsdl/uavcan/equipment/esc/1030.RawCommand.uavcan
|
// dsdl/uavcan/equipment/esc/1030.RawCommand.uavcan
|
||||||
|
@ -112,6 +115,9 @@ void AP_Periph_FW::rcout_srv_unitless(uint8_t actuator_id, const float command_v
|
||||||
SRV_Channels::set_output_norm(function, command_value);
|
SRV_Channels::set_output_norm(function, command_value);
|
||||||
|
|
||||||
rcout_has_new_data_to_update = true;
|
rcout_has_new_data_to_update = true;
|
||||||
|
#if AP_SIM_ENABLED
|
||||||
|
sim_update_actuator(actuator_id);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +128,9 @@ void AP_Periph_FW::rcout_srv_PWM(uint8_t actuator_id, const float command_value)
|
||||||
SRV_Channels::set_output_pwm(function, uint16_t(command_value+0.5));
|
SRV_Channels::set_output_pwm(function, uint16_t(command_value+0.5));
|
||||||
|
|
||||||
rcout_has_new_data_to_update = true;
|
rcout_has_new_data_to_update = true;
|
||||||
|
#if AP_SIM_ENABLED
|
||||||
|
sim_update_actuator(actuator_id);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,4 +181,46 @@ void AP_Periph_FW::rcout_update()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if AP_SIM_ENABLED
|
||||||
|
/*
|
||||||
|
update simulation of servos, sending actuator status
|
||||||
|
*/
|
||||||
|
void AP_Periph_FW::sim_update_actuator(uint8_t actuator_id)
|
||||||
|
{
|
||||||
|
sim_actuator.mask |= 1U << actuator_id;
|
||||||
|
|
||||||
|
// send status at 10Hz
|
||||||
|
const uint32_t period_ms = 100;
|
||||||
|
const uint32_t now_ms = AP_HAL::millis();
|
||||||
|
|
||||||
|
if (now_ms - sim_actuator.last_send_ms < period_ms) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sim_actuator.last_send_ms = now_ms;
|
||||||
|
|
||||||
|
for (uint8_t i=0; i<NUM_SERVO_CHANNELS; i++) {
|
||||||
|
if ((sim_actuator.mask & (1U<<i)) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const SRV_Channel::Aux_servo_function_t function = SRV_Channel::Aux_servo_function_t(SRV_Channel::k_rcin1 + actuator_id - 1);
|
||||||
|
uavcan_equipment_actuator_Status pkt {};
|
||||||
|
pkt.actuator_id = i;
|
||||||
|
// assume 45 degree angle for simulation
|
||||||
|
pkt.position = radians(SRV_Channels::get_output_norm(function) * 45);
|
||||||
|
pkt.force = 0;
|
||||||
|
pkt.speed = 0;
|
||||||
|
pkt.power_rating_pct = UAVCAN_EQUIPMENT_ACTUATOR_STATUS_POWER_RATING_PCT_UNKNOWN;
|
||||||
|
|
||||||
|
uint8_t buffer[UAVCAN_EQUIPMENT_ACTUATOR_STATUS_MAX_SIZE];
|
||||||
|
uint16_t total_size = uavcan_equipment_actuator_Status_encode(&pkt, buffer, !canfdout());
|
||||||
|
|
||||||
|
canard_broadcast(UAVCAN_EQUIPMENT_ACTUATOR_STATUS_SIGNATURE,
|
||||||
|
UAVCAN_EQUIPMENT_ACTUATOR_STATUS_ID,
|
||||||
|
CANARD_TRANSFER_PRIORITY_LOW,
|
||||||
|
&buffer[0],
|
||||||
|
total_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // AP_SIM_ENABLED
|
||||||
|
|
||||||
#endif // HAL_PERIPH_ENABLE_RC_OUT
|
#endif // HAL_PERIPH_ENABLE_RC_OUT
|
||||||
|
|
Loading…
Reference in New Issue