<commit_before># Under MIT License, see LICENSE.txt

from collections import deque
from datetime import datetime
from datetime import timedelta

from PyQt5.QtCore import QTimer

__author__ = 'RoboCupULaval'


class FrameModel:
    """
        FrameModel est un modèle qui gère les données provenant du système de vision. FrameModel possède
        un récupérateur de données du module de vision (Frame Catcher) pour ensuite mettre à jour les
        positions des objets mobiles sur la vue du terrain (Screen View).
    """
    def __init__(self, controller=None):
        self._controller = controller
        self._vision = None
        self._recorder = None

        # Initialisation des variables de données
        self._max_data_queue = 3000
        self._data_queue_received = deque(maxlen=self._max_data_queue)
        self._current_frame = None

        # Initialisation des variables pour le frame catcher
        self._last_frame_caught_time = datetime.min
        self._frame_catcher_update_rate = 60.0        # Fréquence d'update en Hz
        self._frame_catcher_timer = QTimer()

        # Contrôleur
        self._recorder_is_enable = False

    def set_vision(self, server):
        self._vision = server

    def start(self):
        """ Initialise le timer pour récupérer """
        self._frame_catcher_timer.timeout.connect(self._catching_frame)
        self._frame_catcher_timer.start(self._frequency_to_milliseconds_int(self._frame_catcher_update_rate))

    def _update_is_in_progress(self):
        """ Vérifie si la mise à jour des données est terminée pour éviter une erreur de récursivité """
        if datetime.now() - self._last_frame_caught_time > timedelta(seconds=1 / self._frame_catcher_update_rate):
            return False
        else:
            return True

    def _frame_has_been_processed(self, frame):
        """ Vérifie si un frame a été traité ou non """
        if frame is None:
            return True
        if len(self._data_queue_received) == 0 or not frame.detection.frame_number == self._current_frame.detection.frame_number:
            return False
        return True

    def _catching_frame(self):
        """ Récupère le dernier frame reçu, le met à jour et le sauvegarde """
        if not self._update_is_in_progress():
            frame = self._get_last_frame()
            if not self._frame_has_been_processed(frame):
                self._last_frame_caught_time = datetime.now()
                self._update_view_screen_mobs(datetime.now(), frame)

    def _get_last_frame(self):
        """ Récupère le dernier frame de la vision ou de l'enregistreur """
        if not self._recorder_is_enable:
            return self._vision.get_latest_frame()
        else:
            return self._recorder.get_last_frame()

    def _update_view_screen_mobs(self, ftime, frame):
        """ Mise à jour des données de la vue des objets mobiles  """
        if not self._recorder_is_enable:
            frame_pkg = ftime, frame
            self._data_queue_received.append(frame_pkg)
        self._current_frame = frame
        self._update_view_screen_ball()<commit_msg>try-catching bug when no vision is present<commit_after># Under MIT License, see LICENSE.txt

from collections import deque
from datetime import datetime
from datetime import timedelta

from PyQt5.QtCore import QTimer

__author__ = 'RoboCupULaval'


class FrameModel:
    """
        FrameModel est un modèle qui gère les données provenant du système de vision. FrameModel possède
        un récupérateur de données du module de vision (Frame Catcher) pour ensuite mettre à jour les
        positions des objets mobiles sur la vue du terrain (Screen View).
    """
    def __init__(self, controller=None):
        self._controller = controller
        self._vision = None
        self._recorder = None

        # Initialisation des variables de données
        self._max_data_queue = 3000
        self._data_queue_received = deque(maxlen=self._max_data_queue)
        self._current_frame = None

        # Initialisation des variables pour le frame catcher
        self._last_frame_caught_time = datetime.min
        self._frame_catcher_update_rate = 60.0        # Fréquence d'update en Hz
        self._frame_catcher_timer = QTimer()

        # Contrôleur
        self._recorder_is_enable = False

    def set_vision(self, server):
        self._vision = server

    def start(self):
        """ Initialise le timer pour récupérer """
        self._frame_catcher_timer.timeout.connect(self._catching_frame)
        self._frame_catcher_timer.start(self._frequency_to_milliseconds_int(self._frame_catcher_update_rate))

    def _update_is_in_progress(self):
        """ Vérifie si la mise à jour des données est terminée pour éviter une erreur de récursivité """
        if datetime.now() - self._last_frame_caught_time > timedelta(seconds=1 / self._frame_catcher_update_rate):
            return False
        else:
            return True

    def _frame_has_been_processed(self, frame):
        """ Vérifie si un frame a été traité ou non """
        if frame is None:
            return True
        if len(self._data_queue_received) == 0 or not frame.detection.frame_number == self._current_frame.detection.frame_number:
            return False
        return True

    def _catching_frame(self):
        """ Récupère le dernier frame reçu, le met à jour et le sauvegarde """
        if not self._update_is_in_progress():
            frame = self._get_last_frame()
            if not self._frame_has_been_processed(frame):
                self._last_frame_caught_time = datetime.now()
                self._update_view_screen_mobs(datetime.now(), frame)

    def _get_last_frame(self):
        """ Récupère le dernier frame de la vision ou de l'enregistreur """
        if not self._recorder_is_enable:
            try:
                return self._vision.get_latest_frame()
            except:
                return self._recorder.get_last_frame()
        else:
            return self._recorder.get_last_frame()

    def _update_view_screen_mobs(self, ftime, frame):
        """ Mise à jour des données de la vue des objets mobiles  """
        if not self._recorder_is_enable:
            frame_pkg = ftime, frame
            self._data_queue_received.append(frame_pkg)
        self._current_frame = frame
        self._update_view_screen_ball()
{'fraction_non_alphanumeric': 0.06846310512298293, 'fraction_numerical': 0.0031333228889237038, 'mean_word_length': 2.652173913043478, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2086055', 'n_tokens_mistral': 1874, 'n_tokens_neox': 1831, 'n_words': 509}