Skip to content

Commit dbb5692

Browse files
committed
LP-585 Change the calc for channel generator and avoid rounding issues.
Take in account the frequency deviation and keep Tx inside defined band.
1 parent b8239e3 commit dbb5692

1 file changed

Lines changed: 26 additions & 7 deletions

File tree

flight/pios/common/pios_rfm22b.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,18 @@ static const uint8_t channel_spacing[] = {
349349
4, /* 256kps */
350350
};
351351

352+
static const uint8_t channel_limits[] = {
353+
1, /* 9.6kbps */
354+
1, /* 19.2kps */
355+
1, /* 32kps */
356+
1, /* 57.6kps */
357+
1, /* 64kps */
358+
1, /* 100kps */
359+
2, /* 128kps */
360+
2, /* 192kps */
361+
2, /* 256kps */
362+
};
363+
352364
static const uint8_t reg_1C[] = { 0x01, 0x05, 0x06, 0x95, 0x95, 0x81, 0x88, 0x8B, 0x8D }; // rfm22_if_filter_bandwidth
353365

354366
static const uint8_t reg_1D[] = { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 }; // rfm22_afc_loop_gearshift_override
@@ -2671,7 +2683,9 @@ static bool rfm22_gen_channels(uint32_t coordid, enum rfm22b_datarate rate, uint
26712683
{
26722684
uint32_t data = 0;
26732685
uint8_t cpos = 0;
2674-
uint8_t chan_range = (max / channel_spacing[rate] - min / channel_spacing[rate]) + 1;
2686+
uint8_t chan_min_limit = min + channel_limits[rate];
2687+
uint8_t chan_max_limit = max - channel_limits[rate];
2688+
uint8_t chan_count = ((chan_max_limit - chan_min_limit) / channel_spacing[rate]) + 1;
26752689
uint8_t key[SHA1_DIGEST_LENGTH] = { 0 };
26762690
uint8_t digest[SHA1_DIGEST_LENGTH];
26772691
uint8_t *all_channels;
@@ -2680,12 +2694,15 @@ static bool rfm22_gen_channels(uint32_t coordid, enum rfm22b_datarate rate, uint
26802694

26812695
memcpy(key, &coordid, sizeof(coordid));
26822696

2683-
for (int i = 0; i < chan_range; i++) {
2684-
all_channels[i] = min / channel_spacing[rate] + i;
2697+
for (int i = 0; i < chan_count; i++) {
2698+
all_channels[i] = chan_min_limit + (i * channel_spacing[rate]);
26852699
}
26862700

2701+
// DEBUG_PRINTF(3, "\r\nChannel Min: %d Max:%d - Spacing: %d Limits: %d\r\n", min, max, channel_spacing[rate], channel_limits[rate]);
2702+
// DEBUG_PRINTF(3, "Result: Channel count: %d - Usable channels from ch%d to ch%d\r\n", chan_count, all_channels[0], all_channels[chan_count - 1]);
2703+
26872704
int j = SHA1_DIGEST_LENGTH;
2688-
for (int i = 0; i < chan_range && i < MAX_CHANNELS; i++) {
2705+
for (int i = 0; i < chan_count && i < MAX_CHANNELS; i++) {
26892706
uint8_t rnd;
26902707
uint8_t r;
26912708
uint8_t tmp;
@@ -2697,14 +2714,16 @@ static bool rfm22_gen_channels(uint32_t coordid, enum rfm22b_datarate rate, uint
26972714
}
26982715
rnd = digest[j];
26992716
j++;
2700-
r = rnd % (chan_range - i) + i;
2717+
r = rnd % (chan_count - i) + i;
27012718
tmp = all_channels[i];
27022719
all_channels[i] = all_channels[r];
27032720
all_channels[r] = tmp;
27042721
}
27052722

2706-
for (int i = 0; i < chan_range && cpos < MAX_CHANNELS; i++, cpos++) {
2707-
channels[cpos] = all_channels[i] * channel_spacing[rate];
2723+
// DEBUG_PRINTF(3, "Final channel list:");
2724+
for (int i = 0; i < chan_count && cpos < MAX_CHANNELS; i++, cpos++) {
2725+
channels[cpos] = all_channels[i];
2726+
// DEBUG_PRINTF(3, " %d ", all_channels[i]);
27082727
}
27092728

27102729
*clen = cpos & 0xfe;

0 commit comments

Comments
 (0)