
    7j                     *   d Z ddlZddlZddlm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mZmZmZmZmZ ddlmZmZmZ dd	lmZmZmZ dd
lmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z& g dZ'g dZ( G d de	      Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2dCdZ3d Z4d Z5d Z6d  Z7d! Z8d" Z9d# Z:d$ Z;dDd%Z<d& Z=d' Z>d( Z?d) Z@d* ZAd+ ZBd, ZCd- ZDd. ZEd/ ZFd0 ZGd1 ZHd2 ZId3 ZJd4 ZKd5 ZLd6 ZMd7 ZNd8 ZOd9 ZPd: ZQd; ZRd< ZSd= ZTd> ZUd? ZVdCd@ZWdCdAZXdB ZYy)Ez9Functions that help us generate and use info.json files.
    N)Path)dotty)IntFlag)cli)COL_LETTERSROW_LETTERSCHIBIOS_PROCESSORSLUFA_PROCESSORSVUSB_PROCESSORSJOYSTICK_AXES)find_layoutsparse_config_h_filefind_led_config)deep_update	json_loadvalidate)config_hrules_mk)parse_configurator_json)parse_rules_mk_file)compute)
maybe_exittruthy)1onyes)0offnoc                   $    e Zd ZdZdZdZdZdZdZy)LedFlags   r               N)	__name__
__module____qualname__ALLNONEMODIFIER	UNDERGLOWKEYLIGHT	INDICATOR     A/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/info.pyr!   r!      s     
CDHIHIr1   r!   c                     h d}t        j                  dd      t        j                  dd      t        | j                  d            |z
  }t	        fd|D              S )zCValidate that a layout macro does not contain name of keyboard
    >	   jpisojistklwklansiorthoplanckpreonicz_split_\d+x\d+_\d+ z_\d+x\d+/c              3   &   K   | ]  }|v  
 y wNr0   ).0fragmentlayouts     r2   	<genexpr>z+_keyboard_in_layout_name.<locals>.<genexpr>8   s     Ahx6!As   )resubsetsplitany)keyboardrC   safe_layout_tokensname_fragmentss    `  r2   _keyboard_in_layout_namerM   "   s\    
 VV)2v6FVVKV,F,-0BBNA.AAAr1   c                 :    t        d      | z  j                         S )z3Validate that a declared community list exists
    zlayouts/default)r   existsrC   s    r2   _valid_community_layoutrQ   ;   s     "#f,4466r1   c                 p    | j                  dd      dk(  r| j                  dd      dk(  r| d   dz
  S | d   S )Nhr#   r$   wg      ?xg      ?get)keys    r2   _get_key_left_positionrY   A   s>    !ggc1o2swwsA$7N3s8d?\TWX[T\\r1   c                    | j                  di       j                  dg       }g }| j                  di       j                  dd      rB| j                  di       j                  di       j                  di       j                  d|      }t        |      t        |      z   }g }| j                  di       }|j                         D ]  \  }}t               }|d   D ]v  }	d|	v s|d	k(  r|j	                  ||	d   d
f       n>|	d   |k\  r|j	                  ||	d   df       n|	d   |v r|j	                  ||	d   df       |j                  |	d          x  |S )z.Perform additional validation of encoders
    encoderrotaryrH   enabledFrightlayoutsrC   r   znon-configuredzout of bounds	duplicate)rW   lenitemsrG   appendadd)
	info_dataenc_left	enc_right	enc_countretr_   layout_namelayout_datafoundrX   s
             r2   _find_invalid_encoder_indexrm   F   sZ    }}Y+//"=HI}}Wb!%%i7MM'2.229bAEEgrRVVW_aij	HI.I
CmmIr*G$+MMO 
* [x( 	*CC>JJS^=MNO^y0JJS^_MN^u,JJS^[IJ		#i.)	*
* Jr1   c                 V   t        d      | z  dz  }t        |       }d}|D ]-  }|j                  dk(  s|dz  }||k7  st        |d| d       / |D ]B  }|j                  dk(  s|j                  dz  }|j                         s3t        |d| d       D |dk(  rt        |d	       y
y
)Non schema checks
    	keyboardskeyboard.jsonr   r#   z)Invalid keyboard.json location detected: .	info.jsonz%Invalid info.json location detected: z'Build marker "keyboard.json" not found.N)r   find_info_jsonname
_log_errorparentrO   _log_warning)rJ   re   keyboard_json_pathconfig_fileskeyboard_json_count	info_file	conf_files          r2   _validate_build_targetr~   b   s     k*X5G!(+L ! `	>>_,1$..9(QR[Q\\]&^_	` " \	>>_,!((;6I!9(Mi[XY&Z[	\ aY IJ  r1   c                    |j                  di       j                  dd      }|j                  di       j                  dd      }|j                  di       }|j                  di       }|j                  dg       }t        t        d |            }t        |      dk(  s t	        d	 |j                         D              rt        |d
       |j                         D ]'  \  }}	|	j                  dd      st        || d       ) |j                         D ]  \  }}	t        |	d         D ]q  \  }
}|d   \  }}|j                  ddt        |    t        |          }||k\  rt        || d|
 d| d| d| 	       ||k\  sXt        || d|
 d| d| d| 	       s  |j                         D ]T  \  }}	t               }t        |	d         D ]4  \  }
}|d    }||v rt        || d|
 d|        |j                  |       6 V |j                         D ]x  \  }}	t        |	d   D cg c]  }t        |       c}      }|dkD  rt        |d| d|        t        |	d   D cg c]  }|d   	 c}      }|dkD  sgt        |d| d|        z t        |      dk(  rd|v rt        |d       t        |j!                               t        |      z
  }|D ]  }t#        | |      st        |d| d        ! |D ]1  }t%        |      r|d   j'                  |       t        |d!|z         3 |D ]  }||vs||vst        |d"d#|d$       ! y%c c}w c c}w )&ro   matrix_sizecolsr   rowsr_   layout_aliasescommunity_layoutsc                     d|  S )NLAYOUT_r0   rP   s    r2   <lambda>z#_validate_layouts.<locals>.<lambda>   s    x6H r1   c              3   B   K   | ]  }|j                  d d         yw)json_layoutFNrV   )rA   rC   s     r2   rD   z$_validate_layouts.<locals>.<genexpr>   s     dFJJ}e$D Dds   zBNo LAYOUTs defined! Need at least one layout defined in info.json.c_macroFz7: Layout macro should not be defined within ".h" files.rC   matrixlabelkz: Matrix row for key z (z) is z but must be less than z: Matrix column for key z: Matrix location for key z is not unique Layout "z" is offset on X axis by yz" is offset on Y axis by r#   
LAYOUT_allzG"LAYOUT_all" should be "LAYOUT" unless additional layouts are provided.z&" should not contain name of keyboard.z<Claims to support a community layout that does not exist: %sz#Claims to support community layout z but no z() macro foundN)rW   listmapra   allvaluesrv   rb   	enumerater   r   rG   rd   minrY   rx   keysrM   rQ   remove)rJ   re   col_numrow_numr_   r   r   community_layouts_namesrj   rk   indexkey_datarowcolkey_nameseenrX   r   offset_xoffset_ypotential_layoutsrC   s                         r2   _validate_layoutsr   |   s    mmM2.2261=GmmM2.2261=GmmIr*G]]#3R8N!&92>"3'HJ[#\] 7|qCdSZSaSaScdd9bc %,MMO k [??9e,y[M1h"ijk
 %,MMO M [(X)>? 	MOE8)HC||GqS1A0B;sCSBT-UVHg~95J5'QST\S]]bcfbgg~  @G  H  'I  Jg~95MeWTVW_V``efiej  kB  CJ  BK  'L  M	MM %,MMO  [u(X)>? 	OE8h'(Cd{95OPUwVefneo&pqHHSM		 %,MMO a [;x;PQa.q1QRa<h{m;TU]T^$_`H(=>1#>?a<h{m;TU]T^$_`a 7|q\W4Y ij GLLN+c2I.JJ# _#Hf5hvh6\$]^_
 $ m&v.)*11&9y"`dj"kl	m / {g%+^*Kyekmx"yz{5 R ?s   (M
$M
c                     |j                  dg       D ]:  }t        |d         dkD  s|j                  dg       r(t        |d|d    d       < y)ro   keycodesrX      aliaseszKeycode z has no short form aliasNrW   ra   rv   )rJ   re   decls      r2   _validate_keycodesr      sW     j"- XtE{a88Ir*9e=U&VWXr1   c                 \    t        |      }|D ]  \  }}}t        |d| d| d| d        y)ro   r   z" contains z encoder index rr   N)rm   rv   )rJ   re   rl   rj   encoder_indexreasons         r2   _validate_encodersr      sH     (	2E.3 j*]F9[XeWffghijr1   c           	         	 t        |d       t        | |       t        | |       t        | |       t	        | |       y# t
        j                  $ ry}dj                  |j                  D cg c]  }t        |       nc c}w c}      }t        j                  j                  d| ||j                         t        d       Y d}~yd}~ww xY w)z>Perform various validation on the provided info.json data
    zqmk.api.keyboard.v1rr   zInvalid API data: %s: %s: %sr#   N)r   r~   r   r   r   
jsonschemaValidationErrorjoinabsolute_pathstrr   logerrormessager   )rJ   re   ep	json_paths        r2   	_validater      s    12 	x3(I.8Y/8Y/%% HHaoo>c!f>>?	4h	199U1s"   <? CC+A>
=ACCc                    t        |       t        |       i i g g dd}t        |       \  }}|r||d<   |j                         D ])  \  }}|j                  d      rd|d<   d|d<   ||d	   |<   + t	        | |      }t        |      }t        |t        t        |                   }t        |t        t        |                   }t        |      }t        |      }t        |      }t        |t        |             }|j                  d
g       }||v r|g|d
<   t        t         j"                  j                  d      d      st%        | |       t'        |       |S )z9Generate the info.json data for a specific keyboard.
    qmk)keyboard_namekeyboard_folderkeymapsr_   parse_errorsparse_warnings
maintainerr   	LAYOUT_kcTr   Fr   r_   r   SKIP_SCHEMA_VALIDATION)r   _search_keyboard_hrb   
startswithmerge_info_jsons_process_defaults_extract_rules_mkr   _extract_config_hr   _matrix_size_joystick_axis_count_matrix_masked_extract_led_configrW   r   osenvironr   _check_matrix)rJ   force_layoutre   r_   r   rj   layout_jsonr   s           r2   	info_jsonr      sd    Xx=I *(3GW&-	"#$+MMO < [%%k2%)K	").K&0;Ii -	< !95I!),I!)Xc(m-DEI!)Xc(m-DEI Y'I$Y/Iy)I $Is8}=I "&92>((*6	%& "**..!9:EB(I& )r1   c                    |j                         D ]  \  }}|j                  d      sdj                  |j                  d      dd       j	                         }|j	                         t
        v rdn|j	                         t        v rdn|}|dv rd| vri | d<   d	| vri | d	<   || d	   v rt        | d
|d| d	   d|d       || d	   |<   || d   |<    | S )/Find all the features enabled in rules.mk.
    _ENABLE_NTF)ltoconfig_h_featuresfeatureszFeature z! is specified in both info.json (z) and rules.mk (z). The rules.mk value wins.)rb   endswithr   rH   lowertrue_valuesfalse_valuesrx   )re   rulesrX   values       r2   _extract_featuresr      s    kkm 8
U<<	"((399S>#2./557C!KKM[8Du{{}XdGdejoEg~")313	-.*(*	*%i
++Y  IL  NW  Xb  Nc  ej  )k  l).Ij!#&27I)*3/%8( r1   c                     |j                  dd      dk7  r:d| v rd| d   v rt        | d       d| vri | d<   |d   dk(  r
d| d   d<   | S d| d   d<   | S )	r   CUSTOM_MATRIXr   matrix_pinscustomzSCustom Matrix is specified in both info.json and rules.mk, the rules.mk values win.liteTcustom_lite)rW   rx   re   r   s     r2   _extract_matrix_rulesr   ;  s     yy$'4/I%(i6N*N$yz	)')Im$!V+6:Im$]3  26Im$X.r1   c                 n    | j                         } | sy| j                         rt        |       S | dk(  ry| S )z1Returns the proper representation for a pin.
    NNO_PIN)stripisdigitint)pins    r2   	_pin_namer   M  s6     ))+C	3x	Jr1   c                 \    | j                  d      D cg c]  }t        |       c}S c c}w )zBReturns a list of pins from a comma separated string of pins.
    ,)rH   r   )pinsr   s     r2   _extract_pinsr   ^  s$     '+jjo6sIcN666s   )c                 0   g }| d   dk7  r| dd } | d   dk7  r| j                  d      D ]i  }|j                  d      r|dd }|j                  d      r|dd }|j                  g        |j                  d      D ]  }|d   j                  |        k |S )z!Return a 2d array of strings
    r   }Nz},{{r#   r   )rH   r   r   rc   )raw	out_arrayr   vals       r2   _extract_2d_arrayr   d  s     I
b'S.#2h b'S. yy 
&>>#ab'C<<cr(C99S> 	&CbM  %	&
& r1   c           	      p    t        |       }|D cg c]  }t        t        t        |             c}S c c}w )zReturn a 2d array of ints
    )r   r   r   r   )r   ri   rU   s      r2   _extract_2d_int_arrayr  {  s-     C
 C'*+!DS!+++s    3c                     t        |       }t        t        |            D ]2  }t        t        ||               D ]  }||   |   dk(  sd||   |<    4 |S )zextract direct_matrix
    r   N)r   rangera   )direct_pinsdirect_pin_arrayijs       r2   _extract_direct_matrixr	    sr     )53'() .s+A./0 	.A"1%1)- #A&	..
 r1   c                 v    g }dD ](  }|j                  | d      s|j                  |       * |rd|i| d<   yy)z0Populate data about the audio configuration
    )B5B6B7C4C5C6_AUDIOr   audioN)rW   rc   )re   config_c
audio_pinsr   s       r2   _extract_audior    sQ     J1 #<<3%v'c"# $j1	' r1   c                    | j                  d| d      j                  dd      dd }| j                  d| d      j                  dd      dd }| j                  d| d      j                  dd      dd }| j                  dd	      }|r|rt        t        d	|j	                  d
                  }t        t        d	|j	                  d
                  }t        t        d	|j	                  d
                  }|r||gt        |      t        |      z
  z  z  }g }t        t        |            D ]=  }||   ||   d}|t        |      k  rt        ||         |d<   |j                  |       ? |S y	y	)z$Common encoder extraction logic
    ENCODER_A_PINSr=    r#   r   ENCODER_B_PINSENCODER_RESOLUTIONSENCODER_RESOLUTIONNr   )pin_apin_b
resolution)	rW   replacer   filterrH   ra   r  r   rc   )	r  postfixa_padb_padresolutionsdefault_resolutionencodersr   r[   s	            r2   _extract_encoders_valuesr'    s~    LL>'3R8@@bI!BOELL>'3R8@@bI!BOE,,!4WI>CKKCQSTUVWYZK!&:DAVD%++c"234VD%++c"2346$(9(9#(>?@./3u:K@P3PQQK3u:& 	%E %euU|DGs;''(+K,>(?%OOG$		%  ur1   c                     t        |      }|r1d| vri | d<   d| d   v rt        | d|d| d   d   d       || d   d<   | j                  di       j                  dd      rd| vri | d<   d| d   d	<   y
y
)z%Populate data about encoder pins
    r[   r\   z.Encoder config is specified in both config.h (z) and info.json (z). The config.h value wins.r   FTr]   N)r'  rx   rW   re   r  r&  s      r2   _extract_encodersr*    s     (1HI%#%Ii y++  IQ  S\  ]f  Sg  hp  Sq  %r  s)1	)X& }}Z$((E:I%#%Ii *.	)Y' ;r1   c                     t        |d      }|rdd| vri | d<   d| d   vri | d   d<   d| d   d   vri | d   d   d<   d| d   d   d   v rt        | d| d   d   d   d   z         || d   d   d   d<   yy)z+Populate data about split encoder pins
    _RIGHTrH   r[   r^   r\   zqEncoder config is specified in both config.h and info.json (encoder.rotary) (Value: %s), the config.h value wins.N)r'  rx   r)  s      r2   _extract_split_encodersr-    s     ((;H)#!#IgIg..,.Igy))G,Y7757Igy)'2y))4W==  %X  [d  el  [m  nw  [x  y@  [A  BJ  [K  %K  L;C	'9%g.x8 r1   c                     |j                  dd      j                  dd      dd }|r9t        |      }d| vri | d<   d| d   v rt        | d| d   d   z         || d   d<   y	y	)
z3Populate data about the secure unlock sequence
    SECURE_UNLOCK_SEQUENCEr=   r  r#   r   secureunlock_sequencezSecure unlock sequence is specified in both config.h (SECURE_UNLOCK_SEQUENCE) and info.json (secure.unlock_sequence) (Value: %s), the config.h value wins.N)rW   r  r  rx   )re   r  unlockunlock_arrays       r2   _extract_secure_unlockr4    s     \\2B7??RH2NF,V49$"$Ih	( 33  %A  DM  NV  DW  Xi  Dj  %j  k1=	(-. r1   c                     | j                  di       }d|v r-|j                  di       |d<   |j                  d      |d   d<   y y )NrH   matrix_grid
handednessrW   popre   r  rH   s      r2   _extract_split_handednessr;    sL    MM'2&E#iib9l-2YY}-ElM* r1   c                     | j                  di       }d|v r,|j                  di       |d<   |j                  d      |d   d<   d|v r-|j                  di       |d<   |j                  d      |d   d<   y y )NrH   soft_serial_pinserialr   soft_serial_speedspeedr8  r:  s      r2   _extract_split_serialrA    s    MM'2&EE!))Hb1h!&+<!=he#))Hb1h#(99-@#Ah  $r1   c                 8   |j                  d      du rCd| vri | d<   d| d   vri | d   d<   d| d   d   v rt        | d| d   d   z         d| d   d   d<   nAd| j                  di       v r-d| vri | d<   d| d   vri | d   d<   d| d   d   vrd	| d   d   d<   | j                  di       j                  di       }d
|v r,|j                  di       |d<   |j                  d
      |d   d<   d|v r-|j                  di       |d<   |j                  d      |d   d<   y y )NUSE_I2CTrH   	transportprotocolzSplit transport is specified in both config.h (USE_I2C) and info.json (split.transport.protocol) (Value: %s), the config.h value wins.i2cr]   r>  sync_matrix_statesyncmatrix_statesync_modifiers	modifiers)rW   rx   r9  )re   r  rD  s      r2   _extract_split_transportrL    s   ||I$&)#!#Igi00.0Ig{+7+K88  %m  py  zA  pB  CN  pO  %O  P6;	';'
3 
immGR0	0)#!#Igi00.0Ig{+Yw/<<:BIg{+J7 gr*..{B?Ii'%MM&"5	&,5MM:M,N	&.)9$%MM&"5	&)27G)H	&+& %r1   c                    |j                  dd      j                  dd      j                  dd      j                         }|j                  dd      j                  dd      j                  dd      j                         }|j                  dd      j                  dd      dd	 }|s|s|r| j                  d
i       j                  di       j                  dd       rt        | d       d
| vri | d
<   d| d
   vri | d
   d<   d| d
   d   vri | d
   d   d<   |rt	        |      | d
   d   d   d<   |rt	        |      | d
   d   d   d<   |rt        |      | d
   d   d   d<   y y y )NMATRIX_ROW_PINS_RIGHTr=   r   r   MATRIX_COL_PINS_RIGHTDIRECT_PINS_RIGHTr  r#   r   rH   r   r^   z\Right hand matrix data is specified in both info.json and config.h, the config.h values win.r   r   direct)rW   r  r   rx   r   r	  re   r  row_pinscol_pinsr  s        r2   _extract_split_right_pinsrU  $  s   ||3R8@@bIQQRUWYZ``bH||3R8@@bIQQRUWYZ``bH,,2B7??RH2NK8{=="%))-<@@$O  %C  D)#!#Ig	' 2202Ig}-)G,];;9;Ig}-g6ANxAXIg}-g6v>ANxAXIg}-g6v>CYZeCfIg}-g6x@ '  +r1   c                    |j                  dd      j                  dd      j                  dd      j                         }|j                  dd      j                  dd      j                  dd      j                         }|j                  dd      j                  dd      dd	 }d
|v rNd|v rJd| v rt        | d       t	        |j                  dd            t	        |j                  d
d            d| d<   |rK|rId| v rd| d   v rd| d   v rt        | d       d| vri | d<   t        |      | d   d<   t        |      | d   d<   |r1d| v rd| d   v rt        | d       d| vri | d<   t        |      | d   d<   | S )z%Populate the matrix information.
    MATRIX_ROW_PINSr=   r   r   MATRIX_COL_PINSDIRECT_PINSr  r#   r   MATRIX_ROWSMATRIX_COLSr   zQMatrix size is specified in both info.json and config.h, the config.h values win.r   )r   r   r   r   r   zRMatrix pins are specified in both info.json and config.h, the config.h values win.rQ  zRDirect pins are specified in both info.json and config.h, the config.h values win.)rW   r  r   rx   r   r   r	  rR  s        r2   _extract_matrix_infor\  A  s    ||-r2::3CKKCQSTZZ\H||-r2::3CKKCQSTZZ\H,,}b199#rB1RHK ]h%>I%$wx HLL<=HLL<=$
	- 
 HI%&Im4L*LQW[der[sQs$xy	)')Im$+8+B	- (+8+B	- (I%(i6N*N$xy	)')Im$-CK-P	- *r1   c                 ^   | j                  d      r| j                  d      dkD  rt        d|  d      d| v r| j                  dd      \  } }nd}|j	                  dd      j	                  d	d      j                         }|d
k(  r(t        t        t        |j                  d                  S t        t        t        j
                  |j                  d                  S | dv rt        |t              r|S |t        v S | dk(  rd|dd j                         z   S | dk(  r|j                         S | d
k(  rt        |      S | dk(  r1|j                  d      j	                  dd      j	                  dd      S | dk(  r4t        |dd       }t        |d         }t        |d         }| d| d| S |S )z$Convert config value using spec
    arrayrr   r#   zConversion of z not possibleNr   r=   r   r   r   )boolflaghex0xr$   r   r   "z\"z\\\bcd_versionr%      )r   count	ExceptionrH   r  r   r   r   r   r   
isinstancer_  r   upper)key_typeconfig_value
array_typemajorminorrevisions         r2   _config_to_jsonrq  g  s    7#>>#"nXJmDEE(?#+>>#q#9 HjJ#++C4<<S"EKKMC!3!3C!89::CII|'9'9#'>?@@	%	%lD){**	U	l12&,,...	V	!!##	U	<  	U	!!#&..uc:BB64PP	]	"L1%&LO$|A'%(,,r1   c           
         t        |       }t        t        d            }|j                         D ]   \  }}|d   }|j	                  dd      }	 |j	                  d      }||v r6|j	                  dd      r$|rt        | |d|       nJt        | d	|z         n:||v r6|j	                  d
d      r$|rt        | |d|d       nt        | d|z         ||v rY|j	                  dd      rG|j	                  |      r$|j	                  dd      rt        | |d|d       t        |||         ||<    | j                  |       t        | |       t        | |       t        | |       t        | |       t        | |       t        | |       t!        | |       t#        | |       t%        | |       | S # t        $ r}	t        | | d| d|	        Y d}	~	d}	~	ww xY w)z@Pull some keyboard information from existing config.h files
    zdata/mappings/info_config.hjsoninfo_key
value_typer   replace_withinvalidFzE in config.h is no longer a valid option and should be replaced with z@%s in config.h is no longer a valid option and should be removed
deprecatedz' in config.h is deprecated in favor of $ and will be removed at a later datez@%s in config.h is deprecated and will be removed at a later dateto_jsonTwarn_duplicatez in config.h is overwriting  in info.json->: N)r   r   r   rb   rW   rv   rx   rq  rh  updater\  r  r4  r;  rA  rL  rU  r*  r-  )
re   r  
dotty_infoinfo_config_map
config_key	info_dictrs  rk  ru  r   s
             r2   r   r     s    y!J%F GHO!0!6!6!8 F
IZ(==u5	F$==8LX%)--	5*Iy  zD  FR  +S  Ty*loy*yzx'IMM,,N   BL  NZ  -[  \ ,nq{,{|X%)--	4*H>>(+	>NPT0U _iks,tu'6x*AU'V
8$+F4 Z  H-9h'9h/i2)X.Y1i2i*Ix0!  	Fzl"XJb$DEE	Fs   C"F33	G<GGc                 0   t        t        d            }|j                         D ]n  }||   }|| v sd}|j                  | |   i       j	                         }|D ]  \  }}|| vs|| |<   |dz  } |dk(  sQt        |      dkD  s`t        | d|z         p | S )zNProcess any additional defaults based on currently discovered information
    zdata/mappings/defaults.hjsonr   r#   z[All defaults for '%s' were skipped, potential redundant config or misconfiguration detected)r   r   r   rW   rb   ra   rx   )re   defaults_mapdefault_type	thing_mapmerged_countthing_itemsrX   r   s           r2   r   r     s     T"@ABL$))+ Z .	9$L#--	,(?DJJLK) &
Ui'%*IcN A%L&
 q S%5%9Y  )H  LX  )Y  ZZ r1   c           
      8   |j                  d| j                  dd            | d<   | d   t        v rt        | |       nU| d   t        t        z   v rt        | |       n6t        j                  j                  | d   d| d          t        | |       t        |       }t        t        d            }|j                         D ]   \  }}|d   }|j                  dd	      }	 |j                  d
      }||v r6|j                  dd      r$|rt        | |d|       nJt        | d|z         n:||v r6|j                  dd      r$|rt        | |d|d       nt        | d|z         ||v rY|j                  dd      rG|j                  |      r$|j                  dd      rt        | |d|d       t!        |||         ||<    | j%                  |       t'        | |       t)        | |       | S # t"        $ r}	t        | | d| d|	        Y d}	~	Rd}	~	ww xY w)z@Pull some keyboard information from existing rules.mk files
    MCU	processor
atmega32u4r   z: Unknown MCU: zdata/mappings/info_rules.hjsonrs  rt  r   ru  rv  FzE in rules.mk is no longer a valid option and should be replaced with z@%s in rules.mk is no longer a valid option and should be removedrw  z' in rules.mk is deprecated in favor of rx  z@%s in rules.mk is deprecated and will be removed at a later datery  Trz  z in rules.mk is overwriting r{  r|  r}  N)rW   r	   arm_processor_rulesr
   r   avr_processor_rulesr   r   warningunknown_processor_rulesr   r   r   rb   rv   rx   rq  rh  r~  r   r   )
re   r   r  info_rules_map	rules_keyr  rs  rk  ru  r   s
             r2   r   r     s4    #YYuimmK.VWIk!33Iu-	;	?_#D	DIu- 	;L1MyYdOefg	51 y!Jt$DEFN . 4 4 6 E	9Z(==u5	E$==8LE!immIu&Ey  zC  EQ  +R  Sy*lox*xye#	lE(J   BK  MY  -Z  [ ,nqz,z{E!immIt&D>>(+	>NPT0U _hjr,st'6xyAQ'R
8$+E4 Z  i')U+  	EykH:Rs$CDD	Es   !C"G11	H:HHc                     t        |       } t        d      }g }| j                  D ]1  }||z  }|| dz  }|j                         s!|j                  |       3 |S )z Find all <keyboard>.c files
    
keyboards/z.c)r   partsrO   rc   )rJ   current_pathfiles	directorykeyboard_c_paths        r2   find_keyboard_cr    si     H~H%LE^^ *	#i/&I;b)99!!#LL)	* Lr1   c           
         dD ]4  }| j                  di       j                  |d      s|| v s+d| j                  |i       vr| j                  di       j                  d      }| j                  di       j                  d      }|r@|r>t        |      D ]/  }	 t        |||      }|r| j                  |i       | |<   || |   d<   1 nt	        | d       | |   j                  dd
      r,| |   j                  dd
      st        | |   d         | |   d<   | |   j                  dd
      s'| |   j                  dd
      r>t        j                  t        j                  h}t        j                  t        j                  z  t        j                  h}	t        d | |   d   D              }
t        |
      dkD  rVt               }|	D ](  t        fd|
D              s|j                         * t        |      dkD  r|j!                  |       t#        |D cg c]  }t%        |       c}d      | |   d<   7 | S # t        $ r'}t	        | d|j
                   d	|        Y d
}~d
}~ww xY wc c}w )z/Scan all <keyboard>.c files for led config
    )
rgb_matrix
led_matrixr   FrC   r   r   r   zled_config: r}  Nz6led_config: matrix size required to parse g_led_config	led_count
flag_stepsc              3   \   K   | ]$  }|j                  d t        j                         & yw)flagsN)rW   r!   r+   )rA   rU   s     r2   rD   z&_extract_led_config.<locals>.<genexpr>>  s     cquuWhmm<cs   *,r#   c              3   (   K   | ]	  }|z    y wr@   r0   )rA   r`  	candidates     r2   rD   z&_extract_led_config.<locals>.<genexpr>C  s     EDy4/Es   T)reverse)rW   r  r   rh  rx   ru   ra   r!   r*   r+   r,   r.   r-   rG   rI   rd   r~  sortedr   )re   rJ   featurer   r   fileri   r   r  default_flagskb_flagsunique_flagsr`  r  s                @r2   r   r      sl    0 'g==R(,,We<9@Ty}}Wb99 }}]B7;;FC }}]B7;;FCD / 9 UU"1$d"CC"5>]]7B5O	' 2?B	' 28 <U !,de!%%h5i>P>T>TU`bf>g25i6H6R2S	'";/!%%h5i>P>T>TUacg>h!x}}5!)!2!2X5F5F!FHZHZ [ ciPWFXYaFbccx=1$#&5L%2 8	EHEE(,,Y78
 <(1,\239QV:W3t9:Wae3f	'"<0O'gR 7  ) U(l499+RPQs4STTU2 ;Xs   ,H>I1
>	I.I))I.c                 \   d| vrd| v ri | d<   d| d   v r2t        | d   d   d         | d   d<   t        | d   d         | d   d<   n<d| d   v r5d| d   v r.t        | d   d         | d   d<   t        | d   d         | d   d<   d| v r%| d   j                  dd	      r| d   dxx   d
z  cc<   | S )z6Add info_data['matrix_size'] if it doesn't exist.
    r   r   rQ  r   r   r   rH   r]   Fr$   )ra   rW   )re   s    r2   r   r   O  s     I%-9*D#%	- y///29]3KH3UVW3X/YIm$V,/29]3KH3U/VIm$V,y//Fi>V4V/29]3KF3S/TIm$V,/29]3KF3S/TIm$V, i!%%i7-(0A50r1   c                     d| j                  di       v r5| d   d   j                         }|rt        d |D              dz   nd| d   d<   | S )z5Add info_data['joystick.axis_count'] if required
    axesjoystickc              3   F   K   | ]  }t        j                  |        y wr@   )r   r   )rA   as     r2   rD   z'_joystick_axis_count.<locals>.<genexpr>i  s     1\Q-2E2Ea2H1\s   !r#   r   
axis_count)rW   r   max)re   	axes_keyss     r2   r   r   d  s[     z2..j)&1668	dmc1\R[1\.\_`.`st	*l+r1   c                     d}d| j                  di       v rd}d| j                  di       j                  di       v rd}|r%d| j                  di       vrd| vri | d<   d| d   d<   | S )	z0"Add info_data['matrix_pins.masked'] if requiredFr6  
dip_switchTrH   r7  maskedr   rV   )re   mask_requireds     r2   r   r   n  s    M	lB77	gr266|RHH9==;;I-+-	-(15Im$X.r1   c                    d| v rd| v r| d   j                  dd      }| d   j                  dd      }dx}}d| d   v r&t        | d   d   d         }t        | d   d         }n@d| d   v r*d| d   v r#t        | d   d         }t        | d   d         }nd| d   vrd| d   vry||k7  r||dz  k7  rt        | d	| d
|        ||k7  r||dz  k7  rt        | d| d
|        yyyyy)zDCheck the matrix to ensure that row/column count is consistent.
    r   r   r   r   r   rQ  Nr$   z>MATRIX_COLS is inconsistent with the size of MATRIX_COL_PINS: z != z>MATRIX_ROWS is inconsistent with the size of MATRIX_ROW_PINS: r   )re   actual_col_countactual_row_count	col_count	row_counts        r2   r   r     sy    	!my&@$]377B$]377B !!	Iy//Im4X>qABIIm4X>?Iy//Fi>V4VIm4V<=IIm4V<=I9]33iP]F^8^((Y;Ka;O-Py$bclbmmq  sC  rD  #E  F((Y;Ka;O-Py$bclbmmq  sC  rD  #E  F .Q(' 'A!r1   c                 "   t        |       } t        d      }i }i }| j                  D ]c  }||z  }|d}||z  }|j                         s#t        |      \  }}|j	                  |       |j                         D ]  \  }	}
|
|v s|
||	<    e ||fS )Nr  z.h)r   r  rO   r   r~  rb   )rJ   r  r   r_   r  
keyboard_hkeyboard_h_pathnew_layoutsnew_aliasesalias
alias_texts              r2   r   r     s    H~H%LGG^^ 
0	#i/(*
&3!!#'3O'D$KNN;'%0%6%6%8 0!z(%/GEN0
0 Gr1   c                     | d   j                  |       t        j                  j                  d| j	                  dd      |       y)z4Send an error message to both JSON and the log.
    r   %s: %sr   Unknown Keyboard!N)rc   r   r   r   rW   re   r   s     r2   rv   rv     s9     n$$W-GGMM(IMM*;=PQSZ[r1   c                     | d   j                  |       t        j                  j                  d| j	                  dd      |       y)z5Send a warning message to both JSON and the log.
    r   r  r   r  N)rc   r   r   r  rW   r  s     r2   rx   rx     s:     &&w/GGOOHimm,=?RSU\]r1   c                 X    d| d<   d| d<   d| d<   d| d   v rd| d	<   | S d
|v r|d
   | d	<   | S )z-Setup the default info for an ARM board.
    armprocessor_typeChibiOSrE  chibiosplatform_keySTM32r  platform
MCU_SERIESr0   r   s     r2   r  r    sa     #(I%Ij )In)K(( '	*  
	 %l 3	*r1   c                 Z    d| d<   d|v r|d   nd| d<   d| d<   | d   t         v rdnd	| d
<   | S )z-Setup the default info for an AVR board.
    avrr  ARCHunknownr  r  r  zV-USBLUFArE  )r   r   s     r2   r  r    sP     #(I-3u_E&M)Ij %In'0'='PGV\Ij
 r1   c                 8    d| d<   d| d<   d| d<   d| d<   d| d<   | S )z8Setup the default keyboard info for unknown boards.
    r  
bootloaderr  r  r  rE  r0   r   s     r2   r  r    s=     (Il%Ij&Ik"+I%Ijr1   c                    t        |       }|D ]  }t        |      }t        |t              st	        |dt        |      d       9t        t        j                  j                  d      d      s	 t        |d       d
|v ri |j                  d
i       |d
   |d
<   |d
= |j                  di       j'                         D ]  \  }}	||j                  d
i       v r t)        |d| d|d
   |           |d
   |   }||d   v rt+        |d   |   d         t+        |	d         k7  r3d}
t	        ||
|t+        |	d         t+        |d   |   d         fz         d|d   |   d<   t-        |	d   |d   |   d         D ]  \  }}|j/                  |        t1        d |	d   D              st	        |d| d       d|	d<   d|	d<   |	|d   |<    d|v r|d= t3        ||        |S # t        j                  $ r}dj                  |j                  D cg c]  }t        |       nc c}w c}      }t        j                   j#                  d|       t        j                   j#                  d||j$                         Y d	}~vd	}~ww xY w)zDReturn a merged copy of all the info.json files for a keyboard.
    zInvalid file z%, root object should be a dictionary.r   Fzqmk.keyboard.v1rr   z Not including data from file: %sz	%s: %sNr   r_   zinfo.json uses alias name z instead of rC   zWNumber of keys for %s does not match! info.json specifies %d keys, C macro specifies %dTr   c              3   @   K   | ]  }d |j                         v   yw)r   N)r   )rA   r   s     r2   rD   z#merge_info_jsons.<locals>.<genexpr>  s     X88x}}6Xs   r   zE" has no "matrix" definition in either "info.json" or "<keyboard>.h"!r   )rt   r   ri  dictrv   r   r   r   r   rW   r   r   r   r   r   r   r   r   r   rb   rx   ra   zipr~  r   r   )rJ   re   rz   r|   new_info_datar   r   r   rj   rC   msgnew_keyexisting_keys                r2   r   r     s    "(+L! /.	!),-.y\_`i\j"lmbjjnn%=>F(9: },*tY]];KR-P*tTabrTs*tI&'./#0#4#4Y#C#I#I#K 	?Kimm,<bAAY*D[MQ]^ghx^y  {F  _G  ^H  )I  J'(89+Fi	22y+K8BCs6RZK[G\\sCy#c&BR>SUXYbclYmnyYz  |D  ZE  VF  1G  +G  HGKIi(5mD14VH5EyQZG[\gGhiqGr1s 5-$++G45 XvhGWXXyH[M  BG  +H  I(-F9%,0F=)8>Ii(5'	?, %i(I}-_/.b M -- HHaoo%Fc!f%F%FG	@)Lj)QYY?	s%   1G((J	;JH'&AJJ	c                 0   t        d      }|| z  }|j                  }|dz  |dz  g}t        d      D ]=  }||k(  r n6|j                  |dz         |j                  |dz         |j                  }? |D cg c]  }|j	                         s| c}S c c}w )z>Finds all the info.json files associated with a keyboard.
    rp   rs   rq   rf  )r   rw   r  rc   rO   )rJ   	base_pathkeyboard_pathkeyboard_parent
info_jsonsr   r   s          r2   rt   rt   !  s     [!I(M#**O+-}/NOJ 1X 1i'/K78/O;<)001 (2H)Y5E5E5GIHHHs   6BBc                 x    ddl m}  || ||      j                  }t        |dz        }|j	                  di       S )z Extract keymap level config
    r   locate_keymapr   keymap.jsonconfig)
qmk.keymapr  rw   r   rW   )rJ   keymapr   r  keymap_folderkm_info_jsons         r2   keymap_json_configr  6  s=     )!(FNUUM*==+HILHb))r1   c                     ddl m}  || ||      j                  }|dz  }|dz  }|dz  }t        | |      }|j	                         rt        | ||      ni }	t        ||	       t        |t        |             t        |t        |             |S )z7Generate the info.json data for a specific keymap.
    r   r  r  zconfig.hzrules.mkr  )r  r  rw   r   rO   r  r   r   r   r   r   )
rJ   r  r   r  r  keymap_configkeymap_ruleskeymap_filekb_info_jsonr  s
             r2   keymap_jsonr  B  s     )!(FNUUM "J.M :-L-/K XLAL WbVhVhVj%h\RprLl+ l$7$EFl$7$FGr1   c                     g }t        |       }|j                  |j                  dg              |r.t        |      }|r!|j                  |j                  dg              t	        t
        j                  |            S )z+Get the modules for a keyboard/keymap.
    modules)r   extendrW   r   r   r  fromkeys)rJ   keymap_filenamer  r  r  s        r2   get_modulesr  ]  sg     GX&LNN<##Ir23-o>NN;??9b9:g&''r1   r@   )r=   )Z__doc__rE   r   pathlibr   r   
dotty_dictr   enumr   milcr   qmk.constantsr   r   r	   r
   r   r   qmk.c_parser   r   r   qmk.json_schemar   r   r   qmk.keyboardr   r   qmk.commandsr   qmk.makefiler   qmk.math_opsr   qmk.utilr   r   r   r   r!   rM   rQ   rY   rm   r~   r   r   r   r   r   r   r   r   r   r   r  r	  r  r'  r*  r-  r4  r;  rA  rL  rU  r\  rq  r   r   r   r  r   r   r   r   r   r   rv   rx   r  r  r  r   rt   r  r  r  r0   r1   r2   <module>r
     s_   	 	      w w J J < < + 0 ,   ' !w B27]
8K4D{NXj&4n6$"7.,

24/(D(>FB IFg:#L+\.b(3l ,^*&F6*\^	6rI*	*6(r1   