Skip to content

Commit fb3b7a4

Browse files
committed
mavlink: receiver handle RC_CHANNELS if from MAV_COMP_ID_SYSTEM_CONTROL
1 parent 2b96e33 commit fb3b7a4

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

src/modules/commander/Arming/PreFlightCheck/checks/rcCalibrationCheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
/**
5151
* Maximum value
5252
*/
53-
#define RC_INPUT_HIGHEST_MAX_US 2500
53+
#define RC_INPUT_HIGHEST_MAX_US 3500
5454

5555
int PreFlightCheck::rcCalibrationCheck(orb_advert_t *mavlink_log_pub, bool report_fail, bool isVTOL)
5656
{

src/modules/mavlink/mavlink_receiver.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ MavlinkReceiver::handle_message(mavlink_message_t *msg)
173173
handle_message_manual_control(msg);
174174
break;
175175

176+
case MAVLINK_MSG_ID_RC_CHANNELS:
177+
handle_message_rc_channels(msg);
178+
break;
179+
176180
case MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE:
177181
handle_message_rc_channels_override(msg);
178182
break;
@@ -1859,6 +1863,73 @@ MavlinkReceiver::decode_switch_pos_n(uint16_t buttons, unsigned sw)
18591863
}
18601864
}
18611865

1866+
void
1867+
MavlinkReceiver::handle_message_rc_channels(mavlink_message_t *msg)
1868+
{
1869+
mavlink_rc_channels_t rc_channels;
1870+
mavlink_msg_rc_channels_decode(msg, &rc_channels);
1871+
1872+
if (msg->compid != MAV_COMP_ID_SYSTEM_CONTROL) {
1873+
PX4_DEBUG("Mavlink receiver only processes RC_CHANNELS from MAV_COMP_ID_SYSTEM_CONTROL");
1874+
return;
1875+
}
1876+
1877+
input_rc_s rc{};
1878+
1879+
rc.timestamp_last_signal = hrt_absolute_time();
1880+
rc.rssi = RC_INPUT_RSSI_MAX;
1881+
1882+
// TODO: fake RSSI from dropped messages?
1883+
// for (auto &component_state : _component_states) {
1884+
// if (component_state.component_id == MAV_COMP_ID_SYSTEM_CONTROL) {
1885+
// rc.rssi = (float)component_state.missed_messages / (float)component_state.received_messages;
1886+
// }
1887+
// }
1888+
1889+
rc.rc_total_frame_count = 1;
1890+
rc.input_source = input_rc_s::RC_INPUT_SOURCE_MAVLINK;
1891+
1892+
// channels
1893+
rc.values[0] = rc_channels.chan1_raw;
1894+
rc.values[1] = rc_channels.chan2_raw;
1895+
rc.values[2] = rc_channels.chan3_raw;
1896+
rc.values[3] = rc_channels.chan4_raw;
1897+
rc.values[4] = rc_channels.chan5_raw;
1898+
rc.values[5] = rc_channels.chan6_raw;
1899+
rc.values[6] = rc_channels.chan7_raw;
1900+
rc.values[7] = rc_channels.chan8_raw;
1901+
rc.values[8] = rc_channels.chan9_raw;
1902+
rc.values[9] = rc_channels.chan10_raw;
1903+
rc.values[10] = rc_channels.chan11_raw;
1904+
rc.values[11] = rc_channels.chan12_raw;
1905+
rc.values[12] = rc_channels.chan13_raw;
1906+
rc.values[13] = rc_channels.chan14_raw;
1907+
rc.values[14] = rc_channels.chan15_raw;
1908+
rc.values[15] = rc_channels.chan16_raw;
1909+
rc.values[16] = rc_channels.chan17_raw;
1910+
rc.values[17] = rc_channels.chan18_raw;
1911+
1912+
// check how many channels are valid
1913+
for (int i = 17; i >= 0; i--) {
1914+
const bool ignore_max = rc.values[i] == UINT16_MAX; // ignore any channel with value UINT16_MAX
1915+
const bool ignore_zero = (i > 7) && (rc.values[i] == 0); // ignore channel 8-18 if value is 0
1916+
1917+
if (ignore_max || ignore_zero) {
1918+
// set all ignored values to zero
1919+
rc.values[i] = 0;
1920+
1921+
} else {
1922+
// first channel to not ignore -> set count considering zero-based index
1923+
rc.channel_count = i + 1;
1924+
break;
1925+
}
1926+
}
1927+
1928+
// publish uORB message
1929+
rc.timestamp = hrt_absolute_time();
1930+
_rc_pub.publish(rc);
1931+
}
1932+
18621933
void
18631934
MavlinkReceiver::handle_message_rc_channels_override(mavlink_message_t *msg)
18641935
{

src/modules/mavlink/mavlink_receiver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class MavlinkReceiver : public ModuleParams
176176
void handle_message_play_tune(mavlink_message_t *msg);
177177
void handle_message_play_tune_v2(mavlink_message_t *msg);
178178
void handle_message_radio_status(mavlink_message_t *msg);
179+
void handle_message_rc_channels(mavlink_message_t *msg);
179180
void handle_message_rc_channels_override(mavlink_message_t *msg);
180181
void handle_message_serial_control(mavlink_message_t *msg);
181182
void handle_message_set_actuator_control_target(mavlink_message_t *msg);

0 commit comments

Comments
 (0)