
IIO firmware for the AD717x and AD411x family of devices.
Dependencies: sdp_k1_sdram
scripts/ad717x_data_capture.py@0:5ad86d8d396a, 2022-06-09 (annotated)
- Committer:
- Janani Sunil
- Date:
- Thu Jun 09 10:57:51 2022 +0530
- Revision:
- 0:5ad86d8d396a
- Child:
- 1:f71de62b7179
AD717x-Ad411x IIO Application- Initial Revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Janani Sunil | 0:5ad86d8d396a | 1 | import numpy |
Janani Sunil | 0:5ad86d8d396a | 2 | from serial import Serial |
Janani Sunil | 0:5ad86d8d396a | 3 | from time import sleep |
Janani Sunil | 0:5ad86d8d396a | 4 | from pynput import keyboard |
Janani Sunil | 0:5ad86d8d396a | 5 | import sys |
Janani Sunil | 0:5ad86d8d396a | 6 | import select |
Janani Sunil | 0:5ad86d8d396a | 7 | import os |
Janani Sunil | 0:5ad86d8d396a | 8 | import csv |
Janani Sunil | 0:5ad86d8d396a | 9 | import adi.ad717x import * |
Janani Sunil | 0:5ad86d8d396a | 10 | |
Janani Sunil | 0:5ad86d8d396a | 11 | # Global variables |
Janani Sunil | 0:5ad86d8d396a | 12 | line = 0 |
Janani Sunil | 0:5ad86d8d396a | 13 | writer = 0 |
Janani Sunil | 0:5ad86d8d396a | 14 | run_continuous = False |
Janani Sunil | 0:5ad86d8d396a | 15 | iterations = 0 |
Janani Sunil | 0:5ad86d8d396a | 16 | data_capture_abort = False |
Janani Sunil | 0:5ad86d8d396a | 17 | chn_count = 0 |
Janani Sunil | 0:5ad86d8d396a | 18 | data_list = [] |
Janani Sunil | 0:5ad86d8d396a | 19 | |
Janani Sunil | 0:5ad86d8d396a | 20 | def key_press_event(key): |
Janani Sunil | 0:5ad86d8d396a | 21 | global data_capture_abort |
Janani Sunil | 0:5ad86d8d396a | 22 | data_capture_abort = True |
Janani Sunil | 0:5ad86d8d396a | 23 | |
Janani Sunil | 0:5ad86d8d396a | 24 | def init_data_capture(): |
Janani Sunil | 0:5ad86d8d396a | 25 | global device |
Janani Sunil | 0:5ad86d8d396a | 26 | global data_list |
Janani Sunil | 0:5ad86d8d396a | 27 | global chn_count |
Janani Sunil | 0:5ad86d8d396a | 28 | global listener |
Janani Sunil | 0:5ad86d8d396a | 29 | |
Janani Sunil | 0:5ad86d8d396a | 30 | ######## User configuration ########## |
Janani Sunil | 0:5ad86d8d396a | 31 | # Configure the backend for PC to IIOD interface |
Janani Sunil | 0:5ad86d8d396a | 32 | uri = "serial:COM16,230400" # For UART, baud rate must be same as set in the FW. COM port is physical Or VCOM. |
Janani Sunil | 0:5ad86d8d396a | 33 | device_name = "ad4111" # Name of the device must be same as set in the FW. |
Janani Sunil | 0:5ad86d8d396a | 34 | ###################################### |
Janani Sunil | 0:5ad86d8d396a | 35 | |
Janani Sunil | 0:5ad86d8d396a | 36 | # Create an IIO device context |
Janani Sunil | 0:5ad86d8d396a | 37 | device = ad717x(uri, device_name) |
Janani Sunil | 0:5ad86d8d396a | 38 | device._ctx.set_timeout(100000) |
Janani Sunil | 0:5ad86d8d396a | 39 | |
Janani Sunil | 0:5ad86d8d396a | 40 | ######## User configuration ########## |
Janani Sunil | 0:5ad86d8d396a | 41 | # Channels to be captured e.g. [0]: 1chn, [0,1]: 2chns, [0,1,2,3]: 4chns, [0,1,2,3,4,5,6,7]: 8chns |
Janani Sunil | 0:5ad86d8d396a | 42 | device.rx_enabled_channels = [0,1,2,3] |
Janani Sunil | 0:5ad86d8d396a | 43 | |
Janani Sunil | 0:5ad86d8d396a | 44 | # The block of samples to be captured. Total samples are received in multiple iterations or blocks |
Janani Sunil | 0:5ad86d8d396a | 45 | samples_block = 400 # The samples needs to be captured in smaller blocks due to limitations |
Janani Sunil | 0:5ad86d8d396a | 46 | # of buffer size (RAM) in the firmware and IIO client timeout factor. |
Janani Sunil | 0:5ad86d8d396a | 47 | # Request to capture samples more than buffer size, will be ignored by firmware. |
Janani Sunil | 0:5ad86d8d396a | 48 | # Large time taken to read the samples from device, may cause timeout on IIO client. |
Janani Sunil | 0:5ad86d8d396a | 49 | ###################################### |
Janani Sunil | 0:5ad86d8d396a | 50 | |
Janani Sunil | 0:5ad86d8d396a | 51 | # Get the channels count from user |
Janani Sunil | 0:5ad86d8d396a | 52 | chn_count = len(device.rx_enabled_channels) |
Janani Sunil | 0:5ad86d8d396a | 53 | |
Janani Sunil | 0:5ad86d8d396a | 54 | # Store the rx buffer size and rx data type based on input channels |
Janani Sunil | 0:5ad86d8d396a | 55 | device.rx_buffer_size = int(samples_block / chn_count) # Per channel sample count |
Janani Sunil | 0:5ad86d8d396a | 56 | device._rx_data_type = np.int32 # size of sample |
Janani Sunil | 0:5ad86d8d396a | 57 | |
Janani Sunil | 0:5ad86d8d396a | 58 | listener = keyboard.Listener(on_press=key_press_event) |
Janani Sunil | 0:5ad86d8d396a | 59 | listener.start() |
Janani Sunil | 0:5ad86d8d396a | 60 | |
Janani Sunil | 0:5ad86d8d396a | 61 | def read_user_inputs(): |
Janani Sunil | 0:5ad86d8d396a | 62 | global iterations |
Janani Sunil | 0:5ad86d8d396a | 63 | global run_continuous |
Janani Sunil | 0:5ad86d8d396a | 64 | global device |
Janani Sunil | 0:5ad86d8d396a | 65 | samples_count = int(input("Enter the number of samples to be captured \n\ |
Janani Sunil | 0:5ad86d8d396a | 66 | 0: Unlimited \n\ |
Janani Sunil | 0:5ad86d8d396a | 67 | <50-1000000>: ")) |
Janani Sunil | 0:5ad86d8d396a | 68 | |
Janani Sunil | 0:5ad86d8d396a | 69 | if (samples_count == 0): |
Janani Sunil | 0:5ad86d8d396a | 70 | run_continuous = True |
Janani Sunil | 0:5ad86d8d396a | 71 | else: |
Janani Sunil | 0:5ad86d8d396a | 72 | run_continuous = False |
Janani Sunil | 0:5ad86d8d396a | 73 | iterations = (int)(samples_count / device.rx_buffer_size) |
Janani Sunil | 0:5ad86d8d396a | 74 | if (samples_count % device.rx_buffer_size): |
Janani Sunil | 0:5ad86d8d396a | 75 | iterations = iterations + 1 |
Janani Sunil | 0:5ad86d8d396a | 76 | |
Janani Sunil | 0:5ad86d8d396a | 77 | def init_data_logger(): |
Janani Sunil | 0:5ad86d8d396a | 78 | global writer |
Janani Sunil | 0:5ad86d8d396a | 79 | global chn_count |
Janani Sunil | 0:5ad86d8d396a | 80 | file_name = "adc_data_capture.csv" |
Janani Sunil | 0:5ad86d8d396a | 81 | current_dir = os.getcwd() |
Janani Sunil | 0:5ad86d8d396a | 82 | output_file = os.path.join(current_dir, file_name) |
Janani Sunil | 0:5ad86d8d396a | 83 | result_file = open(output_file, 'w', newline="") |
Janani Sunil | 0:5ad86d8d396a | 84 | writer = csv.writer(result_file) |
Janani Sunil | 0:5ad86d8d396a | 85 | row = [] |
Janani Sunil | 0:5ad86d8d396a | 86 | # Write the channels list header |
Janani Sunil | 0:5ad86d8d396a | 87 | for chn in range(0,chn_count): |
Janani Sunil | 0:5ad86d8d396a | 88 | item = "Ch {}".format(chn) |
Janani Sunil | 0:5ad86d8d396a | 89 | row.insert(chn, item) |
Janani Sunil | 0:5ad86d8d396a | 90 | writer.writerow(row) |
Janani Sunil | 0:5ad86d8d396a | 91 | |
Janani Sunil | 0:5ad86d8d396a | 92 | |
Janani Sunil | 0:5ad86d8d396a | 93 | def read_buffered_data(): |
Janani Sunil | 0:5ad86d8d396a | 94 | global line |
Janani Sunil | 0:5ad86d8d396a | 95 | global writer |
Janani Sunil | 0:5ad86d8d396a | 96 | global device |
Janani Sunil | 0:5ad86d8d396a | 97 | |
Janani Sunil | 0:5ad86d8d396a | 98 | # Receive data from device |
Janani Sunil | 0:5ad86d8d396a | 99 | data = device.rx() |
Janani Sunil | 0:5ad86d8d396a | 100 | if (line == 0): |
Janani Sunil | 0:5ad86d8d396a | 101 | print("Data capture started >>") |
Janani Sunil | 0:5ad86d8d396a | 102 | print("."*line, end="\r") |
Janani Sunil | 0:5ad86d8d396a | 103 | |
Janani Sunil | 0:5ad86d8d396a | 104 | if (chn_count == 1): |
Janani Sunil | 0:5ad86d8d396a | 105 | # Convert 1-D array to 2-D array |
Janani Sunil | 0:5ad86d8d396a | 106 | data_arr = np.reshape(data, (-1,1)) |
Janani Sunil | 0:5ad86d8d396a | 107 | else: |
Janani Sunil | 0:5ad86d8d396a | 108 | # Transpose data from N-D data array |
Janani Sunil | 0:5ad86d8d396a | 109 | data_arr = np.transpose(data) |
Janani Sunil | 0:5ad86d8d396a | 110 | |
Janani Sunil | 0:5ad86d8d396a | 111 | writer.writerows(data_arr) |
Janani Sunil | 0:5ad86d8d396a | 112 | |
Janani Sunil | 0:5ad86d8d396a | 113 | line = line+1 |
Janani Sunil | 0:5ad86d8d396a | 114 | if (line == 100): |
Janani Sunil | 0:5ad86d8d396a | 115 | line = 1 |
Janani Sunil | 0:5ad86d8d396a | 116 | print("\n", end="\r") |
Janani Sunil | 0:5ad86d8d396a | 117 | |
Janani Sunil | 0:5ad86d8d396a | 118 | def do_data_capture(): |
Janani Sunil | 0:5ad86d8d396a | 119 | global iterations |
Janani Sunil | 0:5ad86d8d396a | 120 | global run_continuous |
Janani Sunil | 0:5ad86d8d396a | 121 | global data_capture_abort |
Janani Sunil | 0:5ad86d8d396a | 122 | done = False |
Janani Sunil | 0:5ad86d8d396a | 123 | if (run_continuous == True): |
Janani Sunil | 0:5ad86d8d396a | 124 | print("Press any key to stop data capture..") |
Janani Sunil | 0:5ad86d8d396a | 125 | sleep(2) |
Janani Sunil | 0:5ad86d8d396a | 126 | data_capture_abort = False |
Janani Sunil | 0:5ad86d8d396a | 127 | while not data_capture_abort: |
Janani Sunil | 0:5ad86d8d396a | 128 | read_buffered_data() |
Janani Sunil | 0:5ad86d8d396a | 129 | else: |
Janani Sunil | 0:5ad86d8d396a | 130 | for val in range(0,iterations): |
Janani Sunil | 0:5ad86d8d396a | 131 | read_buffered_data() |
Janani Sunil | 0:5ad86d8d396a | 132 | |
Janani Sunil | 0:5ad86d8d396a | 133 | print("\r\nData capture finished\r\n") |
Janani Sunil | 0:5ad86d8d396a | 134 | |
Janani Sunil | 0:5ad86d8d396a | 135 | def exit(): |
Janani Sunil | 0:5ad86d8d396a | 136 | global listener |
Janani Sunil | 0:5ad86d8d396a | 137 | global writer |
Janani Sunil | 0:5ad86d8d396a | 138 | global device |
Janani Sunil | 0:5ad86d8d396a | 139 | |
Janani Sunil | 0:5ad86d8d396a | 140 | # Delete the objects |
Janani Sunil | 0:5ad86d8d396a | 141 | del listener |
Janani Sunil | 0:5ad86d8d396a | 142 | del writer |
Janani Sunil | 0:5ad86d8d396a | 143 | del device |
Janani Sunil | 0:5ad86d8d396a | 144 | |
Janani Sunil | 0:5ad86d8d396a | 145 | def main(): |
Janani Sunil | 0:5ad86d8d396a | 146 | init_data_capture() |
Janani Sunil | 0:5ad86d8d396a | 147 | init_data_logger() |
Janani Sunil | 0:5ad86d8d396a | 148 | read_user_inputs() |
Janani Sunil | 0:5ad86d8d396a | 149 | do_data_capture() |
Janani Sunil | 0:5ad86d8d396a | 150 | exit() |
Janani Sunil | 0:5ad86d8d396a | 151 | |
Janani Sunil | 0:5ad86d8d396a | 152 | if __name__ == "__main__": |
Janani Sunil | 0:5ad86d8d396a | 153 | main() |