U
    pծ_                     @   sR   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZG dd dZdS )    Nc                   @   s   e Zd ZdZd7d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d8ddZdd Zd9ddZdd Zd d! Zd:d#d$Zd;d%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd<d3d4Zd5d6 ZdS )=OpenOcd	localhost\  c                 C   s.   || _ || _d| _d| _ttjtj| _d S )Ni   Z
python_tcl)_tcl_rpc_host_tcl_rpc_port_buffer_size_tcl_variablesocketAF_INETSOCK_STREAM_socket)selfhostport r   7F:\github\m365-Electric-Scooter-4-Pro-stlink\openocd.py__init__   s
    zOpenOcd.__init__c                 C   s   |    | S N)connectr   r   r   r   	__enter__$   s    zOpenOcd.__enter__c                 C   s   z|   W 5 |    X d S r   )closeexit)r   typevalue	tracebackr   r   r   __exit__(   s    zOpenOcd.__exit__c                 C   s   | j | j| jf d S r   )r   r   r   r   r   r   r   r   r   .   s    zOpenOcd.connectc                 C   s   | j   d S r   )r   r   r   r   r   r   r   1   s    zOpenOcd.closec                 C   s$   |t j d}| j| |  S )Nutf-8)r   COMMAND_TOKENencoder   send_recv)r   cmddatar   r   r   r!   4   s    zOpenOcd.sendc                 C   sP   t  }| j| j}||7 }t tjdd|krq2q|d }|d d }|S )Nr   )encoding)bytesr   recvr   r   r   decodestrip)r   r$   Ztmpr   r   r   r"   :   s    zOpenOcd._recvc                 C   s   |  d d S )Nr   r!   r   r   r   r   r   I   s    zOpenOcd.exitc                 C   s   |  d d S )Nstepr+   r   r   r   r   r,   L   s    zOpenOcd.stepNc                 C   s&   |d kr|  d n|  d|  d S )Nresumezresume 0x%xr+   r   addressr   r   r   r-   O   s    zOpenOcd.resumec                 C   s   |  d d S )Nhaltr+   r   r   r   r   r0   U   s    zOpenOcd.halt  c                 C   s   |  d|  d S )Nzwait_halt %ur+   )r   timeoutr   r   r   	wait_haltX   s    zOpenOcd.wait_haltc                 C   sB   t ttj }d| d | d|  }| |dd d S )Nprogram \z verify 0x%x/strpathlibPath__file__parentabsoluter!   replace)r   r/   binarypathcommandr   r   r   write_binary[   s    zOpenOcd.write_binaryc                 C   s>   t ttj }d| d | d }| |dd d S )Nr4   r5   z verifyr6   r7   )r   Zhex_filer@   rA   r   r   r   	write_hex`   s    zOpenOcd.write_hex    c                 C   s\   d dd t|D }| d| j  | d| j|f  | d| j||t|f  d S )N c                 S   s   g | ]\}}d ||f qS )z%d 0x%xr   ).0ivr   r   r   
<listcomp>f   s     z(OpenOcd.write_memory.<locals>.<listcomp>array unset %szarray set %s { %s }zarray2mem %s 0x%x %s %d)join	enumerater!   r	   len)r   r/   r$   word_lengthZarrayr   r   r   write_memorye   s    
  zOpenOcd.write_memoryc           	         s   |  d| j  |  d| j|||f  |  d| j d  fddtt d D } fddtt d D }d	gt| }t|D ]\}}|| ||< q|S )
NrJ   zmem2array %s %d 0x%x %dz
return $%srE   c                    s   g | ]}t  d |  qS )   intrF   rG   rawr   r   rI   x   s     z'OpenOcd.read_memory.<locals>.<listcomp>rP   c                    s    g | ]}t  d | d  qS )rP      rQ   rS   rT   r   r   rI   y   s     r   )r!   r	   splitrangerM   rL   )	r   r/   countrN   ordervaluesresultrG   posr   rT   r   read_memoryo   s    
  zOpenOcd.read_memoryc                 C   sV   t t|tr$| d| d}n| d| d}t|dk rHd S t|d dS )Nz
ocd_reg %uz: z
ocd_reg %srP   rV      )
issubclassr   rR   r!   rW   rM   )r   registerrU   r   r   r   read_register   s    zOpenOcd.read_registerc                 C   s4   t  }|D ]$}| |}|d kr& d S |||< q
|S r   )dictrb   )r   	registersr\   ra   r   r   r   r   read_registers   s    

zOpenOcd.read_registersc                 C   s8   d gt | }| |}|D ]}|| |||< q|S r   )rM   re   index)r   rd   Zregister_listr\   regr   r   r   read_register_list   s
    
zOpenOcd.read_register_listc                 C   s8   t t|tr"| d||f  n| d||f  d S )Nzreg %u 0x%xzreg %s 0x%x)r`   r   rR   r!   )r   ra   r   r   r   r   write_register   s    zOpenOcd.write_registerc                 C   s   |D ]}|  |||  qd S r   )ri   )r   rd   rg   r   r   r   write_registers   s    zOpenOcd.write_registersrP   Tc                 C   s.   |r|  d||f  n|  d||f  d S )Nzbp 0x%x %u hwz
bp 0x%x %ur+   )r   r/   lengthZhardwarer   r   r   set_breakpoint   s    zOpenOcd.set_breakpointc                 C   s   |  d|  d S )Nzrbp 0x%xr+   r.   r   r   r   remove_breakpoint   s    zOpenOcd.remove_breakpoint)r   r   )N)r1   )rD   )rD   )rP   T)__name__
__module____qualname__r   r   r   r   r   r   r!   r"   r   r,   r-   r0   r3   rB   rC   rO   r^   rb   re   rh   ri   rj   rl   rm   r   r   r   r   r      s0   
	







r   )	sysmathargparsestructenumosr9   r
   r   r   r   r   r   <module>   s   