Skip to content

Commit d4c681d

Browse files
webbbnfilnet
authored andcommitted
Merged in webbbn/librepilot/LP-548-output-oplinkreceiver-objects-fro (pull request #461)
LP-548 output oplinkreceiver objects from OPLink Approved-by: Philippe Renon <philippe_renon@yahoo.fr> Approved-by: Vladimir Zidar <mr_w@mindnever.org> Approved-by: Lalanne Laurent <f5soh@free.fr> Approved-by: Brian Webb <webbbn@gmail.com>
2 parents ffb4392 + b18ff22 commit d4c681d

38 files changed

Lines changed: 230 additions & 67 deletions

File tree

flight/modules/RadioComBridge/RadioComBridge.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,8 @@ 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):
558556
UAVTalkReceiveObject(inConnectionHandle);
559557
break;
560558
case OBJECTPERSISTENCE_OBJID:
@@ -613,10 +611,9 @@ static void ProcessRadioStream(UAVTalkConnection inConnectionHandle, UAVTalkConn
613611
case OPLINKRECEIVER_OBJID:
614612
case MetaObjectId(OPLINKRECEIVER_OBJID):
615613
// Receive object locally
616-
// These objects are received by the modem and are not transmitted to the telemetry port
617-
// - OPLINKRECEIVER_OBJID : not sure why
618-
// some objects will send back a response to the remote modem
619614
UAVTalkReceiveObject(inConnectionHandle);
615+
// Also send the packet to the telemetry point.
616+
UAVTalkRelayPacket(inConnectionHandle, outConnectionHandle);
620617
break;
621618
default:
622619
// 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: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include <oplinkstatus.h>
3838
#include <pios_oplinkrcvr_priv.h>
3939

40+
// Put receiver in failsafe if not updated within timeout
41+
#define PIOS_OPLINK_RCVR_TIMEOUT_MS 100
4042

4143
/* Provide a RCVR driver */
4244
static int32_t PIOS_OPLinkRCVR_Get(uint32_t rcvr_id, uint8_t channel);
@@ -60,11 +62,14 @@ struct pios_oplinkrcvr_dev {
6062
bool Fresh;
6163
};
6264

65+
static struct pios_oplinkrcvr_dev *global_oplinkrcvr_dev;
66+
6367
static bool PIOS_oplinkrcvr_validate(struct pios_oplinkrcvr_dev *oplinkrcvr_dev)
6468
{
6569
return oplinkrcvr_dev->magic == PIOS_OPLINKRCVR_DEV_MAGIC;
6670
}
6771

72+
#if defined(PIOS_INCLUDE_RFM22B)
6873
static void PIOS_oplinkrcvr_ppm_callback(uint32_t oplinkrcvr_id, const int16_t *channels)
6974
{
7075
/* Recover our device context */
@@ -78,10 +83,21 @@ static void PIOS_oplinkrcvr_ppm_callback(uint32_t oplinkrcvr_id, const int16_t *
7883
for (uint8_t i = 0; i < OPLINKRECEIVER_CHANNEL_NUMELEM; ++i) {
7984
oplinkrcvr_dev->oplinkreceiverdata.Channel[i] = (i < RFM22B_PPM_NUM_CHANNELS) ? channels[i] : PIOS_RCVR_TIMEOUT;
8085
}
86+
87+
// Update the RSSI and quality fields.
88+
int8_t rssi;
89+
OPLinkStatusRSSIGet(&rssi);
90+
oplinkrcvr_dev->oplinkreceiverdata.RSSI = rssi;
91+
uint16_t quality;
92+
OPLinkStatusLinkQualityGet(&quality);
93+
// Link quality is 0-128, so scale it down to 0-100
94+
oplinkrcvr_dev->oplinkreceiverdata.LinkQuality = quality * 100 / 128;
95+
8196
OPLinkReceiverSet(&oplinkrcvr_dev->oplinkreceiverdata);
8297

8398
oplinkrcvr_dev->Fresh = true;
8499
}
100+
#endif /* PIOS_INCLUDE_RFM22B */
85101

86102
#if defined(PIOS_INCLUDE_FREERTOS)
87103
static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
@@ -97,6 +113,9 @@ static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
97113
oplinkrcvr_dev->Fresh = false;
98114
oplinkrcvr_dev->supv_timer = 0;
99115

116+
/* The update callback cannot receive the device pointer, so set it in a global */
117+
global_oplinkrcvr_dev = oplinkrcvr_dev;
118+
100119
return oplinkrcvr_dev;
101120
}
102121
#else
@@ -119,7 +138,21 @@ static struct pios_oplinkrcvr_dev *PIOS_oplinkrcvr_alloc(void)
119138
}
120139
#endif /* if defined(PIOS_INCLUDE_FREERTOS) */
121140

141+
static void oplinkreceiver_updated(UAVObjEvent *ev)
142+
{
143+
struct pios_oplinkrcvr_dev *oplinkrcvr_dev = global_oplinkrcvr_dev;
144+
145+
if (ev->obj == OPLinkReceiverHandle()) {
146+
OPLinkReceiverGet(&oplinkrcvr_dev->oplinkreceiverdata);
147+
oplinkrcvr_dev->Fresh = true;
148+
}
149+
}
150+
151+
#if defined(PIOS_INCLUDE_RFM22B)
122152
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id, uint32_t rfm22b_id)
153+
#else
154+
extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id)
155+
#endif
123156
{
124157
struct pios_oplinkrcvr_dev *oplinkrcvr_dev;
125158

@@ -134,8 +167,13 @@ extern int32_t PIOS_OPLinkRCVR_Init(uint32_t *oplinkrcvr_id, uint32_t rfm22b_id)
134167
oplinkrcvr_dev->oplinkreceiverdata.Channel[i] = PIOS_RCVR_TIMEOUT;
135168
}
136169

170+
#if defined(PIOS_INCLUDE_RFM22B)
137171
/* Register ppm callback */
138172
PIOS_RFM22B_SetPPMCallback(rfm22b_id, PIOS_oplinkrcvr_ppm_callback, (uint32_t)oplinkrcvr_dev);
173+
#endif
174+
175+
/* Updates could come over the telemetry channel, so register uavobj callback */
176+
OPLinkReceiverConnectCallback(oplinkreceiver_updated);
139177

140178
/* Register the failsafe timer callback. */
141179
if (!PIOS_RTC_RegisterTickCallback(PIOS_oplinkrcvr_Supervisor, (uint32_t)oplinkrcvr_dev)) {
@@ -199,14 +237,17 @@ static void PIOS_oplinkrcvr_Supervisor(uint32_t oplinkrcvr_id)
199237
oplinkrcvr_dev->Fresh = false;
200238
}
201239

202-
static uint8_t PIOS_OPLinkRCVR_Quality_Get(__attribute__((unused)) uint32_t oplinkrcvr_id)
240+
static uint8_t PIOS_OPLinkRCVR_Quality_Get(uint32_t oplinkrcvr_id)
203241
{
204-
uint16_t oplink_quality;
242+
/* Recover our device context */
243+
struct pios_oplinkrcvr_dev *oplinkrcvr_dev = (struct pios_oplinkrcvr_dev *)oplinkrcvr_id;
205244

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

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

212253
#endif /* PIOS_INCLUDE_OPLINKRCVR */

flight/pios/common/pios_rfm22b.c

Lines changed: 8 additions & 2 deletions
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,7 +1868,8 @@ static enum pios_radio_event radio_txStart(struct pios_rfm22b_dev *radio_dev)
18631868
i++;
18641869
}
18651870
if (newlen) {
1866-
*(p + len) = radio_dev->last_stream_sent;
1871+
packet_data = true;
1872+
*(p + len) = radio_dev->last_stream_sent;
18671873
len += newlen + 1;
18681874
}
18691875
}
@@ -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)