Skip to content

Commit 444c842

Browse files
committed
AP_GPS: use references for state variable
1 parent ef37c2f commit 444c842

File tree

1 file changed

+46
-38
lines changed

1 file changed

+46
-38
lines changed

libraries/AP_GPS/AP_GPS_Blended.cpp

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,17 @@ bool AP_GPS_Blended::_calc_weights(void)
3535
uint32_t max_rate_ms = 0; // largest update interval of a GPS receiver
3636
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
3737
// Find largest and smallest times
38-
if (gps.state[i].last_gps_time_ms > max_ms) {
39-
max_ms = gps.state[i].last_gps_time_ms;
38+
const auto &state_i = gps.state[i];
39+
if (state_i.last_gps_time_ms > max_ms) {
40+
max_ms = state_i.last_gps_time_ms;
4041
}
41-
if ((gps.state[i].last_gps_time_ms < min_ms) && (gps.state[i].last_gps_time_ms > 0)) {
42-
min_ms = gps.state[i].last_gps_time_ms;
42+
if ((state_i.last_gps_time_ms < min_ms) && (state_i.last_gps_time_ms > 0)) {
43+
min_ms = state_i.last_gps_time_ms;
4344
}
4445
max_rate_ms = MAX(gps.get_rate_ms(i), max_rate_ms);
45-
if (isinf(gps.state[i].speed_accuracy) ||
46-
isinf(gps.state[i].horizontal_accuracy) ||
47-
isinf(gps.state[i].vertical_accuracy)) {
46+
if (isinf(state_i.speed_accuracy) ||
47+
isinf(state_i.horizontal_accuracy) ||
48+
isinf(state_i.vertical_accuracy)) {
4849
return false;
4950
}
5051
}
@@ -60,9 +61,10 @@ bool AP_GPS_Blended::_calc_weights(void)
6061
float speed_accuracy_sum_sq = 0.0f;
6162
if (gps._blend_mask & BLEND_MASK_USE_SPD_ACC) {
6263
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
63-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_3D) {
64-
if (gps.state[i].have_speed_accuracy && gps.state[i].speed_accuracy > 0.0f) {
65-
speed_accuracy_sum_sq += sq(gps.state[i].speed_accuracy);
64+
const auto &state_i = gps.state[i];
65+
if (state_i.status >= AP_GPS::GPS_OK_FIX_3D) {
66+
if (state_i.have_speed_accuracy && state_i.speed_accuracy > 0.0f) {
67+
speed_accuracy_sum_sq += sq(state_i.speed_accuracy);
6668
} else {
6769
// not all receivers support this metric so set it to zero and don't use it
6870
speed_accuracy_sum_sq = 0.0f;
@@ -76,9 +78,10 @@ bool AP_GPS_Blended::_calc_weights(void)
7678
float horizontal_accuracy_sum_sq = 0.0f;
7779
if (gps._blend_mask & BLEND_MASK_USE_HPOS_ACC) {
7880
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
79-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_2D) {
80-
if (gps.state[i].have_horizontal_accuracy && gps.state[i].horizontal_accuracy > 0.0f) {
81-
horizontal_accuracy_sum_sq += sq(gps.state[i].horizontal_accuracy);
81+
const auto &state_i = gps.state[i];
82+
if (state_i.status >= AP_GPS::GPS_OK_FIX_2D) {
83+
if (state_i.have_horizontal_accuracy && state_i.horizontal_accuracy > 0.0f) {
84+
horizontal_accuracy_sum_sq += sq(state_i.horizontal_accuracy);
8285
} else {
8386
// not all receivers support this metric so set it to zero and don't use it
8487
horizontal_accuracy_sum_sq = 0.0f;
@@ -92,9 +95,10 @@ bool AP_GPS_Blended::_calc_weights(void)
9295
float vertical_accuracy_sum_sq = 0.0f;
9396
if (gps._blend_mask & BLEND_MASK_USE_VPOS_ACC) {
9497
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
95-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_3D) {
96-
if (gps.state[i].have_vertical_accuracy && gps.state[i].vertical_accuracy > 0.0f) {
97-
vertical_accuracy_sum_sq += sq(gps.state[i].vertical_accuracy);
98+
const auto &state_i = gps.state[i];
99+
if (state_i.status >= AP_GPS::GPS_OK_FIX_3D) {
100+
if (state_i.have_vertical_accuracy && state_i.vertical_accuracy > 0.0f) {
101+
vertical_accuracy_sum_sq += sq(state_i.vertical_accuracy);
98102
} else {
99103
// not all receivers support this metric so set it to zero and don't use it
100104
vertical_accuracy_sum_sq = 0.0f;
@@ -119,8 +123,9 @@ bool AP_GPS_Blended::_calc_weights(void)
119123
// calculate the weights using the inverse of the variances
120124
float sum_of_hpos_weights = 0.0f;
121125
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
122-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_2D && gps.state[i].horizontal_accuracy >= 0.001f) {
123-
hpos_blend_weights[i] = horizontal_accuracy_sum_sq / sq(gps.state[i].horizontal_accuracy);
126+
const auto &state_i = gps.state[i];
127+
if (state_i.status >= AP_GPS::GPS_OK_FIX_2D && state_i.horizontal_accuracy >= 0.001f) {
128+
hpos_blend_weights[i] = horizontal_accuracy_sum_sq / sq(state_i.horizontal_accuracy);
124129
sum_of_hpos_weights += hpos_blend_weights[i];
125130
}
126131
}
@@ -139,8 +144,9 @@ bool AP_GPS_Blended::_calc_weights(void)
139144
// calculate the weights using the inverse of the variances
140145
float sum_of_vpos_weights = 0.0f;
141146
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
142-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_3D && gps.state[i].vertical_accuracy >= 0.001f) {
143-
vpos_blend_weights[i] = vertical_accuracy_sum_sq / sq(gps.state[i].vertical_accuracy);
147+
const auto &state_i = gps.state[i];
148+
if (state_i.status >= AP_GPS::GPS_OK_FIX_3D && state_i.vertical_accuracy >= 0.001f) {
149+
vpos_blend_weights[i] = vertical_accuracy_sum_sq / sq(state_i.vertical_accuracy);
144150
sum_of_vpos_weights += vpos_blend_weights[i];
145151
}
146152
}
@@ -159,8 +165,9 @@ bool AP_GPS_Blended::_calc_weights(void)
159165
// calculate the weights using the inverse of the variances
160166
float sum_of_spd_weights = 0.0f;
161167
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
162-
if (gps.state[i].status >= AP_GPS::GPS_OK_FIX_3D && gps.state[i].speed_accuracy >= 0.001f) {
163-
spd_blend_weights[i] = speed_accuracy_sum_sq / sq(gps.state[i].speed_accuracy);
168+
const auto &state_i = gps.state[i];
169+
if (state_i.status >= AP_GPS::GPS_OK_FIX_3D && state_i.speed_accuracy >= 0.001f) {
170+
spd_blend_weights[i] = speed_accuracy_sum_sq / sq(state_i.speed_accuracy);
164171
sum_of_spd_weights += spd_blend_weights[i];
165172
}
166173
}
@@ -243,45 +250,46 @@ void AP_GPS_Blended::calc_state(void)
243250

244251
// combine the states into a blended solution
245252
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++) {
253+
const auto &state_i = gps.state[i];
246254
// use the highest status
247-
if (gps.state[i].status > state.status) {
248-
state.status = gps.state[i].status;
255+
if (state_i.status > state.status) {
256+
state.status = state_i.status;
249257
}
250258

251259
// calculate a blended average velocity
252-
state.velocity += gps.state[i].velocity * _blend_weights[i];
260+
state.velocity += state_i.velocity * _blend_weights[i];
253261

254262
// report the best valid accuracies and DOP metrics
255263

256-
if (gps.state[i].have_horizontal_accuracy && gps.state[i].horizontal_accuracy > 0.0f && gps.state[i].horizontal_accuracy < state.horizontal_accuracy) {
264+
if (state_i.have_horizontal_accuracy && state_i.horizontal_accuracy > 0.0f && state_i.horizontal_accuracy < state.horizontal_accuracy) {
257265
state.have_horizontal_accuracy = true;
258-
state.horizontal_accuracy = gps.state[i].horizontal_accuracy;
266+
state.horizontal_accuracy = state_i.horizontal_accuracy;
259267
}
260268

261-
if (gps.state[i].have_vertical_accuracy && gps.state[i].vertical_accuracy > 0.0f && gps.state[i].vertical_accuracy < state.vertical_accuracy) {
269+
if (state_i.have_vertical_accuracy && state_i.vertical_accuracy > 0.0f && state_i.vertical_accuracy < state.vertical_accuracy) {
262270
state.have_vertical_accuracy = true;
263-
state.vertical_accuracy = gps.state[i].vertical_accuracy;
271+
state.vertical_accuracy = state_i.vertical_accuracy;
264272
}
265273

266-
if (gps.state[i].have_vertical_velocity) {
274+
if (state_i.have_vertical_velocity) {
267275
state.have_vertical_velocity = true;
268276
}
269277

270-
if (gps.state[i].have_speed_accuracy && gps.state[i].speed_accuracy > 0.0f && gps.state[i].speed_accuracy < state.speed_accuracy) {
278+
if (state_i.have_speed_accuracy && state_i.speed_accuracy > 0.0f && state_i.speed_accuracy < state.speed_accuracy) {
271279
state.have_speed_accuracy = true;
272-
state.speed_accuracy = gps.state[i].speed_accuracy;
280+
state.speed_accuracy = state_i.speed_accuracy;
273281
}
274282

275-
if (gps.state[i].hdop > 0 && gps.state[i].hdop < state.hdop) {
276-
state.hdop = gps.state[i].hdop;
283+
if (state_i.hdop > 0 && state_i.hdop < state.hdop) {
284+
state.hdop = state_i.hdop;
277285
}
278286

279-
if (gps.state[i].vdop > 0 && gps.state[i].vdop < state.vdop) {
280-
state.vdop = gps.state[i].vdop;
287+
if (state_i.vdop > 0 && state_i.vdop < state.vdop) {
288+
state.vdop = state_i.vdop;
281289
}
282290

283-
if (gps.state[i].num_sats > 0 && gps.state[i].num_sats > state.num_sats) {
284-
state.num_sats = gps.state[i].num_sats;
291+
if (state_i.num_sats > 0 && state_i.num_sats > state.num_sats) {
292+
state.num_sats = state_i.num_sats;
285293
}
286294

287295
// report a blended average GPS antenna position

0 commit comments

Comments
 (0)