# -*- coding: utf-8 -*-

#----------
# ※ Tektronix provides the following example "AS IS" with no support or warranty.
# 本スクリプトは無償のサンプル・ファイルとしてお渡しするものであり、本スクリプトに対して、
# 今後弊社は一切のサポートを行うことはできません。ご了承の上ご利用をお願い致します。
# 本パッケージで示したプログラムは、正しく稼働することを保証するものではありません。
# 
# Name： AFG31K simple sequence builder
# Version: 1.1.1
# 
# 概要：
# 本スクリプトは、AFG31000シリーズにて、シーケンス編集を自動化するためのものです。
# 
# 注意：
# シーケンス機能のご利用には、AFG31000シリーズ Opt. SEQの追加が必要となります。
# 
# 推奨機器
# - AFG31000シリーズ
#
# 開発言語
# Python3.x
# 
# 必要なPythonモジュール：
# - PyVISA
#
# 動作確認済環境
# - AFG31252 (Firmware version 1.6.4)
# - TekVISA Resource Manager v4.3.1.32
# = VISA Shared Components v7.2.0004
# - Python 3.12.0
# - PyVISA 1.14.1
#
# Author: Shunsuke Katori(Field Application Engineer, Tektronix Japan)
# Original version created on March 25th, 2025
# Updated on May 27th, 2026
# 
#----------

import pyvisa
import time

def seq_build_main():
    # 起動メッセージを表示します
    print('AFG31K simple sequence builder (version 1.1.0)\n')
    print('※ Tektronix provides the following example "AS IS" with no support or warranty.')
    print('注意：本プログラムは無償のサンプル・ファイルとしてお渡しするものであり、本プログラムに対して、')
    print('今後弊社は一切のサポートを行うことはできません。ご了承の上ご利用をお願い致します。')
    print('本パッケージで示したプログラムは、正しく稼働することを保証するものではありません。\n')


    # PyVISA Resource Managerインスタンスを作成します
    rm = pyvisa.ResourceManager()

    # AFGとの接続を行います
    # visa_name = 'TCPIP::10.235.36.136::INSTR'の部分は、適宜接続先のVISA Nameをご入力ください

    visa_name = 'TCPIP::10.235.36.136::INSTR'
    # visa_name = 'TCPIP::10.235.36.149::5025::SOCKET'

    afg = rm.open_resource(visa_name)
    afg.timeout = 30000
    print(afg.query('*idn?'))

    # 一旦AFG本体のdefault setupを行います
    print('本プログラムは、一旦本体のDefault Setupを行います。\n')
    input('続行するにはEnterキーを押してください。キャンセルしたい場合は、Ctrl + Cを押してください。')
    afg.write('*RST')
    afg.query('*OPC?')
    print('Set to default.\n')

    # アドバンスモードに入ります
    afg.write('SEQControl:STATe ON')
    afg.query('*OPC?')
    print('Set to Advanced mode.\n')

    # アドバンスモードにて新しいシーケンスの作成を始めます
    # Run modeはSequenceに設定します
    afg.write('SEQuence:NEW')
    afg.write('SEQControl:RMODe SEQence')
    afg.query('*OPC?')

    # AFG31K 本体メモリ内のプリセット波形ファイルをインポートします
    afg.write('WLISt:WAVeform:IMPort \"P:/Ramp1000.tfwx\"')
    afg.write('WLISt:WAVeform:IMPort \"P:/Sine1000.tfwx\"')
    afg.write('WLISt:WAVeform:IMPort \"P:/Square1000.tfwx\"')
    afg.query('*OPC?')

    # シーケンス設定を入力します
    afg.write('SEQuence:LENGth 3')
    afg.query('*OPC?')

    afg.write('SEQuence:ELEM1:WAVeform1 \"P:/Square1000.tfwx\"')
    afg.write('SEQuence:ELEM1:WAVeform2 \"P:/Square1000.tfwx\"')
    afg.write('SEQuence:ELEM1:LOOP:COUNt 1')
    afg.query('*OPC?')

    afg.write('SEQuence:ELEM2:WAVeform1 \"P:/Ramp1000.tfwx\"')
    afg.write('SEQuence:ELEM2:WAVeform2 \"P:/Ramp1000.tfwx\"')
    afg.write('SEQuence:ELEM2:LOOP:COUNt 1')
    afg.query('*OPC?')

    afg.write('SEQuence:ELEM3:WAVeform1 \"P:/Sine1000.tfwx\"')
    afg.write('SEQuence:ELEM3:WAVeform2 \"P:/Sine1000.tfwx\"')
    afg.write('SEQuence:ELEM3:LOOP:COUNt 1')
    afg.query('*OPC?')

    afg.write('SEQuence:ELEM3:GOTO:STATe 1')
    afg.write('SEQuence:ELEM3:GOTO:INDex 1')
    afg.query('*OPC?')

    # サンプル・レート設定を行います
    afg.write('SEQControl:SRATe 250000000')
    afg.query('*OPC?')

    # サンプル・レート設定を確認します
    srate = afg.query('SEQControl:SRATe?').rstrip()
    print('The sampling rate is set to ' + srate + ' S/s.\n')

    # 作成したシーケンスを.seqファイルに保存したい場合は、ここをコメントアウトしてください
    # afg.write('MMEMory:SAVE:SEQuence \"M:/Test_Sequence.seq\"')
    # afg.query('*OPC?')
    # print('Saved to a .seq file...\n')

    # Ch1およびCh2の出力をオンにし、RUN状態にしたい場合は、以下ブロックをコメントアウトしてください
    # afg.write('OUTPut1:STATe ON')
    # afg.write('OUTPut2:STATe ON')
    # afg.query('*OPC?')
    # afg.write('SEQControl:RUN:IMMediate')
    # afg.query('*OPC?')

    # RUN状態になっているか、確認します
    stat_run = afg.query('SEQControl:RSTATe?')
    if stat_run == '1\n':
        print('Now the sequence is running.')
    else:
        print('The sequence has been stopped.')

    # Run modeを確認します
    rmode = afg.query('SEQControl:RMODe?').rstrip()
    print('The run mode is ' + rmode + '.\n')

    # AFGとの接続を閉じます
    afg.close()

if __name__ == '__main__':
    seq_build_main()
