@@ -60,11 +60,14 @@ struct pios_oplinkrcvr_dev {
6060 bool Fresh ;
6161};
6262
63+ static struct pios_oplinkrcvr_dev * global_oplinkrcvr_dev ;
64+
6365static 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 )
6871static 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 )
87101static 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 )
122150extern 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 */
0 commit comments