aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2023-12-14 22:01:53 -0500
committersotech117 <michael_foiani@brown.edu>2023-12-14 22:01:53 -0500
commitb8ab1e8abf56ccaabff8b9414d9d64a151079a1b (patch)
treef1ac4ec96b5513c56c6cb955df35ea595bd479d1
parentd7384329b2ae615ef7d637e31f214dbe648ae418 (diff)
fix merge
-rw-r--r--Recv.py91
-rw-r--r--Sender.py4
-rw-r--r--utils.py10
3 files changed, 93 insertions, 12 deletions
diff --git a/Recv.py b/Recv.py
index 76de3e8..9c4ee6a 100644
--- a/Recv.py
+++ b/Recv.py
@@ -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():
diff --git a/Sender.py b/Sender.py
index d42cfe9..1d6fd0c 100644
--- a/Sender.py
+++ b/Sender.py
@@ -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
diff --git a/utils.py b/utils.py
index 503d289..077fe8d 100644
--- a/utils.py
+++ b/utils.py
@@ -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'