diff --git a/utility/obsw_binary_uploader.py b/utility/obsw_binary_uploader.py index 7f27a9e3f6255ef4cac7671785d2af0ee00f9e31..5930a349caa31871a46dea965b41b10ae199ce12 100644 --- a/utility/obsw_binary_uploader.py +++ b/utility/obsw_binary_uploader.py @@ -12,6 +12,7 @@ import tkinter as tk from tkinter import filedialog from collections import deque from glob import glob +from typing import Deque from tmtc_core.comIF.obsw_com_interface import CommunicationInterface from tc.obsw_tc_service23_sdcard import FileTransferHelper @@ -19,20 +20,29 @@ import config.obsw_config as g from tmtc_core.utility.obsw_tmtc_printer import TmTcPrinter, DisplayMode from tmtc_core.utility.obsw_logger import get_logger from tmtc_core.sendreceive.obsw_tm_listener import TmListener -from tmtc_core.tm.obsw_pus_tm_factory import PusTmQueueT LOGGER = get_logger() +class BinaryFileUploader: + def __init__(self): + pass + + def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinter, tm_listener: TmListener): + """ + TODO: This should be a class.. + @param com_if: + @param tmtc_printer: + @param tm_listener: + @return: + """ gui_cl_prompt = input("GUI(0) or command line version (1)? [0/1]: ") if gui_cl_prompt == 0: gui_cl_prompt = True else: gui_cl_prompt = False - # TODO: prompt whether this is a binary upload or a normal file upload. Or use op code - # two different commands to achieve the same. print("Please select file to upload: ") file_path = "" if gui_cl_prompt: @@ -149,11 +159,35 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte else: print_string += " File will not be locked." LOGGER.info(print_string) + + reception_deque = deque() + perform_send_algorithm(tc_queue, total_num_packets, com_if, tmtc_printer, tm_listener, + reception_deque) + + print_string = "BinaryUploader: All binary packets were sent!" + LOGGER.info(print_string) + print_string = str(reception_deque.__len__()) + " replies received." + + LOGGER.info(print_string) + time.sleep(15) + reception_deque.extend(tm_listener.retrieve_tm_packet_queue()) + for tm_list in reception_deque: + for tm_packet in tm_list: + if tm_packet.get_service() == 23 and tm_packet.get_subservice() == 132: + # tmtc_printer.print_telemetry(tm_packet) + pass + tm_listener.clear_tm_packet_queue() + LOGGER.info("Transitioning back to listener mode..") + + +def perform_send_algorithm(tc_queue: Deque, number_of_packets: int, com_if: CommunicationInterface, + tmtc_printer: TmTcPrinter, tm_listener: TmListener, + reception_deque: Deque): interval = 0.6 + last_check = time.time() last_sent = time.time() - total_time = interval * total_num_packets + total_time = interval * number_of_packets idx = 1 - reception_deque: PusTmQueueT = deque() while tc_queue: next_send = last_sent + interval (tc_packet, tc_info) = tc_queue.pop() @@ -168,28 +202,17 @@ def perform_file_upload(com_if: CommunicationInterface, tmtc_printer: TmTcPrinte remaining_time_string = "Remaining time: " + \ str(round(total_time - (idx - 2) * interval, 2)) + \ " seconds" - print_progress_bar(idx - 2, total_num_packets, print_end="\n", suffix=remaining_time_string) + print_progress_bar(idx - 2, number_of_packets, print_end="\n", suffix=remaining_time_string) # sys.stdout.write("\033[F") # Cursor up one line - reception_deque.extend(tm_listener.retrieve_tm_packet_queue()) + packets_received = tm_listener.retrieve_tm_packet_queue() + reception_deque.extend(packets_received) + # Every 5 seconds, check whether any reply has been received. If not, cancel operation. + if time.time() - last_check > 5.0 and len(packets_received) == 0: + LOGGER.warning("No replies are being received, cancelling upload operation..") time_to_sleep = next_send - time.time() last_sent = next_send time.sleep(time_to_sleep) - print_string = "BinaryUploader: All binary packets were sent!" - LOGGER.info(print_string) - print_string = str(reception_deque.__len__()) + " replies received." - - LOGGER.info(print_string) - time.sleep(15) - reception_deque.extend(tm_listener.retrieve_tm_packet_queue()) - for tm_list in reception_deque: - for tm_packet in tm_list: - if tm_packet.get_service() == 23 and tm_packet.get_subservice() == 132: - # tmtc_printer.print_telemetry(tm_packet) - pass - tm_listener.clear_tm_packet_queue() - LOGGER.info("Transitioning back to listener mode..") - # https://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console # Thank you Greensticks :-)