o
    z!hQ                     @   s   d dl Z d dlZd dlZd dlZd dlZddlmZmZmZm	Z	 ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ g d	Ze ZG d
d de jZG dd de jZG dd dZG dd dZdS )    N   )FitHeaderErrorFitCRCErrorFitEOFErrorFitParseError)records)types)utils)
processors)profile)CrcCheckErrorHandling	FitReaderc                   @   s$   e Zd ZdZdZdZdZdZeZdS )r   zf
    Defines the values expected by the ``check_crc`` parameter of `FitReader`'s
    constructor.
    r   r         N)	__name__
__module____qualname____doc__DISABLEDREADONLYWARNRAISEENABLED r   r   F/var/www/html/gps/gps/lib/python3.10/site-packages/fitdecode/reader.pyr      s    
r   c                   @   s   e Zd ZdZdZdZdZdS )r   zk
    Defines the values expected by the ``error_handling`` parameter of
    `FitReader`'s constructor.
    r   r   r   N)r   r   r   r   IGNOREr   r   r   r   r   r   r   4   s
    r   c                   @   s   e Zd ZdZdd ZdS )RecordHeaderis_definitionis_developer_datalocal_mesg_numtime_offsetc                 C   s   || _ || _|| _|| _d S Nr   )selfr   r    r!   r"   r   r   r   __init__P   s   
zRecordHeader.__init__N)r   r   r   	__slots__r%   r   r   r   r   r   L   s    r   c                   @   sj  e Zd ZdZeejejdedddZdd Z	dd	 Z
d
d Zdd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Ze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.d/ Zd0d1d2d3Zd4d5 Z d6d7 Z!d8d9 Z"dHd:d;Z#d<d= Z$e%j&d0d0d0fd>d?Z'd@dA Z(e)dBdC Z*e)dDdE Z+e,dFdG Z-d0S )Ir   a
  
    Parse the content of a FIT stream or storage.

    Transparently supports "chained FIT Files" as per SDK's definition. A
    `FitHeader` object is yielded during iteration to mark the beginning of each
    new "FIT File".

    First argument *fileish* can be passed as a file-like or a path-like object
    (`os.PathLike`). File-like object must be opened in byte-mode. File-like
    object is not owned by `FitReader` so it is up to the caller to close it
    manually.

    Usage::

        import fitdecode

        with fitdecode.FitReader('file.fit') as fit:
            for frame in fit:
                # The yielded frame object is of one of the following types:
                # * fitdecode.FitHeader (FIT_FRAME_HEADER)
                # * fitdecode.FitDefinitionMessage (FIT_FRAME_DEFINITION)
                # * fitdecode.FitDataMessage (FIT_FRAME_DATA)
                # * fitdecode.FitCRC (FIT_FRAME_CRC)

                if frame.frame_type == fitdecode.FIT_FRAME_DATA:
                    # Here, frame is a FitDataMessage object.
                    # A FitDataMessage object contains decoded values that
                    # are directly usable in your script logic.
                    print(frame.name)

    Data processing:

    * You can specify your own data processor object using the *processor*
      argument.
    * The argument can be left untouched so that `DefaultDataProcessor` is used.
    * Otherwise, it can be set to `None` or any other false value to skip data
      processing entirely. This can speed up things a bit if your intent is only
      to manipulate the file at binary level (i.e. chunks), in which case
      *keep_raw_chunks* must be set to true.

    Raw chunks:

    * "raw chunk" or sometimes "frame", is the name given in fitdecode to the
      `bytes` block that represents one of the four FIT entities: `FitHeader`,
      `FitDefinitionMessage`, `FitDataMessage` and `FitCRC`.
    * While iterating a file with `FitReader`, you can for instance cut, stitch
      and/or reconstruct the file being read by using the
      `FitChunk` object attached to any of the four aforementioned entities, as
      long as the *keep_raw_chunks* option is true.

    Data bag:

    * A *data_bag* object can be passed to the constructor and then be retrieved
      via the `data_bag` property.
    * *data_bag* can be of any type (a `dict` by default) and will never be
      altered by this class.
    * A "data bag" is useful if you wish to store some context-sensitive data
      during the decoding of a file.
    * A typical use case is from a data processor that cannot hold its own
      context-sensitive data due to its instance being shared with other readers
      and/or by multiple threads (typically `DefaultDataProcessor`).

    F)	processor	check_crcerror_handlingkeep_raw_chunksdata_bagc             	   C   sn  |du rt j}n|du rt j}t|t sJ t|tsJ || _|| _|tu r)i n|| _|tu r6t	
 | _n|| _|| _d | _d | _d| _d| _d| _d| _d| _d| _tj| _d | _d | _d| _i | _i | _d| _i | _d| _d| _ t!|dr|| _d| _nt|t"st!|drt#|dd| _d| _n	t$%|| _d| _z| j& | _| j| _W d S  t't(fy   Y d S w )	NTFr   read
__fspath__rb)mode))r   r   r   
isinstancer   r(   r)   _UNSETr+   r
   DefaultDataProcessor
_processor	_keep_raw_fd	_fd_owned_read_offset
_read_size_fit_file_index_chunk_index_chunk_offset_chunk_sizer	   	CRC_START_crc_header_current_file_id_body_bytes_left_local_mesg_defs_local_dev_types_compressed_ts_accumulator_accumulators_last_timestamp_hr_start_timestamphasattrstropenioBytesIOtellAttributeErrorOSError)r$   fileishr'   r(   r)   r*   r+   r   r   r   r%      sZ   
zFitReader.__init__c                 C   s   |    d S r#   closer$   r   r   r   __del__   s   zFitReader.__del__c                 C   s   | S r#   r   rT   r   r   r   	__enter__   s   zFitReader.__enter__c                 G   s   |   S r#   rR   )r$   _r   r   r   __exit__   s   zFitReader.__exit__c                 c   s    |   E d H  d S r#   )
_read_nextrT   r   r   r   __iter__   s   zFitReader.__iter__c                 C      | j S )z.Read-only access to the data processor object.)r4   rT   r   r   r   r'         zFitReader.processorc                 C   r[   )z0The last read `FitHeader` object. May be `None`.)r@   rT   r   r   r   last_header   r\   zFitReader.last_headerc                 C   r[   )ai  
        The last ``timestamp`` value (`int`).

        Often useful in FIT files since some data fields rely on it like
        ``timestamp_16`` and ``timestamp_ms`` for instance.

        Hint: you usually want to use this property from your own processor
        class derived from on of the processors available from
        `fitdecode.processors`.
        )rG   rT   r   r   r   last_timestamp   s   zFitReader.last_timestampc                 C   r[   )z
        The ``file_id`` `FitDataMessage` object related to the current FIT file.

        May be `None`. Typically before a `FitHeader` frame, or after a `FitCRC`
        frame.
        )rA   rT   r   r   r   file_id  s   zFitReader.file_idc                 C   s   | j dkr| j S dS )z
        The zero-based index `int` of the so-called *FIT file* currently read
        from this data stream so far.

        `None` if no *FIT file* header has been encoutered yet.
        r   Nr:   rT   r   r   r   fit_file_index  s   zFitReader.fit_file_indexc                 C   s
   | j d S )z9The number of FIT files found in this data stream so far.r   r`   rT   r   r   r   fit_files_count  s   
zFitReader.fit_files_countc                 C   r[   )a  
        Read-only access to the `dict` of local message types of the current
        "FIT file".

        It is cleared by `close()` (or ``__exit__()``), and also each time a FIT
        file header is reached (i.e. at the beginning of a file, or after a
        `FitCRC`).
        )rC   rT   r   r   r   local_mesg_defs     
zFitReader.local_mesg_defsc                 C   r[   )a  
        Read-only access to the `dict` of developer types of the current
        "FIT file".

        It is cleared by `close()` (or ``__exit__()``), and also each time a FIT
        file header is reached (i.e. at the beginning of a file, or after a
        `FitCRC`).
        rD   rT   r   r   r   local_dev_types'  rd   zFitReader.local_dev_typesc                 C   s   | j dur| jrt| j dr| j   d| _ d| _d| _d| _d| _d| _d| _d| _	t
j| _d| _d| _d| _i | _i | _d| _i | _d| _d| _dS )zu
        Close the internal file handle if it is owned by this object, and clear
        the internal state.
        NrS   r   r,   )r6   r7   rI   rS   r8   r9   r:   r;   r<   r=   r	   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rT   r   r   r   rS   3  s(   

zFitReader.closec                 #   s>    fdd} j d ur jdksJ  jd u r= jdksJ        jd u r.d S   jd7  _ jV  |  nY jdkro jd usIJ   }t|t	j
t	jfsXJ  j jks`J   j j8  _|V  |  n' jd usvJ  jdks}J z  }W n ty    w |V  |      j d usd S d S )Nc                      s6    j d ur  jd7  _  j j7  _d _d S d S )Nr   r   )r6   r;   r<   r=   r   rT   r   r   _update_stateR  s
   

z+FitReader._read_next.<locals>._update_stater   r   )r6   r=   r@   rB   _reset_per_fit_state_read_headerr:   _read_recordr1   r   FitDefinitionMessageFitDataMessage	_read_crcr   )r$   rg   recordcrc_objr   rT   r   rY   P  sF   




zFitReader._read_nextc                 C   sB   t j| _d | _d | _d| _i | _i | _d| _i | _	d| _
d| _d S )Nr   )r	   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rT   r   r   r   rh     s   
zFitReader._reset_per_fit_statec              
   C   s  z|  d\}}}}}}W n ty* } z|jsW Y d }~d S td| d }~ww |t|k s5|dkr=td| j |t| }d }	d }
|r|dk rVtd| j d| |}t||krjtd| j dtd	|\}	|	sxd }	d }
n3t	
|}||	k}
|
s| jtju s| jtju rd
| j d}| jtju rt|| jtju rt| ||7 }|d? |d@ f}t|d t|d f}tj|||||	|
| |d| _|| _| jr| j| | j d S d S )Nz<2BHI4szfile truncated? s   .FITznot a FIT file @ r   z:unsupported FIT header (CRC field missing; header offset: )z%truncated FIT header (header offset: <Hz.mismatching CRC in FIT header (header offset:       d   )header_size	proto_verprofile_ver	body_sizecrccrc_matchedchunk)_read_structr   gotr   lenr<   _read_bytesstructunpackr	   compute_crcr(   r   r   r   r   warningswarnintr   	FitHeader_keep_chunkr@   rB   r4   	on_header)r$   r{   ru   rv   rw   rx   header_magicexcextra_header_sizeread_crcrz   extra_chunkcomputed_crcmsgr   r   r   ri     s|   


zFitReader._read_headerc                 C   s   | j }| d\}}||kr<| jtju s| jtju r<d| j d| d| d}| jtju r1t|| jtju r<t	| t
|||k| |}| jrR| j| | |S )Nrq   z.mismatching CRC in FIT footer (footer offset: z; read crc: z; expected crc: rp   )r?   r|   r(   r   r   r   r<   r   r   r   r   FitCRCr   r4   on_crc)r$   r   r{   r   r   ro   r   r   r   rm     s2   
zFitReader._read_crcc                 C   s   |  d}|d d@ rtdd|d d? d@ |d d@ }ntt|d d@ t|d d	@ |d d
@ d }|jr?| ||}|S | ||}|jd urd|jjtj	krX| 
| |S |jjtjkrd| | |S )Nr   r      F   r      @       rs   )r   r   boolr   _read_definition_message_read_data_message	mesg_typemesg_numr   MESG_NUM_DEVELOPER_DATA_ID_add_dev_data_idMESG_NUM_FIELD_DESCRIPTION_add_dev_field_description)r$   r{   record_headermessager   r   r   rj     s2   






zFitReader._read_recordc                 C   s2  |g}|  d}|| |d sdnd}t| d|\}}tj|}t| d}	g }
g }t|D ]}|  |	j	}|| |	|\}}}|rS|j
|nd }tj|tj}||j	 dkrd| d	| j d
|j d|j	 d	}| jtju rt| j|| jtju rt| n| jtju sJ tj}|r|jr|jD ]}|jr| j|i }d||j< q|
t|||| q6|jr|  d}|| |d }t|D ])}|  |	j	}|| |	|\}}}| |j |||}|t!|||| qt"#|j|j |j$||||
|| %|	}|| j&|j < |S )Nr   r   <>2xHB3Br   zinvalid field size z in definition message @ z
 for type z (expected a multiple of rp   )'r   appendr   r   r   MESSAGE_TYPESgetStructrangesizefieldsr   
BASE_TYPESBASE_TYPE_BYTEr<   namer)   r   r   r   r   r   r   r   
components
accumulaterF   
setdefaultdef_numFieldDefinitionr    _get_dev_typer!   DevFieldDefinitionr   rk   r"   r   rC   )r$   header_chunkr   record_chunksr   endianglobal_mesg_num
num_fieldsr   field_unpacker
field_defsdev_field_defsidxfield_def_num
field_sizebase_type_numfield	base_typer   	componentaccumulatorsnum_dev_fieldsdev_data_indexdef_mesgr   r   r   r     s   









z"FitReader._read_definition_messagec                 C   s  |g}z| j |j }W n ty   t| jd|j dw | |\}}|| g }t|j|D ]\}}	|j	d }
}|
r| 
|
||\}
}|
jr|jtjkoY|j oY|jtjk}|
jD ]e}z||	}W n	 tyo   Y q]w |jr|d ur| j|j }| |||j |j}|||j< | ||}|jj|j }| 
|||\}}||}|r| jdksJ || j7 }|td |||| q]| |
|
|	}n|	}|jtjkr|	d ur|| _ |	| _!n|jtjkr|js|jtj"kr| j | _|t||
|||	 q2|j#d ur#| |j#| j!d}|| _!|td tj$d tj$|| | j%rB|D ]}| j%&| | | j%'| | | j%(| | q)t)*|j+|j|j#||| ,|}| j%r]| j%-| | |jtj.krg|| _/|S )Nzlocal message  not definedr   r   )0rC   r!   KeyErrorr   r<   _read_data_message_raw_valuesextendzipall_field_defsr   _resolve_subfieldr   r   r   MESG_NUM_HRis_devr   FIELD_NUM_HR_EVENT_TIMESTAMP_12render
ValueErrorr   rF   _apply_compressed_accumulationbits_apply_scale_offsetr   r   rH   r   r   	FieldDataFIELD_NUM_TIMESTAMPrG   rE   FIELD_NUM_HR_EVENT_TIMESTAMPr"   FIELD_TYPE_TIMESTAMPr4   on_process_typeon_process_fieldon_process_unitr   rl   r    r   on_process_messageMESG_NUM_FILE_IDrA   )r$   r   r   r   r   extra_chunks
raw_valuesmessage_fields	field_def	raw_valuer   parent_fieldis_hr_event_timestamp_12r   cmp_raw_valueaccumulator	cmp_fieldcmp_parent_field	cmp_valuedecoded_valuets_value
field_datadata_messager   r   r   r     s   








zFitReader._read_data_messagec                    s   g }g }|j D ]S}|j t|j t|j j   j }| |j}|	| |
|} jtjjkr< |}nt|dkrNt fdd|D }n |d }|	| q||fS )Nr   c                 3   s    | ]}  |V  qd S r#   )parse).0vr   r   r   	<genexpr>$  s    z:FitReader._read_data_message_raw_values.<locals>.<genexpr>r   )r   r   r   r   r   r   r   fmtr   r   r   
identifierr   r   r   r~   tuple)r$   r   r   r   r   unpackerr{   r   r   r   r   r   
  s*   


z'FitReader._read_data_message_raw_valuesN)r   c                C   sT   |sJ |r
|| }t |}|jdkrtd| d| |j}|f|| S )Nr   zinvalid struct format "")r   r   r   r   r   r   )r$   r   r   r   r{   r   r   r   r|   -  s   

zFitReader._read_structc                 C   s   |dkrt dt| j|}|sdnt|}||kr"t||| j|rH| jtj	ur3tj
|| jd| _|  j|7  _|  j|7  _|  j|7  _|S )Nr   r   )ry   )r   r	   blocking_readr6   r~   r   r8   r(   r   r   r   r?   r=   r9   )r$   r   r{   
chunk_sizer   r   r   r   :  s   zFitReader._read_bytesc                 C   s^   | j sd S |s	J t|ttfrd|}nt|tsJ t|| jks&J t	| j
| j|S )N    )r5   r1   listr   joinbytesr~   r=   r   FitChunkr;   r<   )r$   r{   r   r   r   r   L  s   
zFitReader._keep_chunkc              
   C   s   z| d}t|}W nG tyR } z;t| d|j d| j d}| jtju r.t	| j|| jtj
u r>|d7 }t| n| jtju sFJ d }W Y d }~nd }~ww |j dd d}| || d S )Ndeveloper_data_index (local_mesg_num: ; chunk_offset: rp   ; adding dummy dev data...application_id)fallback)get_raw_valuer   r   rJ   r!   r<   r)   r   r   r   r   r   r   r   _add_dev_data_id_impl)r$   r   r   r   r   r  r   r   r   r   ]  s&   
zFitReader._add_dev_data_idc                 C   s   ||i d| j |< d S )N)r   r  r   re   )r$   r   r  r   r   r   r
  u  s   zFitReader._add_dev_data_id_implc                 C   s  g }dD ]}z| |}W nG tyT } z;t| d|j d| j d}| jtju r0t| j|| jtj	u r@|d7 }t
| n| jtju sHJ d }W Y d }~n2d }~ww |dkrq|d urat|}|| jvrpt| jd| dn|d	kr|d u r}tj}ntj| }|| q| j|  d S )
N)r  field_definition_numberfit_base_type_id
field_nameunitsnative_field_numr  r  rp   r  r   dev_data_index r   r  )r	  r   rJ   r!   r<   r)   r   r   r   r   r   r   r   r   rD   r   r   r   r   _add_dev_field_description_impl)r$   r   
adfdi_argsraw_value_namer   r   r   r   r   r   r   {  sB   


z$FitReader._add_dev_field_descriptionc                 C   s&   t ||||||| j| d |< d S )Nr   )r   DevFieldrD   )r$   r   r   r   r   r  r  r   r   r   r    s
   
z)FitReader._add_dev_field_description_implc                 C   sR  z| j | }W nJ tyQ   d| d| d| d| d| j d}| jtju r-t| j|| jtju r=|d7 }t	| n| jtj
u sEJ | | | j | }Y nw z|d | W S  ty   d	| d
| d| d| d| j d}| jtju rt| j|| jtju r|d7 }t	| n| jtj
u sJ | || | j | d |  Y S w )Nr  z# not defined (looking up for field z; local_mesg_num: z; global_mesg_num: r  rp   z; adding dummy type...r   zno such field z for dev_data_index r  z"; defaulting to BYTE field type...)rD   r   r<   r)   r   r   r   r   r   r   r   r
  r  )r$   r!   r   r   r   dev_typer   r   r   r   r     s\   
zFitReader._get_dev_typec                 C   sf   | j r/| j D ](}|jD ]"}t|j|D ]\}}|j|jkr,|j|kr,|| f      S qqq| d fS r#   )	subfields
ref_fieldsr   r   r   r   )r   r   r   	sub_field	ref_fieldr   r   r   r   r   r     s   



zFitReader._resolve_subfieldc                 C   s6   d|> }|d }| || @  }| ||@ k r||7 }|S )Nr   r   )r   accumulationnum_bits	max_valuemax_mask
base_valuer   r   r   r     s   z(FitReader._apply_compressed_accumulationc                    sX   t |trt fdd|D S t |ttfr*jr"t|j }jr*|j }|S )Nc                 3   s    | ]	}  |V  qd S r#   )r   )r   xclsr   r   r   r     s    z0FitReader._apply_scale_offset.<locals>.<genexpr>)r1   r   r   floatscaleoffset)r!  r   r   r   r   r   r     s   

zFitReader._apply_scale_offsetr#   ).r   r   r   r   r2   r   r   r   r%   rU   rV   rX   rZ   propertyr'   r]   r^   r_   ra   rb   rc   rf   rS   rY   rh   ri   rm   rj   r   r   r   r|   r   r   r   r
  r   r   r   r  r   staticmethodr   r   classmethodr   r   r   r   r   r   X   sh    AE



	
	


>Ge 
#
+
-


r   )enumrL   osr   r   
exceptionsr   r   r   r    r   r   r	   r
   r   __all__objectr2   Enumr   r   r   r   r   r   r   r   <module>   s"   