Skip to content

Commit 9356ac9

Browse files
committed
LP-548 OPLink will output OPLink receiver objects if mode is set to control or data and control and PPM output is not configured. Also adds support for OPLInkReceiver to all FCs.
1 parent 586a073 commit 9356ac9

39 files changed

Lines changed: 214 additions & 59 deletions

File tree

flight/modules/RadioComBridge/RadioComBridge.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -551,11 +551,9 @@ static void ProcessTelemetryStream(UAVTalkConnection inConnectionHandle, UAVTalk
551551
switch (objId) {
552552
case OPLINKSTATUS_OBJID:
553553
case OPLINKSETTINGS_OBJID:
554-
case OPLINKRECEIVER_OBJID:
555554
case MetaObjectId(OPLINKSTATUS_OBJID):
556555
case MetaObjectId(OPLINKSETTINGS_OBJID):
557-
case MetaObjectId(OPLINKRECEIVER_OBJID):
558-
UAVTalkReceiveObject(inConnectionHandle);
556+
UAVTalkReceiveObject(inConnectionHandle, true);
559557
break;
560558
case OBJECTPERSISTENCE_OBJID:
561559
case MetaObjectId(OBJECTPERSISTENCE_OBJID):
@@ -568,7 +566,7 @@ static void ProcessTelemetryStream(UAVTalkConnection inConnectionHandle, UAVTalk
568566
// Second ack/nack will not match an open transaction or will apply to wrong transaction
569567
// Question : how does GCS handle receiving the same object twice
570568
// The OBJECTPERSISTENCE logic can be broken too if for example OPLM nacks and then REVO acks...
571-
UAVTalkReceiveObject(inConnectionHandle);
569+
UAVTalkReceiveObject(inConnectionHandle, true);
572570
// relay packet to remote modem
573571
UAVTalkRelayPacket(inConnectionHandle, outConnectionHandle);
574572
break;
@@ -616,7 +614,9 @@ static void ProcessRadioStream(UAVTalkConnection inConnectionHandle, UAVTalkConn
616614
// These objects are received by the modem and are not transmitted to the telemetry port
617615
// - OPLINKRECEIVER_OBJID : not sure why
618616
// some objects will send back a response to the remote modem
619-
UAVTalkReceiveObject(inConnectionHandle);
617+
UAVTalkReceiveObject(inConnectionHandle, true);
618+
// all other packets are relayed to the telemetry port
619+
UAVTalkRelayPacket(inConnectionHandle, outConnectionHandle);
620620
break;
621621
default:
622622
// all other packets are relayed to the telemetry port

flight/modules/UAVOMSPBridge/UAVOMSPBridge.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#include "gpspositionsensor.h"
4444
#include "manualcontrolcommand.h"
4545
#include "manualcontrolsettings.h"
46-
#include "oplinkstatus.h"
46+
#include "oplinkreceiver.h"
4747
#include "accessorydesired.h"
4848
#include "attitudestate.h"
4949
#include "airspeedstate.h"
@@ -481,7 +481,7 @@ static void msp_send_analog(struct msp_bridge *m)
481481
#ifdef PIOS_INCLUDE_OPLINKRCVR
482482
if (channelGroups.Throttle == MANUALCONTROLSETTINGS_CHANNELGROUPS_OPLINK) {
483483
int8_t rssi;
484-
OPLinkStatusRSSIGet(&rssi);
484+
OPLinkReceiverRSSIGet(&rssi);
485485

486486
// MSP values have no units, and OSD rssi display requires calibration anyway, so we will translate OPLINK_LOW_RSSI to OPLINK_HIGH_RSSI -> 0-1023
487487
if (rssi < OPLINK_LOW_RSSI) {

flight/modules/UAVOMavlinkBridge/UAVOMavlinkBridge.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
#include "taskinfo.h"
5353
#include "mavlink.h"
5454
#include "hwsettings.h"
55-
#include "oplinkstatus.h"
55+
#include "oplinkreceiver.h"
5656
#include "receiverstatus.h"
5757
#include "manualcontrolsettings.h"
5858

@@ -250,7 +250,7 @@ static void mavlink_send_rc_channels()
250250
#ifdef PIOS_INCLUDE_OPLINKRCVR
251251
if (channelGroups.Throttle == MANUALCONTROLSETTINGS_CHANNELGROUPS_OPLINK) {
252252
int8_t rssi;
253-
OPLinkStatusRSSIGet(&rssi);
253+
OPLinkReceiverRSSIGet(&rssi);
254254

255255
if (rssi < OPLINK_LOW_RSSI) {
256256
rssi = OPLINK_LOW_RSSI;

flight/pios/common/pios_board_io.c

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,16 @@
5454
# ifdef PIOS_INCLUDE_GCSRCVR
5555
# include <pios_gcsrcvr_priv.h>
5656
# endif
57+
# ifdef PIOS_INCLUDE_OPLINKRCVR
58+
# include <oplinkreceiver.h>
59+
# include <pios_oplinkrcvr_priv.h>
60+
# endif
5761
#endif /* PIOS_INCLUDE_RCVR */
5862

5963
#ifdef PIOS_INCLUDE_RFM22B
6064
# include <oplinksettings.h>
6165
# include <oplinkstatus.h>
6266
# ifdef PIOS_INCLUDE_RCVR
63-
# include <oplinkreceiver.h>
64-
# include <pios_oplinkrcvr_priv.h>
6567
# include <pios_openlrs.h>
6668
# include <pios_openlrs_rcvr_priv.h>
6769
# endif /* PIOS_INCLUDE_RCVR */
@@ -525,7 +527,7 @@ void PIOS_BOARD_IO_Configure_PPM_RCVR(const struct pios_ppm_cfg *ppm_cfg)
525527
}
526528
#endif /* PIOS_INCLUDE_PPM */
527529

528-
#ifdef PIOS_INCLUDE_GCSRCVR
530+
#if defined(PIOS_INCLUDE_GCSRCVR)
529531
void PIOS_BOARD_IO_Configure_GCS_RCVR()
530532
{
531533
GCSReceiverInitialize();
@@ -539,6 +541,24 @@ void PIOS_BOARD_IO_Configure_GCS_RCVR()
539541
}
540542
#endif /* PIOS_INCLUDE_GCSRCVR */
541543

544+
#if defined(PIOS_INCLUDE_OPLINKRCVR) && defined(PIOS_INCLUDE_RCVR)
545+
void PIOS_BOARD_IO_Configure_OPLink_RCVR()
546+
{
547+
uint32_t pios_oplinkrcvr_id;
548+
OPLinkReceiverInitialize();
549+
#if defined(PIOS_INCLUDE_RFM22B)
550+
PIOS_OPLinkRCVR_Init(&pios_oplinkrcvr_id, pios_rfm22b_id);
551+
#else /* PIOS_INCLUDE_RFM22B */
552+
PIOS_OPLinkRCVR_Init(&pios_oplinkrcvr_id);
553+
#endif /* PIOS_INCLUDE_RFM22B */
554+
uint32_t pios_oplinkrcvr_rcvr_id;
555+
if (PIOS_RCVR_Init(&pios_oplinkrcvr_rcvr_id, &pios_oplinkrcvr_rcvr_driver, pios_oplinkrcvr_id)) {
556+
PIOS_Assert(0);
557+
}
558+
pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_OPLINK] = pios_oplinkrcvr_rcvr_id;
559+
}
560+
#endif /* PIOS_INCLUDE_OPLINKRCVR && PIOS_INCLUDE_RCVR */
561+
542562
#ifdef PIOS_INCLUDE_RFM22B
543563

544564
void PIOS_BOARD_IO_Configure_RFM22B()
@@ -596,15 +616,6 @@ void PIOS_BOARD_IO_Configure_RFM22B()
596616
if (PIOS_RFM22B_Init(&pios_rfm22b_id, PIOS_SPI_RFM22B_ADAPTER, rfm22b_cfg->slave_num, rfm22b_cfg, oplinkSettings.RFBand)) {
597617
PIOS_Assert(0);
598618
}
599-
#if defined(PIOS_INCLUDE_OPLINKRCVR) && defined(PIOS_INCLUDE_RCVR)
600-
uint32_t pios_oplinkrcvr_id;
601-
PIOS_OPLinkRCVR_Init(&pios_oplinkrcvr_id, pios_rfm22b_id);
602-
uint32_t pios_oplinkrcvr_rcvr_id;
603-
if (PIOS_RCVR_Init(&pios_oplinkrcvr_rcvr_id, &pios_oplinkrcvr_rcvr_driver, pios_oplinkrcvr_id)) {
604-
PIOS_Assert(0);
605-
}
606-
pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_OPLINK] = pios_oplinkrcvr_rcvr_id;
607-
#endif /* PIOS_INCLUDE_OPLINKRCVR && PIOS_INCLUDE_RCVR */
608619

609620
/* Configure the radio com interface */
610621
if (PIOS_COM_Init(&pios_com_pri_radio_id, &pios_rfm22b_com_driver, pios_rfm22b_id,

flight/pios/common/pios_oplinkrcvr.c

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ struct pios_oplinkrcvr_dev {
6060
bool Fresh;
6161
};
6262

63+
static struct pios_oplinkrcvr_dev *global_oplinkrcvr_dev;
64+
6365
static bool PIOS_oplinkrcvr_validate(struct pios_oplinkrcvr_dev *oplinkrcvr_dev)
6466
{
6567
return oplinkrcvr_dev->magic == PIOS_OPLINKRCVR_DEV_MAGIC;
6668
}
6769

70+
#if defined(PIOS_INCLUDE_RFM22B)
6871
static void PIOS_oplinkrcvr_ppm_callback(uint32_t oplinkrcvr_id, const int16_t *channels)
6972
{
7073
/* Recover our device context */
@@ -78,10 +81,21 @@ static void PIOS_oplinkrcvr_ppm_callback(uint32_t oplinkrcvr_id, const int16_t *
7881
for (uint8_t i = 0; i < OPLINKRECEIVER_CHANNEL_NUMELEM; ++i) {
7982
oplinkrcvr_dev->oplinkreceiverdata.Channel[i] = (i < RFM22B_PPM_NUM_CHANNELS) ? channels[i] : PIOS_RCVR_TIMEOUT;
8083
}
81-
OPLinkReceiverSet(&oplinkrcvr_dev->oplinkreceiverdata);
84+
85+
// Update the RSSI and quality fields.
86+
int8_t rssi;
87+
OPLinkReceiverRSSIGet(&rssi);
88+
oplinkrcvr_dev->oplinkreceiverdata.RSSI = rssi;
89+
uint8_t quality;
90+
OPLinkReceiverLinkQualityGet(&quality);
91+
// Link quality is 0-128, so scale it down to 0-100
92+
oplinkrcvr_dev->oplinkreceiverdata.LinkQuality = quality * 100 / 128;
93+
94+
//OPLinkReceiverSet(&oplinkrcvr_dev->oplinkreceiverdata);
8295

8396
oplinkrcvr_dev->Fresh = true;
8497
}
98+
#endif /* PIOS_INCLUDE_RFM22B */
8599

86100
#if defined(PIOS_INCLUDE_FREERTOS)
87101
static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
@@ -96,6 +110,9 @@ static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
96110
oplinkrcvr_dev->magic = PIOS_OPLINKRCVR_DEV_MAGIC;
97111
oplinkrcvr_dev->Fresh = false;
98112
oplinkrcvr_dev->supv_timer = 0;
113+
114+
/* The update callback cannot receive the device pointer, so set it in a global */
115+
global_oplinkrcvr_dev = oplinkrcvr_dev;
99116

100117
return oplinkrcvr_dev;
101118
}
@@ -119,7 +136,21 @@ static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
119136
}
120137
#endif /* if defined(PIOS_INCLUDE_FREERTOS) */
121138

139+
static void oplinkreceiver_updated(UAVObjEvent *ev)
140+
{
141+
struct pios_oplinkrcvr_dev *oplinkrcvr_dev = global_oplinkrcvr_dev;
142+
143+
if (ev->obj == OPLinkReceiverHandle()) {
144+
OPLinkReceiverGet(&oplinkrcvr_dev->oplinkreceiverdata);
145+
oplinkrcvr_dev->Fresh = true;
146+
}
147+
}
148+
149+
#if defined(PIOS_INCLUDE_RFM22B)
122150
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id, uint32_t rfm22b_id)
151+
#else
152+
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id)
153+
#endif
123154
{
124155
struct pios_oplinkrcvr_dev *oplinkrcvr_dev;
125156

@@ -134,8 +165,13 @@ extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id, uint32_t rfm22b_id)
134165
oplinkrcvr_dev->oplinkreceiverdata.Channel[i] = PIOS_RCVR_TIMEOUT;
135166
}
136167

168+
#if defined(PIOS_INCLUDE_RFM22B)
137169
/* Register ppm callback */
138170
PIOS_RFM22B_SetPPMCallback(rfm22b_id, PIOS_oplinkrcvr_ppm_callback, (uint32_t)oplinkrcvr_dev);
171+
#endif
172+
173+
/* Updates could come over the telemetry channel, so register uavobj callback */
174+
OPLinkReceiverConnectCallback(oplinkreceiver_updated);
139175

140176
/* Register the failsafe timer callback. */
141177
if (!PIOS_RTC_RegisterTickCallback(PIOS_oplinkrcvr_Supervisor, (uint32_t)oplinkrcvr_dev)) {
@@ -199,14 +235,17 @@ static void PIOS_oplinkrcvr_Supervisor(uint32_t oplinkrcvr_id)
199235
oplinkrcvr_dev->Fresh = false;
200236
}
201237

202-
static uint8_t PIOS_OPLinkRCVR_Quality_Get(__attribute__((unused)) uint32_t oplinkrcvr_id)
238+
static uint8_t PIOS_OPLinkRCVR_Quality_Get(uint32_t oplinkrcvr_id)
203239
{
204-
uint16_t oplink_quality;
240+
/* Recover our device context */
241+
struct pios_oplinkrcvr_dev *oplinkrcvr_dev = (struct pios_oplinkrcvr_dev *)oplinkrcvr_id;
205242

206-
OPLinkStatusLinkQualityGet(&oplink_quality);
243+
if (!PIOS_oplinkrcvr_validate(oplinkrcvr_dev)) {
244+
/* Invalid device specified */
245+
return 0;
246+
}
207247

208-
/* link_status is in the range 0-128, so scale to a % */
209-
return oplink_quality * 100 / 128;
248+
return oplinkrcvr_dev->oplinkreceiverdata.LinkQuality;
210249
}
211250

212251
#endif /* PIOS_INCLUDE_OPLINKRCVR */

flight/pios/common/pios_rfm22b.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1798,6 +1798,7 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
17981798
}
17991799

18001800
// Should we append PPM data to the packet?
1801+
bool ppm_valid = false;
18011802
if (radio_dev->ppm_send_mode) {
18021803
len = RFM22B_PPM_NUM_CHANNELS + (radio_dev->ppm_only_mode ? 2 : 1);
18031804

@@ -1817,10 +1818,13 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
18171818
if ((val == PIOS_RCVR_INVALID) || (val == PIOS_RCVR_TIMEOUT)) {
18181819
val = RFM22B_PPM_INVALID;
18191820
} else if (val > RFM22B_PPM_MAX_US) {
1821+
ppm_valid = true;
18201822
val = RFM22B_PPM_MAX;
18211823
} else if (val < RFM22B_PPM_MIN_US) {
1824+
ppm_valid = true;
18221825
val = RFM22B_PPM_MIN;
18231826
} else {
1827+
ppm_valid = true;
18241828
val = (val - RFM22B_PPM_MIN_US) / RFM22B_PPM_SCALE + RFM22B_PPM_MIN;
18251829
}
18261830

@@ -1844,6 +1848,7 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
18441848
}
18451849

18461850
// Append data from the com interface if applicable.
1851+
bool packet_data = false;
18471852
if (!radio_dev->ppm_only_mode) {
18481853
uint8_t newlen = 0;
18491854
bool need_yield = false;
@@ -1863,6 +1868,7 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
18631868
i++;
18641869
}
18651870
if (newlen) {
1871+
packet_data = true;
18661872
*(p + len) = radio_dev->last_stream_sent;
18671873
len += newlen + 1;
18681874
}
@@ -1885,7 +1891,7 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
18851891
}
18861892

18871893
// Only count the packet if it contains valid data.
1888-
if (radio_dev->ppm_only_mode || (len > RS_ECC_NPARITY)) {
1894+
if (ppm_valid || packet_data) {
18891895
TX_LED_ON;
18901896
radio_dev->stats.tx_byte_count += len;
18911897
}

flight/pios/inc/pios_board_io.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,4 +268,8 @@ void PIOS_BOARD_IO_Configure_RadioAuxStream(HwSettingsRadioAuxStreamOptions radi
268268
void PIOS_BOARD_IO_Configure_GCS_RCVR();
269269
#endif
270270

271+
#ifdef PIOS_INCLUDE_OPLINKRCVR
272+
void PIOS_BOARD_IO_Configure_OPLink_RCVR();
273+
#endif
274+
271275
#endif /* PIOS_BOARD_IO_H */

flight/pios/inc/pios_oplinkrcvr_priv.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@
3535

3636
extern const struct pios_rcvr_driver pios_oplinkrcvr_rcvr_driver;
3737

38+
#if defined(PIOS_INCLUDE_RFM22B)
3839
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id, uint32_t rfm22b_id);
40+
#else
41+
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id);
42+
#endif
3943

4044
#endif /* PIOS_OPLINKRCVR_PRIV_H */
4145

flight/targets/boards/ccf3d/firmware/inc/pios_config.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@
105105
#define PIOS_INCLUDE_SRXL
106106
#define PIOS_INCLUDE_HOTT
107107
#define PIOS_INCLUDE_IBUS
108-
/* #define PIOS_INCLUDE_GCSRCVR */
109-
/* #define PIOS_INCLUDE_OPLINKRCVR */
108+
#define PIOS_INCLUDE_GCSRCVR
109+
#define PIOS_INCLUDE_OPLINKRCVR
110110

111111
/* PIOS abstract receiver interface */
112112
#define PIOS_INCLUDE_RCVR

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,13 @@ void PIOS_Board_Init(void)
251251
break;
252252
}
253253

254+
#ifdef PIOS_INCLUDE_GCSRCVR
255+
PIOS_BOARD_IO_Configure_GCS_RCVR();
256+
#endif
254257

255-
#if defined(PIOS_INCLUDE_GCSRCVR)
256-
PIOS_BOARD_IO_Configure_GCSRCVR();
257-
#endif /* PIOS_INCLUDE_GCSRCVR */
258+
#ifdef PIOS_INCLUDE_OPLINKRCVR
259+
PIOS_BOARD_IO_Configure_OPLink_RCVR();
260+
#endif
258261

259262
#ifndef PIOS_ENABLE_DEBUG_PINS
260263
switch ((HwSettingsCC_RcvrPortOptions)hwsettings_rcvrport) {

0 commit comments

Comments
 (0)