@@ -173,6 +173,10 @@ MavlinkReceiver::handle_message(mavlink_message_t *msg)
173
173
handle_message_manual_control (msg);
174
174
break ;
175
175
176
+ case MAVLINK_MSG_ID_RC_CHANNELS:
177
+ handle_message_rc_channels (msg);
178
+ break ;
179
+
176
180
case MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE:
177
181
handle_message_rc_channels_override (msg);
178
182
break ;
@@ -1859,6 +1863,73 @@ MavlinkReceiver::decode_switch_pos_n(uint16_t buttons, unsigned sw)
1859
1863
}
1860
1864
}
1861
1865
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
+
1862
1933
void
1863
1934
MavlinkReceiver::handle_message_rc_channels_override (mavlink_message_t *msg)
1864
1935
{
0 commit comments