2828#include "platform_detect.h"
2929#include "radio.h"
3030#include "fixed_point.h"
31- #include "hackrf_ui.h"
3231
3332#define MIN (x , y ) ((x) < (y) ? (x) : (y))
3433#define MAX (x , y ) ((x) > (y) ? (x) : (y))
@@ -225,11 +224,6 @@ static bool radio_update_sample_rate(radio_t* const radio, uint64_t* bank)
225224 new_rate = (rate != radio -> config [RADIO_BANK_APPLIED ][RADIO_SAMPLE_RATE ]);
226225 if (new_rate ) {
227226 radio -> config [RADIO_BANK_APPLIED ][RADIO_SAMPLE_RATE ] = rate ;
228- if (rate != RADIO_UNSET ) {
229- /* Round to the nearest Hz for display. */
230- const uint32_t rate_hz = (rate + (FP_ONE_HZ >> 1 )) / FP_ONE_HZ ;
231- hackrf_ui ()-> set_sample_rate (rate_hz );
232- }
233227 }
234228
235229 return (new_afe_rate || new_rate || new_n );
@@ -637,6 +631,7 @@ bool radio_update(radio_t* const radio)
637631 uint64_t tmp_bank [RADIO_NUM_REGS ];
638632 nvic_disable_irq (NVIC_USB0_IRQ );
639633 uint32_t dirty = radio -> regs_dirty ;
634+ uint32_t changed = 0 ;
640635 if (dirty == 0 ) {
641636 nvic_enable_irq (NVIC_USB0_IRQ );
642637 return false;
@@ -645,56 +640,57 @@ bool radio_update(radio_t* const radio)
645640 memcpy (& tmp_bank [0 ], & (radio -> config [RADIO_BANK_ACTIVE ][0 ]), sizeof (tmp_bank ));
646641 nvic_enable_irq (NVIC_USB0_IRQ );
647642
648- bool dir = false;
649- bool rate = false;
650- bool freq = false;
651- bool bw = false;
652- bool gain = false;
653- bool bias = false;
654- bool trig = false;
655- bool dc = false;
656-
657- if ((dirty &
658- ((1 << RADIO_SAMPLE_RATE ) | (1 << RADIO_RESAMPLE_TX ) |
659- (1 << RADIO_RESAMPLE_RX ))) ||
643+ if ((dirty & RADIO_REG_GROUP_RATE ) ||
660644 ((detected_platform () == BOARD_ID_PRALINE ) &&
661645 (dirty & (1 << RADIO_OPMODE )))) {
662- rate = radio_update_sample_rate (radio , & tmp_bank [0 ]);
646+ if (radio_update_sample_rate (radio , & tmp_bank [0 ])) {
647+ changed |= RADIO_REG_GROUP_RATE ;
648+ }
663649 }
664- if ((dirty &
665- ((1 << RADIO_FREQUENCY_RF ) | (1 << RADIO_FREQUENCY_IF ) |
666- (1 << RADIO_FREQUENCY_LO ) | (1 << RADIO_IMAGE_REJECT ) |
667- (1 << RADIO_ROTATION ))) ||
650+ if ((dirty & RADIO_REG_GROUP_FREQ ) ||
668651 ((detected_platform () == BOARD_ID_PRALINE ) &&
669- (rate || (dirty & (1 << RADIO_OPMODE ))))) {
670- freq = radio_update_frequency (radio , & tmp_bank [0 ]);
652+ ((changed & RADIO_REG_GROUP_RATE ) || (dirty & (1 << RADIO_OPMODE ))))) {
653+ if (radio_update_frequency (radio , & tmp_bank [0 ])) {
654+ changed |= RADIO_REG_GROUP_FREQ ;
655+ }
671656 }
672- if ((dirty &
673- (( 1 << RADIO_BB_BANDWIDTH_TX ) | ( 1 << RADIO_BB_BANDWIDTH_RX ) |
674- ( 1 << RADIO_XCVR_TX_LPF ) | ( 1 << RADIO_XCVR_RX_LPF ) |
675- ( 1 << RADIO_XCVR_RX_HPF ) | ( 1 << RADIO_RX_NARROW_LPF ))) ||
676- (( detected_platform () == BOARD_ID_PRALINE ) && ( rate || freq ))) {
677- bw = radio_update_bandwidth ( radio , & tmp_bank [ 0 ]);
657+ if ((dirty & RADIO_REG_GROUP_BW ) ||
658+ (( detected_platform () == BOARD_ID_PRALINE ) &&
659+ ( changed & ( RADIO_REG_GROUP_RATE | RADIO_REG_GROUP_FREQ )))) {
660+ if ( radio_update_bandwidth ( radio , & tmp_bank [ 0 ])) {
661+ changed |= RADIO_REG_GROUP_BW ;
662+ }
678663 }
679- if (dirty &
680- (( 1 << RADIO_GAIN_TX_RF ) | ( 1 << RADIO_GAIN_TX_IF ) | ( 1 << RADIO_GAIN_RX_RF ) |
681- ( 1 << RADIO_GAIN_RX_IF ) | ( 1 << RADIO_GAIN_RX_BB ) | ( 1 << RADIO_OPMODE ))) {
682- gain = radio_update_gain ( radio , & tmp_bank [ 0 ]);
664+ if (dirty & RADIO_REG_GROUP_GAIN ) {
665+ if ( radio_update_gain ( radio , & tmp_bank [ 0 ])) {
666+ changed |= RADIO_REG_GROUP_GAIN ;
667+ }
683668 }
684669 if (dirty & ((1 << RADIO_BIAS_TEE ) | (1 << RADIO_OPMODE ))) {
685- bias = radio_update_bias_tee (radio , & tmp_bank [0 ]);
670+ if (radio_update_bias_tee (radio , & tmp_bank [0 ])) {
671+ changed |= RADIO_BIAS_TEE ;
672+ }
686673 }
687674 if (dirty & (1 << RADIO_TRIGGER )) {
688- trig = radio_update_trigger (radio , & tmp_bank [0 ]);
675+ if (radio_update_trigger (radio , & tmp_bank [0 ])) {
676+ changed |= RADIO_TRIGGER ;
677+ }
689678 }
690679 if (dirty & (1 << RADIO_DC_BLOCK )) {
691- dc = radio_update_dc_block (radio , & tmp_bank [0 ]);
680+ if (radio_update_dc_block (radio , & tmp_bank [0 ])) {
681+ changed |= RADIO_DC_BLOCK ;
682+ }
692683 }
693684 if (dirty & (1 << RADIO_OPMODE )) {
694- dir = radio_update_direction (radio , & tmp_bank [0 ]);
685+ if (radio_update_direction (radio , & tmp_bank [0 ])) {
686+ changed |= RADIO_OPMODE ;
687+ }
695688 }
696689
697- return trig || dir || rate || freq || bw || gain || bias || dc ;
690+ if (radio -> update_cb ) {
691+ radio -> update_cb (changed );
692+ }
693+ return (changed != 0 );
698694}
699695
700696void radio_switch_opmode (radio_t * const radio , const transceiver_mode_t mode )
0 commit comments