diff --git a/spf/grbl_sdr_collect_v2.py b/spf/grbl_sdr_collect_v2.py index bb07e18f..eeb507dd 100644 --- a/spf/grbl_sdr_collect_v2.py +++ b/spf/grbl_sdr_collect_v2.py @@ -23,7 +23,7 @@ setup_rxtx_and_phase_calibration, shutdown_radios, ) -from spf.wall_array_v2 import get_column_names_v2 +from spf.wall_array_v2 import v2_column_names faulthandler.enable() @@ -47,7 +47,7 @@ def prepare_record_entry(ds: DataSnapshot, rx_pos: np.array, tx_pos: np.array): ds.timestamp, # 1 tx_pos, # 2 rx_pos, # 2 - ds.rx_theta_in_pis, # 1 + ds.rx_theta_in_pis * np.pi, # 1 ds.rx_spacing, # 1 ds.avg_phase_diff, # 2 ds.beam_sds, # 65 @@ -194,7 +194,7 @@ def bounce_grbl(gm): yaml_config = yaml.safe_load(stream) # record matrix - column_names = get_column_names_v2(nthetas=yaml_config["n-thetas"]) + column_names = v2_column_names(nthetas=yaml_config["n-thetas"]) record_matrix = np.memmap( yaml_config["output-file"].replace("__DATE__", start_logging_at), dtype="float32", @@ -252,7 +252,7 @@ def bounce_grbl(gm): # leave_tx_on=False, # using_tx_already_on=None, ) - logging.info("RX online!") + logging.debug("RX online!") receiver_pplus.append(pplus_rx) # setup the emitter diff --git a/spf/sdrpluto/sdr_controller.py b/spf/sdrpluto/sdr_controller.py index d94b2366..2e9bef94 100644 --- a/spf/sdrpluto/sdr_controller.py +++ b/spf/sdrpluto/sdr_controller.py @@ -51,7 +51,7 @@ def get_pplus(rx_config=None, tx_config=None, uri=None): pplus_online[uri] = PPlus(rx_config=rx_config, tx_config=tx_config, uri=uri) else: pplus_online[uri].set_config(rx_config=rx_config, tx_config=tx_config) - logging.info(f"{uri}: get_pplus PlutoPlus") + logging.debug(f"{uri}: get_pplus PlutoPlus") return pplus_online[uri] @@ -82,7 +82,7 @@ def __init__(self, rx_config=None, tx_config=None, uri=None): self.sdr.tx_enabled_channels = [] def set_config(self, rx_config=None, tx_config=None): - logging.info(f"{self.uri} RX{str(rx_config)} TX{str(tx_config)})") + logging.debug(f"{self.uri}: set_config RX{str(rx_config)} TX{str(tx_config)})") # RX should be setup like this if rx_config is not None: assert self.rx_config is None @@ -94,17 +94,17 @@ def set_config(self, rx_config=None, tx_config=None): self.tx_config = tx_config def close(self): - logging.info(f"{self.uri}: Start close PlutoPlus") + logging.debug(f"{self.uri}: Start close PlutoPlus") self.close_tx() - logging.info(f"{self.uri}: Done close PlutoPlus") + logging.debug(f"{self.uri}: Done close PlutoPlus") def __del__(self): - logging.info(f"{self.uri}: Start delete PlutoPlus") + logging.debug(f"{self.uri}: Start delete PlutoPlus") self.close_tx() self.sdr.tx_destroy_buffer() self.sdr.rx_destroy_buffer() self.sdr.tx_enabled_channels = [] - logging.info(f"{self.uri}: Done delete PlutoPlus") + logging.debug(f"{self.uri}: Done delete PlutoPlus") """ Setup the Rx part of the pluto @@ -134,7 +134,7 @@ def setup_rx(self): """ def setup_tx(self): - logging.info(f"{self.tx_config.uri}: Setup TX") + logging.debug(f"{self.tx_config.uri}: Setup TX") self.sdr.tx_destroy_buffer() self.sdr.tx_cyclic_buffer = self.tx_config.cyclic # this keeps repeating! @@ -308,13 +308,13 @@ def setup_rxtx(rx_config, tx_config, leave_tx_on=False): logging.info(f"setup_rxtx({rx_config.uri}, {tx_config.uri}) retry {retries}") # sdr_rx = adi.ad9361(uri=receiver_uri) if rx_config.uri == tx_config.uri: - logging.info(f"{rx_config.uri} RX TX are same") + logging.debug(f"{rx_config.uri} RX TX are same") pplus_rx = get_pplus(rx_config=rx_config, tx_config=tx_config) pplus_tx = pplus_rx else: - logging.info(f"{rx_config.uri}(RX) TX are different") + logging.debug(f"{rx_config.uri}(RX) TX are different") pplus_rx = get_pplus(rx_config=rx_config) - logging.info(f"{tx_config.uri} RX (TX) are different") + logging.debug(f"{tx_config.uri} RX (TX) are different") pplus_tx = get_pplus(tx_config=tx_config) pplus_rx.setup_rx() @@ -364,12 +364,12 @@ def setup_rxtx_and_phase_calibration( # its important to not use the emitter uri when calibrating! if using_tx_already_on is not None: - logging.info(f"{rx_config.uri}: TX already on!") + logging.debug(f"{rx_config.uri}: TX already on!") pplus_rx = get_pplus(rx_config=rx_config) pplus_rx.setup_rx() pplus_tx = using_tx_already_on else: - logging.info(f"{rx_config.uri}: TX not on!") + logging.debug(f"{rx_config.uri}: TX not on!") pplus_rx, pplus_tx = setup_rxtx( rx_config=rx_config, tx_config=tx_config, leave_tx_on=True ) @@ -387,7 +387,7 @@ def setup_rxtx_and_phase_calibration( ) retries = 0 while run_radios and retries < 20: - logging.info(f"{rx_config.uri} RETRY {retries}") + logging.debug(f"{rx_config.uri} RETRY {retries}") phase_calibrations = np.zeros(n_calibration_frames) phase_calibrations_cm = np.zeros(n_calibration_frames) for idx in range(n_calibration_frames): @@ -423,7 +423,7 @@ def setup_rxtx_and_phase_calibration( pplus_rx.phase_calibration = phase_calibrations.mean() return pplus_rx, pplus_tx pplus_tx.close() - logging.info(f"{rx_config.uri}: Phase calibration failed") + logging.error(f"{rx_config.uri}: Phase calibration failed") return None, None diff --git a/spf/wall_array_v2.py b/spf/wall_array_v2.py index e5378f05..d8bb4837 100644 --- a/spf/wall_array_v2.py +++ b/spf/wall_array_v2.py @@ -1,7 +1,9 @@ +from functools import cache + import numpy as np -def get_column_names_v2(nthetas=65): +def v2_column_names(nthetas=65): thetas = np.linspace(-np.pi, np.pi, nthetas) return [ "timestamp", @@ -9,8 +11,31 @@ def get_column_names_v2(nthetas=65): "tx_pos_y", "rx_pos_x", "rx_pos_y", - "rx_theta_in_pis", + "rx_theta", "rx_spacing", "avg_phase_diff_1", "avg_phase_diff_2", ] + ["beamformer_angle_%0.4f" % theta for theta in thetas] + + +@cache +def v2_rx_pos_idxs(): + return [ + v2_column_names().index("rx_pos_x"), + v2_column_names().index("rx_pos_y"), + ] + + +@cache +def v2_rx_theta_idxs(): + return [ + v2_column_names().index("rx_theta"), + ] + + +@cache +def v2_tx_pos_idxs(): + return [ + v2_column_names().index("tx_pos_x"), + v2_column_names().index("tx_pos_y"), + ] diff --git a/spf/wall_array_v2.yaml b/spf/wall_array_v2.yaml index 2137faf3..87684da5 100644 --- a/spf/wall_array_v2.yaml +++ b/spf/wall_array_v2.yaml @@ -51,7 +51,7 @@ receivers: motor_channel: 0 -output-file: wallarrayv2___DATE___.npy +output-file: wallarrayv2___DATE__.npy n-thetas: 65 n-records-per-receiver: 300000