
    7j#                        d Z ddlZddl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mZ ddlmZ dd	lmZmZmZ d
 Zd Zd Zd Zej0                   G d d             Z G d d      Zd Z ej8                  ddded       ej8                  ddddd       ej8                  dddeedd        ej:                  d!d"      d#                             Zy)$z?Used by the make system to generate keyboard.c from info.json.
    N)Optional)cli)	info_json)
dump_lines)keyboard_completerkeyboard_folder)normpath)GPL2_HEADER_C_LIKEGENERATED_HEADER_C_LIKEJOYSTICK_AXESc                     g }d| j                  di       v r|j                  t        | d             d| j                  di       v r|j                  t        | d             |S )Nlayout
rgb_matrix
led_matrix)getextend_gen_led_config)	info_dataliness     T/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/generate/keyboard_c.py_gen_led_configsr      sX    E9==r22_Y=>9==r22_Y=>L    c           
         | d   d   }| d   d   }g }t        |      D cg c]  }dg|z  
 }}g }g }| |   d   }	t        |	      D ]  \  }
}d|v r|d   \  }}t        |
      ||   |<   |j                  d|j	                  dd	       d
|j	                  dd	       d       |j                  t        |j	                  dd	                    |dk(  r#|j                  d       |j                  d       n'|dk(  r"|j                  d       |j                  d       |j                  d       |j                  d       |D ]&  }|j                  dd
j                  |       d       ( |j                  d       |j                  dd
j                  |       d       |j                  dd
j                  |       d       |j                  d       |j                  d       |j                  d       |S c c}w )z.Convert info.json content to g_led_config
    matrix_sizecolsrowsNO_LEDr   matrix{xr   , y}flagsr   z#ifdef RGB_MATRIX_ENABLEz#include "rgb_matrix.h"r   z#ifdef LED_MATRIX_ENABLEz#include "led_matrix.h"z4__attribute__ ((weak)) led_config_t g_led_config = {z  {z    { z },z  },z  { };#endif )range	enumeratestrappendr   join)r   config_typer   r   r   _r   posr$   
led_layoutindexled_datarowcollines                  r   r   r      s    ]#F+D]#F+DE).t5Axj45F5
CE;'1J$Z0 4xx)HC"5zF3K

RS!,-RS!0D/ERHISgq1234 l"/0./		$/0./	LLGH	LL 6wtyy/t456	LL	LL53(-.	LL55)*$/0	LL	LL	LLL= 6s   G7c           
      f   | d   d   }| d   d   }t        |      D cg c]  }dg|z  
 }}| d   j                         D ]R  \  }}|d   D ]E  }|d   \  }}	||k\  s|	|k\  r)t        j                  j	                  d| d	       g c c S d
||   |	<   G T g }
|
j                  d       |
j                  d       t        |      D ]2  }|
j                  ddj                  t        ||                d       4 |
j                  d       |
j                  d       |
j                  d       |
S c c}w )z-Convert info.json content to matrix_mask
    r   r   r   0layoutsr   r   zSkipping matrix_mask due to z! containing invalid matrix values1z#ifdef MATRIX_MASKEDz:__attribute__((weak)) const matrix_row_t matrix_mask[] = {z    0br'   ,r%   r&   )r(   itemsr   logerrorr+   r,   reversed)r   r   r   r.   masklayout_namelayout_datakey_datar3   r4   r   is               r   _gen_matrix_maskrD   E   sK    ]#F+D]#F+D #(+.QSEDL.D. %.i$8$>$>$@ ! [#H- 	!H)HCd{cTk <[MIjkl	 DIcN	!! E	LL'(	LLMN4[ =vbgghtAw&789;<=	LL	LL	LLL) /s   D.c                 8   d| j                  di       vrg S | d   d   }t        |j                               }g }|j                  d       |j                  d       t	        t
              D ]y  \  }}t        |      dk(  r nfd}||v r||   }|j                  |       |dk(  r|j                  d| d       M|j                  d| d	|d
    d|d    d|d    d|d    d       { |j                  d       |j                  d       |j                  d       |S )z/Convert info.json content to joystick_axes
    axesjoystickz#ifdef JOYSTICK_ENABLEz8joystick_config_t joystick_axes[JOYSTICK_AXIS_COUNT] = {r   virtualz    [z] = JOYSTICK_AXIS_VIRTUAL,z] = JOYSTICK_AXIS_IN(	input_pinr!   lowresthighz),r%   r&   r'   )r   listkeysr+   r)   r   lenremove)r   rF   	axes_keysr   r1   curaxiss          r   _gen_joystick_axesrT   c   sJ    Y]]:r22	Z (DTYY[!IE	LL)*	LLKL  . C
sy>Q$;9DS!9LL5'ABCLL5'<T+=N<OrRVW\R]Q^^`aeflam`nnpquv|q}p~  A  B  CC 
LL	LL	LLLr   c                       e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   dZeed<   d	Z	e
e   ed
<   ed        Zed        Zed        Zy	)	LayoutKeyz'Geometric info for one key in a layout.r3   r4   r    r"         ?whNhandc                     | d   \  }}t        ||| d   | d   | j                  dd      | j                  dd      | j                  dd             S )	Nr   r    r"   rX   rW   rY   rZ   )r3   r4   r    r"   rX   rY   rZ   )rV   r   )key_jsonr3   r4   s      r   	from_jsonzLayoutKey.from_json   s[    H%Ssmsmll3$ll3$fd+
 	
r   c                 :    | j                   | j                  dz  z   S )zCenter x coordinate of the key.       @)r    rX   selfs    r   cxzLayoutKey.cx        vv$$r   c                 :    | j                   | j                  dz  z   S )zCenter y coordinate of the key.r_   )r"   rY   r`   s    r   cyzLayoutKey.cy   rc   r   )__name__
__module____qualname____doc__int__annotations__floatrX   rY   rZ   r   r*   staticmethodr]   propertyrb   re    r   r   rV   rV      ss    1	H	HHHAuNAuND(3-

 

 % % % %r   rV   c                   *    e Zd ZdZd ZddefdZd Zy)LayoutzGeometric info of a layout.c                     |d   D cg c]  }t         j                  |       c}| _        t        d | j                  D              | _        t        d | j                  D              | _        | j                  | j                  z   dz  | _        t        | j                        D cg c]  \  }}|j                  dk\  s| c}}}t        |      dk(  r| j                  |d      | _        y d | _        y c c}w c c}}w )Nr   c              3   4   K   | ]  }|j                     y wNrb   .0keys     r   	<genexpr>z"Layout.__init__.<locals>.<genexpr>        5C5   c              3   4   K   | ]  }|j                     y wrt   ru   rv   s     r   ry   z"Layout.__init__.<locals>.<genexpr>   rz   r{      g      @   r   )rV   r]   rN   minx_minmaxx_maxx_midr)   rX   rO   spacebar)ra   layout_jsonr\   rC   rx   s        r   __init__zLayout.__init__   s    CNxCXYxY((2Y	549955
549955
jj4::-2
&tyy1B61cSUUc\QB+.q6Q;		!A$D Z
 Cs   C5'C:?C:tolc                 >   t        | j                  D cg c]  }|j                   c}      }t        t	        |            D ]T  }d| j
                  z  ||   z
  }t        j                  |||z
        }|t	        |      k(  st        ||   |z
        |kD  sT y yc c}w )z4Whether the key positions are symmetric about x_mid.r_   FT)	sortedrN   rb   r(   rO   r   bisectbisect_leftabs)ra   r   rx   r    rC   x_i_mirroredjs          r   is_symmetriczLayout.is_symmetric   s    dii0sCFF01s1v 	A+ad2L""1lS&89ACF{c!A$"56<	  1s   Bc                    t        | j                  D cg c]  }|j                   c}      }| j                  }d}t	        t        |      dz
        D ])  }||dz      ||   z
  }||kD  s|}||dz      ||   z   dz  }+ |S c c}w )z?Finds the x midpoint of the widest horizontal gap between keys.r   r~   r}   )r   rN   rb   r   r(   rO   )ra   rx   r    r   max_seprC   seps          r   widest_horizontal_gapzLayout.widest_horizontal_gap   s    dii0sCFF01

s1vz" 	.AAE(QqT/CW}1q5AaDA-		.  1s   BN){Gz?)rf   rg   rh   ri   r   rl   r   r   ro   r   r   rq   rq      s    %A
 
r   rq   c                 Z   | d   j                         D ]  \  }}t        |      } n j                         r1|j                  D cg c]  }|j                  |j
                  z
   }}n|j                  l|j                  j                  dz
  }|j                  j                  dz
  }|j                  D cg c]$  }|j                  |z
  |j                  |z
  dz  z
  & }}n6|j                         }|j                  D cg c]  }|j                  |z
   }}t        |j                  |      D ]E  \  }}	|j                  ||j                  k(  st        |	      dk  rd|_        8|	dk  rd	nd
|_        G g }
|
j                  d       dz   dz   }d}|j                  D ]E  }||j                  |k  r|
j                  |       d}|d|j                   dz  }|j                  }G |
j                  |dd        |
j                  d       |
j                  d       |
S c c}w c c}w c c}w )z5Convert info.json content to chordal_hold_layout
    r8   Ng?rW   g      @r   *g        LRz#ifdef CHORDAL_HOLDzY__attribute__((weak)) const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = (z  'z', z);r&   )r;   rq   r   rN   r    r   r   rb   re   r"   r   ziprZ   r   r+   )r   r@   r   r   rx   
hand_signsx0y0r   	hand_signr   r5   x_prevs                r   _gen_chordal_hold_layoutr      s    %.i$8$>$>$@  [$  7=kkBsceefll*B
B		$ __$&__#%CI;;OCsuurzceebjC%77O
O ,,./5{{;ceeem;
;fkk:6 ;Y88foo%Y4)?"+c/3s; E	LL&'gjuux{{DF{{ >SUUV^LLD!CHH:S!! 
LLcr	LL	LLLG C P <s    H5)H#?H(z-oz--outputTzFile to write to)arg_onlytypehelpz-qz--quiet
store_truez&Quiet mode, only output error messages)r   actionr   z-kbz
--keyboardz$Keyboard to generate keyboard.c for.)r   r   	completerrequiredr   z=Used by the make system to generate keyboard.c from info.json)hiddenc                    t        | j                  j                        }t        t        ddg}|j                  t        |             |j                  t        |             |j                  t        |             |j                  t        |             t        | j                  j                  || j                  j                         y)z#Generates the keyboard.h file.
    z#include QMK_KEYBOARD_Hr'   N)r   argskeyboardr
   r   r   r   rD   rT   r   r   outputquiet)r   kb_info_jsonkeyboard_c_liness      r   generate_keyboard_cr      s     SXX../L +,CE^`bc,\:;,\:;.|<=4\BC sxx 0#((..Ar   )ri   r   dataclassestypingr   milcr   qmk.infor   qmk.commandsr   qmk.keyboardr   r   qmk.pathr	   qmk.constantsr
   r   r   r   r   rD   rT   	dataclassrV   rq   r   argument
subcommandr   ro   r   r   <module>r      s         # <  T T	&R<!H % % %D" "J.b dJHCUVdI\Hpqe\DRdos  {a  bOX\]B ^ b r WBr   