Discharge/DischargeDatabase/Examples/22813/includes/DAS/0416RigolDS1074b.ON/acquisition.py

import socket
import numpy as np
from time import sleep


class SCPI_HTTP(object):

    def __init__(self, ip_address, port):
        self.socket = socket.create_connection((ip_address, port))
        self.socket.settimeout(2)  # s

    def communicate(self, message):
        self.socket.sendall(message)
        data_segments = []
        while True:
            try:
                data = self.socket.recv(2**12)
            except socket.timeout:
                break
            data_segments.append(data)
            if len(data) == 0 or data[-1] == '\n':
                break
        return ''.join(data_segments)

    def get_points_in_memory_count(self):
        return int(self.communicate(':acquire:mdepth?'))

    def get_channel_data(self, channel_i):
        data_points = self.get_points_in_memory_count()
        self.communicate(':waveform:source channel{0};:waveform:mode raw;:waveform:format ascii'.format(channel_i))
        sleep(0.5)
        data_all = []
        segment_size = 15625
        start_i = 1
        while True:
            stop_i = start_i + segment_size - 1
            self.communicate(':waveform:start {0};:waveform:stop {1}'.format(start_i, stop_i))
            data = self.communicate(':waveform:data?')
            data_all += [float(point) for point in data[11:-1].split(',')]
            start_i += segment_size
            if stop_i >= data_points:
                break
        return np.array(data_all)

    def get_sample_rate(self):
        return float(self.communicate(':acquire:srate?'))

        

if __name__ == '__main__':
    dev = SCPI_HTTP('192.168.2.99', 5555)
    channels_data = [dev.get_channel_data(i+1) for i in range(2)]
    dt = 1.0 / dev.get_sample_rate()
    time_axis = np.arange(channels_data[0].shape[0]) * dt
    channels_data.insert(0, time_axis)
    np.savetxt('data_all', np.vstack(channels_data).T)