diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-12-14 22:01:53 -0500 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-12-14 22:01:53 -0500 |
commit | b8ab1e8abf56ccaabff8b9414d9d64a151079a1b (patch) | |
tree | f1ac4ec96b5513c56c6cb955df35ea595bd479d1 | |
parent | d7384329b2ae615ef7d637e31f214dbe648ae418 (diff) |
fix merge
-rw-r--r-- | Recv.py | 91 | ||||
-rw-r--r-- | Sender.py | 4 | ||||
-rw-r--r-- | utils.py | 10 |
3 files changed, 93 insertions, 12 deletions
@@ -3,13 +3,15 @@ import struct import numpy as np import pyaudio import threading + +import utils from utils import * class Recv: - def __init__(self, start_freq=19500): + def __init__(self, start_freq=18000): self.start_freq = start_freq - self.freq_range = 500 + self.freq_range = 2000 self.sampling_rate = 44100 self.p = pyaudio.PyAudio() self.bytes_per_transmit = 1 @@ -37,11 +39,94 @@ class Recv: data_int = struct.unpack(str(self.CHUNK) + 'i', data) return data_int + def print_data(self, data): + print(data) + + def safe_check_byte(self, bytes_seen): + safe_byte = [] + + if len(bytes_seen) > 0: + for col in range(len(bytes_seen[0])): + count1s = 0 + count0s = 0 + for row in range(len(bytes_seen)): + bit = bytes_seen[row][col] + if bit == '1': + count1s += 1 + else: + count0s += 1 + if count1s > count0s: + safe_byte.append('1') + else: + safe_byte.append('0') + + return safe_byte + def listen(self): + prev_is_data_flag = '0' + prev_is_new_byte_flag = '0' + + bytes_seen = [] + recv_buffer = [] + while True: data = self.read_audio_stream() recv_freq_range = self.freq_range / 2 - wave_to_bits(data, self.start_freq, recv_freq_range, self.bytes_per_transmit) + bits = wave_to_bits(data, self.start_freq, recv_freq_range, self.bytes_per_transmit) + + # handle the data flags + is_data_flag = bits[-1] + is_new_byte_flag = bits[-2] + + if prev_is_data_flag == '0' and is_data_flag == '1': + prev_is_data_flag = is_data_flag + # just started receiving data + bytes_seen = [] + recv_buffer = [] + + is_data_flag = bits[-1] + if prev_is_data_flag == '0' and is_data_flag == '0': + prev_is_data_flag = is_data_flag + + # just waiting for new data + continue + + if prev_is_data_flag == '1' and is_data_flag == '0': + prev_is_data_flag = is_data_flag + + # just finished the last byte of data, add it to buffer, then write buffer to terminal + recv_buffer.append(self.safe_check_byte(bytes_seen)) + + # FIXME: what to do with buffer? + # for now print buffer as string + buffer_as_string = ''.join([utils.receive_string(byte) for byte in recv_buffer]) + print("recv_buffer: ", buffer_as_string) + + # clear data structure & buffer + continue + + # at this point, we know we are receiving data + if prev_is_new_byte_flag == is_new_byte_flag: + prev_is_new_byte_flag = is_new_byte_flag + + # we are still receiving the same byte, store it in the data structure + byte = bits[:-2] + bytes_seen.append(byte) + continue + else: + prev_is_new_byte_flag = is_new_byte_flag + + # we are receiving a new byte, so we need to write the old byte to the recv buffer + recv_buffer.append(self.safe_check_byte(bytes_seen)) + # clear the data structure + bytes_seen = [] + + # append the new byte to the data structure + byte = bits[:-2] + bytes_seen.append(byte) + continue + + def main(): @@ -131,9 +131,9 @@ def receive_string(data, start_freq=18000, freq_step=250): class LinkLayer: - def __init__(self, start_freq=19500): + def __init__(self, start_freq=18000): self.start_freq = start_freq - self.freq_range = 500 + self.freq_range = 2000 self.sampling_rate = 44100 self.p = pyaudio.PyAudio() self.isReceiving = False @@ -30,11 +30,6 @@ def wave_to_bits(wave, starting_freq, freq_range, bytes_per_transmit, chunk=4096 # convert the frequencies to bits data = frequencies_to_bits(freqs, calculate_send_frequencies(starting_freq, freq_range, bytes_per_transmit)) - # TODO: remove - byte = data[:8] - if data[-1] == '1': - receive_string(byte) - return data @@ -68,7 +63,7 @@ def frequencies_to_bits(frequencies, expected_freqs): def play_data(data, start_freq, freq_step, bytes_per_transmit, stream): freq_list = calculate_send_frequencies(start_freq, freq_step, bytes_per_transmit) - send_duration = 1.0 + send_duration = .25 flip_flag = 0 # TODO: make this global between plays for byte in data: @@ -94,4 +89,5 @@ def receive_string(binary): print(chr(int(binary_string, 2))) return chr(int(binary_string, 2)) except ValueError: - print("Error: Invalid binary data") + print("Warn: Invalid binary data: ", binary_string) + return 'X' |