o
    z!h"                     @   sb   d dl Z ddlmZ ddlmZ g dZdZdZG dd	 d	ZG d
d deZ	G dd de	Z
dS )    N   )profile)scrub_method_name)FIT_UTC_REFERENCEFIT_DATETIME_MINDataProcessorBaseDefaultDataProcessorStandardUnitsDataProcessori L%i   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )r   a  
    Data processing base class.

    This class does nothing. It is meant to be derived.

    The following methods are called by :class:`fitdecode.FitReader`:

    * `on_header`, each time a :class:`fitdecode.FitHeader` is reached
    * `on_crc`, each time a :class:`fitdecode.FitCRC` (the FIT footer) is
      reached

    This is convenient if you wish to reset some context-sensitive state in-
    between two chained FIT files for example.

    Bear in mind that a malformed/corrupted file may miss either of these
    entities (header and/or CRC footer).

    Also, the following methods are called (still by
    :class:`fitdecode.FitReader`) for each field of every data message, in that
    order:

    * `on_process_type`
    * `on_process_field`
    * `on_process_unit`
    * `on_process_message`

    By default, the above processor methods call the following methods if they
    exist (hence the aforementioned caching)::

        def process_type_<type_name>(reader, field_data)
        def process_field_<field_name>(reader, field_data)  # could be unknown_XYZ but NOT recommended  # noqa
        def process_units_<unit_name>(reader, field_data)
        def process_message_<mesg_name>(reader, data_message)

    ``process_*`` methods are not expected to return any value and may alter
    the content of the passed *field_data* (:class:`fitdecode.FieldData`) and
    *data_message* (:class:`fitdecode.FitDataMessage`) arguments if needed.

    .. seealso:: `DefaultDataProcessor`, `StandardUnitsDataProcessor`
    c                 C   s
   i | _ d S N)_method_cacheself r   J/var/www/html/gps/gps/lib/python3.10/site-packages/fitdecode/processors.py__init__A   s   
zDataProcessorBase.__init__c                 C      d S r
   r   )r   reader
fit_headerr   r   r   	on_headerD      zDataProcessorBase.on_headerc                 C   r   r
   r   )r   r   fit_crcr   r   r   on_crcG   r   zDataProcessorBase.on_crcc                 C      |  d|jj || d S )Nprocess_type_)_run_processortypenamer   r   
field_datar   r   r   on_process_typeJ      z!DataProcessorBase.on_process_typec                 C   $   |j r| d|j  || d S d S )Nprocess_field_)r   r   r   r   r   r   on_process_fieldO      
z"DataProcessorBase.on_process_fieldc                 C   r!   )Nprocess_units_)unitsr   r   r   r   r   on_process_unitU   r$   z!DataProcessorBase.on_process_unitc                 C   r   )Nprocess_message_)r   def_mesgr   )r   r   data_messager   r   r   on_process_message[   r    z$DataProcessorBase.on_process_messagec                 C   s$   |  |}|d ur||| d S d S r
   )_resolve_method)r   method_namer   datamethodr   r   r   r   `   s   
z DataProcessorBase._run_processorc                 C   s<   | j |d}|dur|S t|}t| |d }|| j |< |S )NF)r   getr   getattr)r   r-   r/   scrubbed_method_namer   r   r   r,   e   s   
z!DataProcessorBase._resolve_methodN)__name__
__module____qualname____doc__r   r   r   r   r#   r'   r+   r   r,   r   r   r   r   r      s    )r   c                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )r   a  
    This is the default data processor used by :class:`fitdecode.FitReader`. It
    derives from :class:`DataProcessorBase`.

    This data processor converts some raw values to more comfortable ones.

    .. seealso:: `StandardUnitsDataProcessor`, `DataProcessorBase`
    c                       t    d S r
   superr   r   	__class__r   r   r   |      zDefaultDataProcessor.__init__c                 C   s   |j durt|j |_ dS dS )z?Just `bool` any ``bool`` typed FIT field unless value is `None`N)valueboolr   r   r   r   process_type_bool   s   
z&DefaultDataProcessor.process_type_boolc                 C   s@   |j dur|j tkrtjt|j  tjj|_ d|_dS dS dS )a  
        Convert ``date_time`` typed field values into `datetime.datetime` object
        if possible.

        That is, if value is not `None` and greater or equal than
        `FIT_DATETIME_MIN`.

        The resulting `datetime.datetime` object is timezone-aware (UTC).
        N)r=   r   datetimefromtimestampr   timezoneutcr&   r   r   r   r   process_type_date_time   s   



z+DefaultDataProcessor.process_type_date_timec                 C   s,   |j durtjt|j  |_ d|_dS dS )a  
        Convert ``date_time`` typed field values into `datetime.datetime` object
        unless value is `None`.

        The resulting `datetime.datetime` object **IS NOT** timezone-aware, but
        this method assumes UTC at object construction to ensure consistency.
        N)r=   r@   utcfromtimestampr   r&   r   r   r   r   process_type_local_date_time   s   

z1DefaultDataProcessor.process_type_local_date_timec                 C   sF   |j dur!t|j d\}}t|d\}}t||||_ d|_dS dS )z
        Convert ``localtime_into_day`` typed field values into `datetime.time`
        object unless value is `None`.
        N<   )r=   divmodr@   timer&   )r   r   r   mshr   r   r   process_type_localtime_into_day   s   

z4DefaultDataProcessor.process_type_localtime_into_dayc                 C   sN   | tjsdS |tjD ]}|dur$tjt|j tj	j
|_d|_qdS )z}
        Convert populated ``event_timestamp`` component values of the ``hr`` to
        `datetime.datetime` objects
        N)	has_fieldr   FIELD_NUM_HR_EVENT_TIMESTAMP_12
get_fieldsFIELD_NUM_HR_EVENT_TIMESTAMPr@   rA   r   r=   rB   rC   r&   )r   r   r*   r   r   r   r   process_message_hr   s   z'DefaultDataProcessor.process_message_hr)r3   r4   r5   r6   r   r?   rD   rF   rM   rR   __classcell__r   r   r:   r   r   r   s    	r   c                       sL   e Zd ZdZ fddZ fddZdd Zdd	 Zd
d Zdd Z	  Z
S )r	   a  
    A `DefaultDataProcessor` that also:

    * Converts ``distance`` and ``total_distance`` fields to ``km``
      (standard's default is ``m``)
    * Converts all ``speed`` and ``*_speeds`` fields (by name) to ``km/h``
      (standard's default is ``m/s``)
    * Converts GPS coordinates (i.e. FIT's semicircles type) to ``deg``

    .. seealso:: `DefaultDataProcessor`, `DataProcessorBase`
    c                    r7   r
   r8   r   r:   r   r   r      r<   z#StandardUnitsDataProcessor.__init__c                    s4   |j r|j dr| || dS t || dS )z
        Convert all ``*_speed`` fields using `process_field_speed`.

        All other units will use the default method.
        _speedN)r   endswithprocess_field_speedr9   r#   r   r:   r   r   r#      s   z+StandardUnitsDataProcessor.on_process_fieldc                 C   s"   |j d ur| j d  _ d|_d S )Ng     @@kmr=   r&   r   r   r   r   process_field_distance      

z1StandardUnitsDataProcessor.process_field_distancec                 C   s   |  || d S r
   )rY   r   r   r   r   process_field_total_distance   s   z7StandardUnitsDataProcessor.process_field_total_distancec                    sR   |j d ur$d t|j ttfrt fdd|j D |_ n| j  9  _ d|_d S )Ng@c                 3   s    | ]}|  V  qd S r
   r   ).0xfactorr   r   	<genexpr>   s    zAStandardUnitsDataProcessor.process_field_speed.<locals>.<genexpr>zkm/h)r=   
isinstancetuplelistr&   r   r   r^   r   rV      s   

z.StandardUnitsDataProcessor.process_field_speedc                 C   s"   |j d ur| j d9  _ d|_d S )Ng     v>degrX   r   r   r   r   process_units_semicircles   rZ   z4StandardUnitsDataProcessor.process_units_semicircles)r3   r4   r5   r6   r   r#   rY   r[   rV   re   rS   r   r   r:   r   r	      s    r	   )r@    r   utilsr   __all__r   r   r   r   r	   r   r   r   r   <module>   s   [Q