mirror of https://github.com/DJ2LS/FreeDATA.git
attempt using an buffer empty indicator for iss
parent
caf33d5429
commit
6da8be56f9
|
@ -23,6 +23,10 @@ class DataFrameFactory:
|
||||||
'AWAY_FROM_KEY': 0, # Bit-position for indicating the AWAY FROM KEY state
|
'AWAY_FROM_KEY': 0, # Bit-position for indicating the AWAY FROM KEY state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
P2P_FLAGS = {
|
||||||
|
'BUFFER_EMPTY': 0, # Bit-position for indicating the BUFFER EMPTY state
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, ctx):
|
def __init__(self, ctx):
|
||||||
self.ctx = ctx
|
self.ctx = ctx
|
||||||
|
|
||||||
|
@ -170,8 +174,9 @@ class DataFrameFactory:
|
||||||
|
|
||||||
# heartbeat for "is alive"
|
# heartbeat for "is alive"
|
||||||
self.template_list[FR_TYPE.P2P_CONNECTION_HEARTBEAT.value] = {
|
self.template_list[FR_TYPE.P2P_CONNECTION_HEARTBEAT.value] = {
|
||||||
"frame_length": self.LENGTH_SIG1_FRAME,
|
"frame_length": self.LENGTH_ACK_FRAME,
|
||||||
"session_id": 1,
|
"session_id": 1,
|
||||||
|
"flag": 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# ack heartbeat
|
# ack heartbeat
|
||||||
|
@ -185,6 +190,16 @@ class DataFrameFactory:
|
||||||
"frame_length": None,
|
"frame_length": None,
|
||||||
"session_id": 1,
|
"session_id": 1,
|
||||||
"sequence_id": 1,
|
"sequence_id": 1,
|
||||||
|
"flag": 1,
|
||||||
|
"data": "dynamic",
|
||||||
|
}
|
||||||
|
|
||||||
|
# p2p payload frames
|
||||||
|
self.template_list[FR_TYPE.P2P_CONNECTION_PAYLOAD.value] = {
|
||||||
|
"frame_length": None,
|
||||||
|
"session_id": 1,
|
||||||
|
"sequence_id": 1,
|
||||||
|
"flag": 1,
|
||||||
"data": "dynamic",
|
"data": "dynamic",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,6 +320,12 @@ class DataFrameFactory:
|
||||||
# get_flag returns True or False based on the bit value at the flag's position
|
# get_flag returns True or False based on the bit value at the flag's position
|
||||||
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
|
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
|
||||||
|
|
||||||
|
if frametype in [FR_TYPE.P2P_CONNECTION_PAYLOAD.value, FR_TYPE.P2P_CONNECTION_HEARTBEAT]:
|
||||||
|
flag_dict = self.P2P_FLAGS
|
||||||
|
for flag in flag_dict:
|
||||||
|
# Update extracted_data with the status of each flag
|
||||||
|
# get_flag returns True or False based on the bit value at the flag's position
|
||||||
|
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
extracted_data[key] = data
|
extracted_data[key] = data
|
||||||
|
@ -519,9 +540,14 @@ class DataFrameFactory:
|
||||||
}
|
}
|
||||||
return self.construct(FR_TYPE.P2P_CONNECTION_CONNECT_ACK, payload)
|
return self.construct(FR_TYPE.P2P_CONNECTION_CONNECT_ACK, payload)
|
||||||
|
|
||||||
def build_p2p_connection_heartbeat(self, session_id):
|
def build_p2p_connection_heartbeat(self, session_id, flag_buffer_empty=False):
|
||||||
|
flag = 0b00000000
|
||||||
|
if flag_buffer_empty:
|
||||||
|
flag = helpers.set_flag(flag, 'BUFFER_EMPTY', True, self.P2P_FLAGS)
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"session_id": session_id.to_bytes(1, 'big'),
|
"session_id": session_id.to_bytes(1, 'big'),
|
||||||
|
"flag": flag.to_bytes(1, 'big'),
|
||||||
}
|
}
|
||||||
return self.construct(FR_TYPE.P2P_CONNECTION_HEARTBEAT, payload)
|
return self.construct(FR_TYPE.P2P_CONNECTION_HEARTBEAT, payload)
|
||||||
|
|
||||||
|
@ -531,10 +557,16 @@ class DataFrameFactory:
|
||||||
}
|
}
|
||||||
return self.construct(FR_TYPE.P2P_CONNECTION_HEARTBEAT_ACK, payload)
|
return self.construct(FR_TYPE.P2P_CONNECTION_HEARTBEAT_ACK, payload)
|
||||||
|
|
||||||
def build_p2p_connection_payload(self, freedv_mode: codec2.FREEDV_MODE, session_id: int, sequence_id: int, data: bytes):
|
def build_p2p_connection_payload(self, freedv_mode: codec2.FREEDV_MODE, session_id: int, sequence_id: int, data: bytes, flag_buffer_empty=False):
|
||||||
|
flag = 0b00000000
|
||||||
|
if flag_buffer_empty:
|
||||||
|
flag = helpers.set_flag(flag, 'BUFFER_EMPTY', True, self.P2P_FLAGS)
|
||||||
|
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"session_id": session_id.to_bytes(1, 'big'),
|
"session_id": session_id.to_bytes(1, 'big'),
|
||||||
"sequence_id": sequence_id.to_bytes(1, 'big'),
|
"sequence_id": sequence_id.to_bytes(1, 'big'),
|
||||||
|
"flag": flag.to_bytes(1, 'big'),
|
||||||
"data": data,
|
"data": data,
|
||||||
}
|
}
|
||||||
print(self.get_bytes_per_frame(freedv_mode))
|
print(self.get_bytes_per_frame(freedv_mode))
|
||||||
|
|
|
@ -47,6 +47,7 @@ class P2PConnection:
|
||||||
States.PAYLOAD_SENT: {
|
States.PAYLOAD_SENT: {
|
||||||
FRAME_TYPE.P2P_CONNECTION_PAYLOAD_ACK.value: 'transmitted_data',
|
FRAME_TYPE.P2P_CONNECTION_PAYLOAD_ACK.value: 'transmitted_data',
|
||||||
FRAME_TYPE.P2P_CONNECTION_DISCONNECT.value: 'received_disconnect',
|
FRAME_TYPE.P2P_CONNECTION_DISCONNECT.value: 'received_disconnect',
|
||||||
|
FRAME_TYPE.P2P_CONNECTION_HEARTBEAT.value: 'received_heartbeat',
|
||||||
|
|
||||||
},
|
},
|
||||||
States.ARQ_SESSION: {
|
States.ARQ_SESSION: {
|
||||||
|
@ -95,6 +96,9 @@ class P2PConnection:
|
||||||
self.session_id = self.generate_id()
|
self.session_id = self.generate_id()
|
||||||
|
|
||||||
self.event_frame_received = threading.Event()
|
self.event_frame_received = threading.Event()
|
||||||
|
# set if iss buffer is empty
|
||||||
|
self.iss_buffer_empty = threading.Event()
|
||||||
|
|
||||||
|
|
||||||
self.RETRIES_CONNECT = 3
|
self.RETRIES_CONNECT = 3
|
||||||
self.TIMEOUT_CONNECT = 5
|
self.TIMEOUT_CONNECT = 5
|
||||||
|
@ -221,6 +225,9 @@ class P2PConnection:
|
||||||
self.set_state(States.CONNECTED)
|
self.set_state(States.CONNECTED)
|
||||||
self.is_ISS = True
|
self.is_ISS = True
|
||||||
|
|
||||||
|
# iss starts sending data
|
||||||
|
self.iss_buffer_empty.set()
|
||||||
|
|
||||||
self.log(frame)
|
self.log(frame)
|
||||||
if self.ctx.socket_interface_manager and hasattr(self.ctx.socket_interface_manager.command_server, "command_handler"):
|
if self.ctx.socket_interface_manager and hasattr(self.ctx.socket_interface_manager.command_server, "command_handler"):
|
||||||
self.ctx.socket_interface_manager.command_server.command_handler.socket_respond_connected(self.origin, self.destination, self.bandwidth)
|
self.ctx.socket_interface_manager.command_server.command_handler.socket_respond_connected(self.origin, self.destination, self.bandwidth)
|
||||||
|
@ -254,7 +261,16 @@ class P2PConnection:
|
||||||
|
|
||||||
def process_data_queue(self, frame=None):
|
def process_data_queue(self, frame=None):
|
||||||
if self.p2p_data_tx_queue.empty():
|
if self.p2p_data_tx_queue.empty():
|
||||||
|
print("buffer empty....")
|
||||||
|
payload = self.frame_factory.build_p2p_connection_heartbeat(self.session_id, flag_buffer_empty=True)
|
||||||
|
self.launch_twr(payload, self.TIMEOUT_DATA, self.RETRIES_DATA, mode=FREEDV_MODE.signalling_ack)
|
||||||
|
self.set_state(States.PAYLOAD_SENT)
|
||||||
|
time.sleep(5)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not self.iss_buffer_empty.is_set():
|
||||||
|
return
|
||||||
|
|
||||||
print("processing data....")
|
print("processing data....")
|
||||||
|
|
||||||
data = self.p2p_data_tx_queue.get()
|
data = self.p2p_data_tx_queue.get()
|
||||||
|
@ -277,6 +293,8 @@ class P2PConnection:
|
||||||
def received_data(self, frame):
|
def received_data(self, frame):
|
||||||
self.log(f"received data...: {frame}")
|
self.log(f"received data...: {frame}")
|
||||||
|
|
||||||
|
self.iss_buffer_empty = threading.Event()
|
||||||
|
|
||||||
ack_data = self.frame_factory.build_p2p_connection_payload_ack(self.session_id, 0)
|
ack_data = self.frame_factory.build_p2p_connection_payload_ack(self.session_id, 0)
|
||||||
self.launch_twr_irs(ack_data, self.ENTIRE_CONNECTION_TIMEOUT, mode=FREEDV_MODE.signalling_ack)
|
self.launch_twr_irs(ack_data, self.ENTIRE_CONNECTION_TIMEOUT, mode=FREEDV_MODE.signalling_ack)
|
||||||
|
|
||||||
|
@ -296,6 +314,12 @@ class P2PConnection:
|
||||||
print("transmitted data...")
|
print("transmitted data...")
|
||||||
self.set_state(States.CONNECTED)
|
self.set_state(States.CONNECTED)
|
||||||
|
|
||||||
|
def received_heartbeat(self, frame):
|
||||||
|
print(frame)
|
||||||
|
print("received heartbeat...")
|
||||||
|
self.iss_buffer_empty.set()
|
||||||
|
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
if self.state not in [States.DISCONNECTING, States.DISCONNECTED]:
|
if self.state not in [States.DISCONNECTING, States.DISCONNECTED]:
|
||||||
self.set_state(States.DISCONNECTING)
|
self.set_state(States.DISCONNECTING)
|
||||||
|
|
Loading…
Reference in New Issue