Skip to content

Commit 726c882

Browse files
f5sohfilnet
authored andcommitted
Merged in f5soh/librepilot/LP-520_OPlink_RSSI_PPMoutput (pull request #428)
LP-520 OPlink RSSI PPMoutput Approved-by: Lalanne Laurent <f5soh@free.fr> Approved-by: Alessio Morale <alessiomorale@gmail.com> Approved-by: Vladimir Zidar <mr_w@mindnever.org> Approved-by: Brian Webb <webbbn@gmail.com> Approved-by: Philippe Renon <philippe_renon@yahoo.fr>
2 parents 985bead + 6d7aa87 commit 726c882

5 files changed

Lines changed: 58 additions & 18 deletions

File tree

flight/pios/stm32f10x/pios_ppm_out.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
#include "pios_ppm_out_priv.h"
3636

3737
#define PIOS_PPM_OUT_MAX_DEVS 1
38-
#define PIOS_PPM_OUT_MAX_CHANNELS 8
38+
#define PIOS_PPM_OUT_MAX_CHANNELS 8 + 1 // 8 RC channels + Rssi
3939
#define PIOS_PPM_OUT_FRAME_PERIOD_US 22500 // microseconds
4040
#define PIOS_PPM_OUT_HIGH_PULSE_US 400 // microseconds
4141
#define PIOS_PPM_OUT_MIN_CHANNEL_PULSE_US 1000 // microseconds

flight/targets/boards/oplinkmini/firmware/pios_board.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ uint32_t pios_com_gcs_id = 0;
5757
uint32_t pios_com_gcs_out_id = 0;
5858
#if defined(PIOS_INCLUDE_PPM_OUT)
5959
uint32_t pios_ppm_out_id = 0;
60+
bool ppm_rssi = false;
6061
#endif
6162
#if defined(PIOS_INCLUDE_RFM22B)
6263
#include <pios_rfm22b_com.h>
@@ -142,6 +143,7 @@ void PIOS_Board_Init(void)
142143
bool ppm_only = (oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL);
143144
bool ppm_mode = ((oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_CONTROL) ||
144145
(oplinkSettings.LinkType == OPLINKSETTINGS_LINKTYPE_DATAANDCONTROL));
146+
ppm_rssi = (oplinkSettings.PPMOutRSSI == OPLINKSETTINGS_PPMOUTRSSI_TRUE);
145147
bool servo_main = false;
146148
bool servo_flexi = false;
147149

@@ -251,7 +253,6 @@ void PIOS_Board_Init(void)
251253
if (is_coordinator) {
252254
PIOS_BOARD_IO_Configure_PPM_RCVR(&pios_ppm_main_cfg);
253255
}
254-
// For some reason, PPM output on the main port doesn't work.
255256
#if defined(PIOS_INCLUDE_PPM_OUT)
256257
else {
257258
PIOS_PPM_Out_Init(&pios_ppm_out_id, &pios_main_ppm_out_cfg);
@@ -305,7 +306,6 @@ void PIOS_Board_Init(void)
305306
if (is_coordinator) {
306307
PIOS_BOARD_IO_Configure_PPM_RCVR(&pios_ppm_flexi_cfg);
307308
}
308-
// For some reason, PPM output on the flexi port doesn't work.
309309
#if defined(PIOS_INCLUDE_PPM_OUT)
310310
else {
311311
PIOS_PPM_Out_Init(&pios_ppm_out_id, &pios_flexi_ppm_out_cfg);
@@ -437,14 +437,23 @@ static void PIOS_Board_PPM_callback(__attribute__((unused)) uint32_t context, co
437437
#if defined(PIOS_INCLUDE_PPM) && defined(PIOS_INCLUDE_PPM_OUT)
438438
if (pios_ppm_out_id) {
439439
for (uint8_t i = 0; i < RFM22B_PPM_NUM_CHANNELS; ++i) {
440-
if (channels[i] != PIOS_RCVR_INVALID) {
440+
if ((channels[i] != PIOS_RCVR_INVALID) && (channels[i] != PIOS_RCVR_TIMEOUT)) {
441441
PIOS_PPM_OUT_Set(PIOS_PPM_OUTPUT, i, channels[i]);
442442
}
443443
}
444+
// Rssi channel output is added after RC channels
445+
// Output Rssi from 1000µs to 2000µs (-127dBm to -16dBm range)
446+
if (ppm_rssi) {
447+
int8_t rssi;
448+
int16_t ppm_value;
449+
OPLinkStatusRSSIGet(&rssi);
450+
ppm_value = 1000 + ((rssi + 127) * 9);
451+
PIOS_PPM_OUT_Set(PIOS_PPM_OUTPUT, RFM22B_PPM_NUM_CHANNELS, ppm_value);
452+
}
444453
}
445454
#if defined(PIOS_INCLUDE_SERVO)
446455
for (uint8_t i = 0; i < servo_count; ++i) {
447-
uint16_t val = (channels[i] == PIOS_RCVR_INVALID) ? 0 : channels[i];
456+
uint16_t val = ((channels[i] == PIOS_RCVR_INVALID) || (channels[i] == PIOS_RCVR_TIMEOUT)) ? 0 : channels[i];
448457
PIOS_Servo_Set(i, val);
449458
}
450459
#endif /* PIOS_INCLUDE_SERVO */

ground/gcs/src/plugins/config/configoplinkwidget.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ ConfigOPLinkWidget::ConfigOPLinkWidget(QWidget *parent) : ConfigTaskWidget(paren
8282
addWidgetBinding("OPLinkSettings", "MaxRFPower", m_oplink->MaxRFTxPower);
8383
addWidgetBinding("OPLinkSettings", "MainPort", m_oplink->MainPort);
8484
addWidgetBinding("OPLinkSettings", "FlexiPort", m_oplink->FlexiPort);
85+
addWidgetBinding("OPLinkSettings", "PPMOutRSSI", m_oplink->PPMoutRssi);
8586
addWidgetBinding("OPLinkSettings", "RadioPriStream", m_oplink->RadioPriStream);
8687
addWidgetBinding("OPLinkSettings", "RadioAuxStream", m_oplink->RadioAuxStream);
8788
addWidgetBinding("OPLinkSettings", "VCPBridge", m_oplink->VCPBridge);
@@ -263,6 +264,7 @@ void ConfigOPLinkWidget::updateSettings()
263264
bool is_receiver = isComboboxOptionSelected(m_oplink->Protocol, OPLinkSettings::PROTOCOL_OPLINKRECEIVER);
264265
bool is_oplink = (is_receiver || is_coordinator);
265266
bool is_ppm_only = isComboboxOptionSelected(m_oplink->LinkType, OPLinkSettings::LINKTYPE_CONTROL);
267+
bool is_ppm = isComboboxOptionSelected(m_oplink->LinkType, OPLinkSettings::LINKTYPE_DATAANDCONTROL);
266268
bool is_main_serial = isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
267269
bool is_main_telem = isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY);
268270
bool is_flexi_serial = isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_SERIAL);
@@ -277,6 +279,9 @@ void ConfigOPLinkWidget::updateSettings()
277279
bool is_stream_flexi = isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_FLEXI) ||
278280
isComboboxOptionSelected(m_oplink->RadioAuxStream, OPLinkSettings::RADIOAUXSTREAM_FLEXI);
279281

282+
bool is_flexi_ppm = isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_PPM);
283+
bool is_main_ppm = isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_PPM);
284+
280285
if (!is_stream_main && !is_vcp_main && (is_main_serial || is_main_telem)) {
281286
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED);
282287
is_main_serial = false;
@@ -295,6 +300,9 @@ void ConfigOPLinkWidget::updateSettings()
295300

296301
m_oplink->MainPort->setEnabled(is_oplink || is_vcp_main);
297302
m_oplink->FlexiPort->setEnabled(is_oplink || is_vcp_flexi);
303+
304+
m_oplink->PPMoutRssi->setEnabled(is_receiver && (is_ppm || is_ppm_only) && (is_flexi_ppm || is_main_ppm));
305+
298306
m_oplink->MainComSpeed->setEnabled(is_oplink && !is_ppm_only && !is_vcp_main && (is_main_serial || is_main_telem));
299307
m_oplink->FlexiComSpeed->setEnabled(is_oplink && !is_ppm_only && !is_vcp_flexi && (is_flexi_serial || is_flexi_telem));
300308
m_oplink->CoordID->setEnabled(is_receiver || is_openlrs);
@@ -416,6 +424,9 @@ void ConfigOPLinkWidget::mainPortChanged()
416424
{
417425
switch (getComboboxSelectedOption(m_oplink->MainPort)) {
418426
case OPLinkSettings::MAINPORT_PPM:
427+
if (isComboboxOptionSelected(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_PPM)) {
428+
setComboboxSelectedOption(m_oplink->FlexiPort, OPLinkSettings::FLEXIPORT_DISABLED);
429+
}
419430
case OPLinkSettings::MAINPORT_PWM:
420431
case OPLinkSettings::MAINPORT_DISABLED:
421432
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_MAIN)) {
@@ -439,12 +450,16 @@ void ConfigOPLinkWidget::mainPortChanged()
439450
default:
440451
break;
441452
}
453+
updateSettings();
442454
}
443455

444456
void ConfigOPLinkWidget::flexiPortChanged()
445457
{
446458
switch (getComboboxSelectedOption(m_oplink->FlexiPort)) {
447459
case OPLinkSettings::FLEXIPORT_PPM:
460+
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_PPM)) {
461+
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_DISABLED);
462+
}
448463
case OPLinkSettings::FLEXIPORT_PWM:
449464
case OPLinkSettings::FLEXIPORT_DISABLED:
450465
if (isComboboxOptionSelected(m_oplink->RadioPriStream, OPLinkSettings::RADIOPRISTREAM_FLEXI)) {
@@ -462,14 +477,13 @@ void ConfigOPLinkWidget::flexiPortChanged()
462477
if (isComboboxOptionSelected(m_oplink->MainPort, OPLinkSettings::MAINPORT_TELEMETRY)) {
463478
setComboboxSelectedOption(m_oplink->MainPort, OPLinkSettings::MAINPORT_SERIAL);
464479
}
465-
m_oplink->FlexiComSpeed->setEnabled(true);
466-
break;
467480
case OPLinkSettings::FLEXIPORT_SERIAL:
468481
m_oplink->FlexiComSpeed->setEnabled(true);
469482
break;
470483
default:
471484
break;
472485
}
486+
updateSettings();
473487
}
474488

475489
void ConfigOPLinkWidget::radioPriStreamChanged()

ground/gcs/src/plugins/config/oplink.ui

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,6 +2143,22 @@ Leave blank to use autogenerated Device ID.</string>
21432143
</property>
21442144
</widget>
21452145
</item>
2146+
<item row="2" column="1" colspan="3">
2147+
<widget class="QCheckBox" name="PPMoutRssi">
2148+
<property name="toolTip">
2149+
<string>Add RSSI to the PPM output stream (Ch9)</string>
2150+
</property>
2151+
<property name="layoutDirection">
2152+
<enum>Qt::LeftToRight</enum>
2153+
</property>
2154+
<property name="text">
2155+
<string>Send RSSI over PPM (Ch9)</string>
2156+
</property>
2157+
<property name="tristate">
2158+
<bool>false</bool>
2159+
</property>
2160+
</widget>
2161+
</item>
21462162
</layout>
21472163
</widget>
21482164
</item>

shared/uavobjectdefinition/oplinksettings.xml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
<xml>
22
<object name="OPLinkSettings" singleinstance="true" settings="true" category="System">
33
<description>OPLink configurations options.</description>
4-
<field name="Protocol" units="" type="enum" elements="1" options="Disabled,OPLinkReceiver,OPLinkCoordinator,OpenLRS" defaultvalue="Disabled"/>
5-
<field name="LinkType" units="" type="enum" elements="1" options="Data,Control,DataAndControl" defaultvalue="Data"/>
6-
<field name="CoordID" units="hex" type="uint32" elements="1" defaultvalue="0"/>
4+
<field name="Protocol" units="" type="enum" elements="1" options="Disabled,OPLinkReceiver,OPLinkCoordinator,OpenLRS" defaultvalue="Disabled"/>
5+
<field name="LinkType" units="" type="enum" elements="1" options="Data,Control,DataAndControl" defaultvalue="Data"/>
6+
<field name="CoordID" units="hex" type="uint32" elements="1" defaultvalue="0"/>
77
<field name="CustomDeviceID" units="hex" type="uint32" elements="1" defaultvalue="0"/>
88

9-
<!-- port options -->
9+
<!-- port options -->
1010
<field name="MainPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,PPM,PWM" defaultvalue="Disabled"/>
1111
<field name="FlexiPort" units="" type="enum" elements="1" options="Disabled,Telemetry,Serial,PPM,PWM" defaultvalue="Disabled"/>
12+
<field name="PPMOutRSSI" units="" type="enum" elements="1" options="False,True" defaultvalue="False" description="Add RSSI to the PPM output stream (Ch9)"/>
1213
<field name="RadioPriStream" units="connection" type="enum" elements="1" options="Disabled,HID,Main,Flexi,VCP" defaultvalue="HID"/>
13-
<field name="RadioAuxStream" units="connection" type="enum" elements="1" options="Disabled,HID,Main,Flexi,VCP" defaultvalue="Disabled"/>
14-
<field name="VCPBridge" units="connection" type="enum" elements="1" options="Disabled,Main,Flexi" defaultvalue="Disabled"/>
15-
<field name="MainComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
16-
<field name="FlexiComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
17-
<field name="AirDataRate" units="bps" type="enum" elements="1" options="9600,19200,32000,57600,64000,100000,128000,192000,256000" defaultvalue="64000"/>
14+
<field name="RadioAuxStream" units="connection" type="enum" elements="1" options="Disabled,HID,Main,Flexi,VCP" defaultvalue="Disabled"/>
15+
<field name="VCPBridge" units="connection" type="enum" elements="1" options="Disabled,Main,Flexi" defaultvalue="Disabled"/>
16+
<field name="MainComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
17+
<field name="FlexiComSpeed" units="bps" type="enum" elements="1" options="Disabled,4800,9600,19200,38400,57600,115200" defaultvalue="38400"/>
18+
<field name="AirDataRate" units="bps" type="enum" elements="1" options="9600,19200,32000,57600,64000,100000,128000,192000,256000" defaultvalue="64000"/>
1819

19-
<!-- OpenLRS options -->
20+
<!-- OpenLRS options -->
2021
<field name="Version" units="" type="uint8" elements="1" defaultvalue="0"/>
2122
<field name="SerialBaudrate" units="bps" type="uint32" elements="1" defaultvalue="0"/>
2223
<field name="RFFrequency" units="Hz" type="uint32" elements="1" defaultvalue="0"/>
2324
<field name="FailsafeDelay" units="ms" type="uint32" elements="1" defaultvalue="1000"/>
2425
<field name="RSSIType" units="function" type="enum" elements="1" options="Combined,RSSI,LinkQuality" defaultvalue="Combined"/>
2526
<field name="RFPower" units="" type="uint8" elements="1" defaultvalue="0"/>
2627

27-
<!-- RF options -->
28+
<!-- RF options -->
2829
<field name="RFXtalCap" units="" type="uint8" elements="1" defaultvalue="127" limits="%BE:0:171" description="0 to 171 range, default 127"/>
2930
<field name="MinChannel" units="" type="uint8" elements="1" defaultvalue="0"/>
3031
<field name="MaxChannel" units="" type="uint8" elements="1" defaultvalue="250"/>

0 commit comments

Comments
 (0)