diff --git a/quad/scripts/tcp_stress_tests.py b/quad/scripts/tcp_stress_tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7619a75147ea695fee2b444fc53ba0744c169313 --- /dev/null +++ b/quad/scripts/tcp_stress_tests.py @@ -0,0 +1,85 @@ +import socket +import time +import uart_stress_tests + +TCP_IP = "192.168.1.1" +TCP_PORT = 8080 + +send_delay = 0.001 +TEST_ITERS = 100000 +REPORT_STEP = int(TEST_ITERS / 10) +payload_size = 28 + +received = [] +def read_n(n_to_read): + global received + while len(received) < n_to_read: + try: + just_received = sock.recv(1024) + if len(just_received) == 0: + print("Socket broken") + quit() + received.extend(just_received) + except: + pass + to_ret = bytes(received[0:n_to_read]) + received = received[n_to_read:] + return to_ret + +def read_packet(raw=False): + header = read_n(7) + length = int.from_bytes(header[5:7], byteorder='little') + data = read_n(length) + checksum = read_n(1) + if raw: + return header + data + checksum + else: + return data + +def get_quad_status(): + print("Getting quad status...") + query_msg = uart_stress_tests.create_msg(2, 0, b'') + sock.send(query_msg) + resp = read_packet() + return uart_stress_tests.parse_query_response(resp) + print("Got quad status") + + +if __name__ == '__main__': + # connect + print("Connecting...") + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(2) + try: + sock.connect((TCP_IP, TCP_PORT)) + sock.setblocking(True) + except: + print("Failed to connect") + quit() + print("connected") + + initial_status = get_quad_status() + + message = uart_stress_tests.create_test_packet(payload_size) + overall_start_time = time.perf_counter() + for i in range(TEST_ITERS): + if i % REPORT_STEP == 0: + print("Sent {} messages".format(i)) + start_time = time.perf_counter() + sock.send(message) + # Busy waiting + # to_sleep_for = send_delay - (time.time() - start_time) + # if to_sleep_for > 1e-6: + # time.sleep(to_sleep_for) + while (time.perf_counter() - start_time <= send_delay): + pass + # Reporting + avg_time = (time.perf_counter() - overall_start_time) / TEST_ITERS + print("Average send time was {}".format(avg_time)) + + after_status = get_quad_status() + diff_messages = after_status[0] - initial_status[0] + diff_payload = after_status[1] - initial_status[1] + print("Sent {} messages, total payload of {}".format(TEST_ITERS, TEST_ITERS*payload_size)) + print("Recv {} messages, total payload of {}".format(diff_messages, diff_payload)) + print("Lost {} messages, {} bytes".format(TEST_ITERS - diff_messages, (TEST_ITERS*payload_size) - diff_payload)) diff --git a/quad/scripts/stress_tests.py b/quad/scripts/uart_stress_tests.py similarity index 97% rename from quad/scripts/stress_tests.py rename to quad/scripts/uart_stress_tests.py index b038c8af18a2a29245afc4773ef226b2a67dd7b9..ecbb27b246b7732cd514aa2299f7eb575d8b00ce 100755 --- a/quad/scripts/stress_tests.py +++ b/quad/scripts/uart_stress_tests.py @@ -14,7 +14,7 @@ def create_msg(msg_type, msg_id, data): msg += msg_id.to_bytes(2, 'little') msg += len(data).to_bytes(2, 'little') msg += data - + checksum = 0 for b in msg: checksum ^= b @@ -35,6 +35,13 @@ def read_packet(ser, raw=False): else: return data +def parse_query_response(data): + received_str = data[:-1].decode('ascii') + if len(received_str) == 0: + print("Timed out") + return (-1,-1) + return tuple(map(int, received_str.split(','))) + def query_received(ser): # Send request query_msg = create_msg(2, 0, b'') @@ -42,11 +49,7 @@ def query_received(ser): ser.flush() sleep(0.1) resp = read_packet(ser) - received_str = resp[:-1].decode('ascii') - if len(received_str) == 0: - print("Timed out") - return (-1,-1) - return tuple(map(int, received_str.split(','))) + return parse_query_response(resp) def check_test(ser, n_sent, size_sent, old_status): new_n, new_size = query_received(ser) @@ -68,7 +71,7 @@ def test_checksum(ser): computed_checksum = 0 for i in range(len(raw_data) - 1): computed_checksum ^= raw_data[i] - + valid = computed_checksum == given_checksum ret_status = query_received(ser) if not valid: @@ -124,27 +127,26 @@ def test_get_set(ser): resp_cntl = resp[0] resp_cnst = resp[1] resp_val = struct.unpack('f', resp[2:6])[0] - + if resp_cntl != cntl_id or resp_cnst != const_id or abs(resp_val - to_set) > 1e-5: - print("Failed get/set test. Expected controller " + + print("Failed get/set test. Expected controller " + str(cntl_id) + ", constant " + str(const_id) + ", value " + str(to_set)) print(" Received " + str(resp_cntl) + ", constant " + str(resp_cnst) + ", value " + str(resp_val)) passed = False ret_status = query_received(ser) return passed, ret_status - + if __name__ == '__main__': with serial.Serial('/dev/ttyUSB0', 921600, timeout=5) as ser: ser.reset_input_buffer() while (ser.in_waiting != 0): ser.read() status = query_received(ser) - + passed, status = test_partial_packet(ser, status) passed, status = test_blast(ser, status) passed, status = test_blast(ser, status, 150, 80) passed, status = test_bad_checksum(ser, status) passed, status = test_checksum(ser) passed, status = test_get_set(ser) -