def get_dac_tile_id_by_awg_id(self, awg_id): """ AWG に対応する DAC のタイル ID を取得する """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) return self.__awg_to_dac_tile[awg_id]
def is_digital_output_step_skipped(self, awg_id, step_id): """ 引数で指定したデジタル出力ステップがスキップされていたかどうかを調べる Parameters ---------- awg_id : AwgId 調べたいデジタル出力ステップを含むデジタル出力シーケンスをセットした AWG の ID step_id : int 調べたいデジタル出力ステップのID Returns ------- flag : int True -> スキップされた False -> スキップされていない (正常) """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("IsDoutStepSkipped", [int(awg_id), step_id]) res = self.__rft_ctrl_if.put(command) return False if int(res) == 0 else True
def is_capture_data_fifo_overflowed(self, awg_id, step_id): """ 引数で指定したキャプチャステップで, ADC から送られる波形データを 格納する FIFO のオーバーフローが発生したかどうかを調べる. Parameters ---------- awg_id : AwgId 調べたいキャプチャステップを含むキャプチャシーケンスをセットした AWG の ID step_id : int 調べたいキャプチャステップのID Returns ------- flag : int True -> オーバーフローした False -> オーバーフローしていない (正常) """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("IsCaptureDataFifoOverflowed", [int(awg_id), step_id]) res = self.__rft_ctrl_if.put(command) return False if int(res) == 0 else True
def set_wave_sequence(self, awg_id, wave_sequence, *, num_repeats=1): """ 波形シーケンスをAWGにセットする. Parameters ---------- awg_id : AwgId wave_sequence をセットする AWG の ID wave_sequence : WaveSequence 設定する波形シーケンス num_repeats : int 波形シーケンスを繰り返す回数 負の数を指定すると AWG を強制停止させるまでシーケンスを繰り返し続ける """ if (not isinstance(wave_sequence, WaveSequence)): raise ValueError("invalid wave_sequence " + str(wave_sequence)) if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(num_repeats, int)) or\ (num_repeats == 0 or 0xFFFFFFFE < num_repeats): raise ValueError("invalid num_repeats " + str(num_repeats)) infinite_repeat = 1 if num_repeats < 0 else 0 data = wave_sequence.serialize() command = self.__joinargs( "SetWaveSequence", [int(awg_id), num_repeats, infinite_repeat, len(data)]) self.__rft_data_if.PutCmdWithData(command, data)
def is_accumulated_value_overranged(self, awg_id, step_id): """ 引数で指定したキャプチャステップで積算値の範囲オーバーが発生したかどうかを調べる Parameters ---------- awg_id : AwgId 調べたいキャプチャステップを含むキャプチャシーケンスをセットした AWG の ID step_id : int 調べたいキャプチャステップのID Returns ------- flag : bool True -> 範囲オーバーした False -> 範囲オーバーしていない (正常) """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("IsAccumulatedValueOverranged", [int(awg_id), step_id]) res = self.__rft_ctrl_if.put(command) return False if int(res) == 0 else True
def get_capture_section_info(self, awg_id, step_id): """ キャプチャモジュールの ID とキャプチャステップから, 対応するキャプチャデータの格納先の RAM のアドレスとデータサイズ (Bytes) を取得する. set_capture_config でキャプチャシーケンスをキャプチャモジュールにセットしてから呼ぶこと. Parameters ---------- awg_id : AwgId 引数で指定したキャプチャデータを取得するキャプチャモジュールの ID step_id : int 引数で指定したキャプチャデータを取得するステップの ID Returns ------- (addr, data_size) : (int, int) 引数で指定したキャプチャデータの格納先である RAM のアドレスとデータサイズ """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("GetCaptureSectionInfo", [int(awg_id), step_id]) res = self.__rft_ctrl_if.put(command) [addr, data_size] = self.__split_response(res, ",") return (int(addr), int(data_size))
def is_awg_working(self, awg_id): """ AWG が動作中かどうかを調べる Parameters ---------- awg_id : AwgId 動作中かどうかを調べる AWG の ID Returns ------- status : bool True -> 動作中 False -> 非動作中 """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) command = self.__joinargs("IsAwgWorking", [int(awg_id)]) res = self.__rft_ctrl_if.put(command) res = int(res) if res == 0: return False elif res == 1: return True return AwgSaCmdResult.UNKNOWN
def is_wave_sequence_complete(self, awg_id): """ 波形シーケンスの出力が完了しているかどうかを取得する Parameters ---------- awg_id : AwgId 波形シーケンスの出力完了を調べる AWG の ID Returns ------- status : int WAVE_SEQUENCE_NOT_COMPLETE -> 出力未完了 WAVE_SEQUENCE_COMPLETE -> 出力完了 or 停止命令により停止した WAVE_SEQUENCE_ERROR -> 出力中にエラーが発生 """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) command = self.__joinargs("IsWaveSequenceComplete", [int(awg_id)]) res = self.__rft_ctrl_if.put(command) res = int(res) if res == 0: return AwgSaCmdResult.WAVE_SEQUENCE_NOT_COMPLETE elif res == 1: return AwgSaCmdResult.WAVE_SEQUENCE_COMPLETE elif res == 2: return AwgSaCmdResult.WAVE_SEQUENCE_ERROR return AwgSaCmdResult.UNKNOWN
def get_capture_data_size(self, awg_id, step_id): if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("GetCaptureDataSize ", [int(awg_id), step_id]) res = self.__rft_ctrl_if.put(command) return int(res) # byte
def enable_awg(self, *awg_id_list): """ 引数で指定した AWG を有効にする Parameters ---------- *awg_id_list : AwgId 有効にする AWG の ID """ enable_list = [0, 0, 0, 0, 0, 0, 0, 0] for awg_id in awg_id_list: if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) enable_list[int(awg_id)] = 1 command = self.__joinargs("EnableAwg", enable_list) self.__rft_ctrl_if.put(command)
def terminate_awgs(self, *awg_list): """ 引数で指定した AWG に停止命令を発行する. AWG が停止命令を受け取ったときに実行中のキャプチャは最後まで実行される. AWG の停止までブロックするわけではないので, 停止の確認は is_wave_sequence_complete メソッドの戻り値が AwgSaCmdResult.WAVE_SEQUENCE_COMPLETE かどうかで判断すること. Parameters ---------- *awg_list : AwgId 停止させる AWG の ID """ termination_flag_list = [0, 0, 0, 0, 0, 0, 0, 0] for awg_id in awg_list: if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg id " + str(awg_id)) termination_flag_list[int(awg_id)] = 1 command = self.__joinargs("TerminateAwgs", termination_flag_list) self.__rft_ctrl_if.put(command)
def get_trigger_mode(self, awg_id): """ 引数で指定した AWG のトリガモードを取得する. Parameters ---------- awg_id : AwgId トリガモードを取得する AWG の ID Returns ------- trigger_mode : TriggerMode 引数で指定した AWG のトリガモード """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) command = self.__joinargs("GetTriggerMode", [int(awg_id)]) res = self.__rft_ctrl_if.put(command) return TriggerMode.of(int(res))
def set_digital_output_sequence(self, awg_id, dout_sequence): """ デジタル出力シーケンスをハードウェアにセットする. Parameters ---------- awg_id : AwgId このシーケンスのデジタル出力の基準となる波形を生成する AWG の ID dout_sequence : DigitalOutputSequence 設定するデジタル出力シーケンス """ if (not isinstance(dout_sequence, DigitalOutputSequence)): raise ValueError("invalid dout_sequence " + str(dout_sequence)) if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) data = dout_sequence.serialize() command = self.__joinargs("SetDoutSequence", [int(awg_id), len(data)]) self.__rft_data_if.PutCmdWithData(command, data)
def set_trigger_mode(self, awg_id, trig_mode): """ 引数で指定した AWG のトリガモードを設定する. Parameters ---------- awg_id : AwgId トリガモードを設定する AWG の ID trig_mode : TriggerMode MANUAL -> AwgSaCommand.start_wave_sequence を呼ぶと AWG の処理が始まる EXTERNAL -> AwgSaCommand.external_trigger_on で起動した外部トリガモジュールがトリガを発行すると AWG の処理が始まる """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not TriggerMode.has_value(trig_mode)): raise ValueError("invalid trig_mode " + str(trig_mode)) command = self.__joinargs("SetTriggerMode", [int(awg_id), int(trig_mode)]) self.__rft_ctrl_if.put(command)
def get_waveform_sequence(self, awg_id): """ awg_id で指定した AWG が出力する波形のサンプル値を保持するオブジェクトを取得する. Returns ------- waveform_seq : FlattenedWaveformSequence, FlattenedIQWaveformSequence 波形のサンプル値を保持するオブジェクト. awg_id で指定した AWG に Real データの波形シーケンスを設定した場合は, FlattenedWaveformSequence が返る. I/Q データの波形シーケンスを設定した場合は, FlattenedIQWaveformSequence が返る. [補足] 戻り値のオブジェクトから参照できるサンプルデータは, WaveSequence.get_waveform_sequence(...) の場合と異なり, 実際に DAC に入力される値である. """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) wave_seq_params = self.__get_wave_seq_params(awg_id) command = self.__joinargs("GetWaveRAM", [int(awg_id)]) self.__rft_data_if.send_command(command) res = self.__rft_data_if.recv_response( ) # 波形 RAM データの前のコマンド成否レスポンス [SA_SUCCESS/SA_FAILURE, wave ram data size] [result, wave_ram_data_size] = self.__split_response(res, ",") if (result == "AWG_SUCCESS"): wave_ram_data = self.__rft_data_if.recv_data(wave_ram_data_size) self.__rft_data_if.recv_response() # end of wave ram data res = self.__rft_data_if.recv_response() # end of 'GetWaveRAM' command if res[:5] == "ERROR": raise rfterr.RftoolExecuteCommandError(res) self.__logger.debug(res) if wave_seq_params.is_iq_data: return FlattenedIQWaveformSequence.build_from_wave_ram( wave_seq_params, wave_ram_data) else: return FlattenedWaveformSequence.build_from_wave_ram( wave_seq_params, wave_ram_data)
def read_capture_data(self, awg_id, step_id): """ キャプチャデータを読み取る Parameters ---------- awg_id : AwgId 読み取るキャプチャステップを含むキャプチャシーケンスをセットしたキャプチャモジュールの ID step_id : int 読み取るキャプチャステップのID Returns ------- data : bytes キャプチャデータ """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) command = self.__joinargs("ReadCaptureData", [int(awg_id), step_id]) self.__rft_data_if.send_command(command) res = self.__rft_data_if.recv_response( ) # キャプチャデータの前のコマンド成否レスポンス [SA_SUCCESS/SA_FAILURE, data size] [result, data_size] = self.__split_response(res, ",") if (result == "AWG_SUCCESS"): data = self.__rft_data_if.recv_data(data_size) self.__rft_data_if.recv_response() # end of capture data res = self.__rft_data_if.recv_response( ) # end of 'ReadCaptureData' command if res[:5] == "ERROR": raise rfterr.RftoolExecuteCommandError(res) self.__logger.debug(res) return data
def __get_wave_seq_params(self, awg_id): """ awg_id で指定した AWG に設定されている波形シーケンスのパラメータをバイトデータとして取得する """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) command = self.__joinargs("GetWaveSequenceParams", [int(awg_id)]) self.__rft_data_if.send_command(command) res = self.__rft_data_if.recv_response( ) # パラメータの前のコマンド成否レスポンス [SA_SUCCESS/SA_FAILURE, wave sequence param size] [result, seq_param_size] = self.__split_response(res, ",") if (result == "AWG_SUCCESS"): seq_params_bytes = self.__rft_data_if.recv_data(seq_param_size) self.__rft_data_if.recv_response() # end of wave seq param data res = self.__rft_data_if.recv_response( ) # end of 'GetWaveSequenceParams' command if res[:5] == "ERROR": raise rfterr.RftoolExecuteCommandError(res) self.__logger.debug(res) return WaveSequenceParams.build_from_bytes(seq_params_bytes)
def get_spectrum(self, awg_id, step_id, start_sample_idx, num_frames, *, is_iq_data=False): """ キャプチャしたデータの FFT スペクトラムを取得する Parameters ---------- awg_id : AwgId スペクトラムを取得したいデータをキャプチャした AWG の ID step_id : int スペクトラムを取得したいキャプチャステップのID start_sample_idx : int キャプチャデータ中のスペクトラムを得たい部分の先頭サンプルのインデックス. (0 始まり) I/Q データの場合は, まとめて 1 サンプルと数える. num_frames : int 取得する FFT のフレーム数 is_iq_data : bool キャプチャデータが I/Q データの場合 True. Real データの場合 False. Returns ------- spectrum : bytes スペクトラムデータ """ if (not AwgId.has_value(awg_id)): raise ValueError("invalid awg_id " + str(awg_id)) if (not isinstance(step_id, int) or (step_id < 0 or 0x7FFFFFFF < step_id)): raise ValueError("invalid step_id " + str(step_id)) if (not isinstance(start_sample_idx, int) or start_sample_idx < 0): raise ValueError("invalid start_sample_idx " + str(start_sample_idx)) if (not isinstance(num_frames, int) or num_frames < 0): raise ValueError("invalid num_frames " + str(num_frames)) if (not isinstance(is_iq_data, bool)): raise ValueError("invalid is_iq_data " + str(is_iq_data)) if (is_iq_data and start_sample_idx % 8 != 0): raise ValueError( "'start_sample_idx' must be a multiple of 8 for I/Q data. " + str(start_sample_idx)) if ((not is_iq_data) and start_sample_idx % 16 != 0): raise ValueError( "'start_sample_idx' must be a multiple of 16 for Real data. " + str(start_sample_idx)) is_iq_data = 1 if is_iq_data else 0 command = self.__joinargs( "GetSpectrum", [int(awg_id), step_id, start_sample_idx, num_frames, is_iq_data]) self.__rft_data_if.send_command(command) res = self.__rft_data_if.recv_response( ) # スペクトルデータの前のコマンド成否レスポンス [SA_SUCCESS/SA_FAILURE, data size] [result, data_size] = self.__split_response(res, ",") if (result == "SA_SUCCESS"): spectrum = self.__rft_data_if.recv_data(data_size) self.__rft_data_if.recv_response() # end of spectrum data res = self.__rft_data_if.recv_response( ) # end of 'GetSpectrum' command if res[:5] == "ERROR": raise rfterr.RftoolExecuteCommandError(res) self.__logger.debug(res) return spectrum