a
    ū#¢j1h  ć                   @   s\  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZmZmZmZmZ d dlZd dlZd dlZejd  dkrdd Ze e”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d Z'dd Z(d8dd Z)d!d" Z*d#d$ Z+d%d& Z,d9d(d)Z-d*d+ Z.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4dS ):é    )ŚExtensionObjectŚNodeIdŚ
StatusCodeŚDiagnosticInfoŚValue)ŚReferenceTypeNodeŚ
ObjectNodeŚVariableNodeŚVariableTypeNodeŚ
MethodNodeŚObjectTypeNodeŚDataTypeNodeŚViewNode)ŚmakeCIdentifierŚgenerateLocalizedTextCodeŚgenerateQualifiedNameCodeŚgenerateNodeIdCodeŚgenerateExpandedNodeIdCodeŚgenerateNodeValueCodeNé   c                 C   s   | S )N© )Śsr   r   śq/mnt/data/dev_pub/qqyu/v2.12.x/application/opensource/open62541/tools/nodeset_compiler/backend_open62541_nodes.pyŚunicode   s    r   c                 C   sB   t | jtr$| jjd t| j }n| jjd }t dd| ” ”S )NŚ_Z_unknown_nidz[^0-9a-z_]+)	Ś
isinstanceŚidr   Ś	__class__Ś__name__ŚstrŚreŚsubŚlower)ŚnodeZCodePrintabler   r   r   ŚgenerateNodeIdPrintable#   s    r$   c                 C   s"   t |d t| j d t| S )Nr   )r$   r   Śalias)r#   ŚparentZ
arrayIndexr   r   r   ŚgenerateNodeValueInstanceName+   s    r'   c                 C   sN   g }| j rdnd}| dt| jt| jt| j|f ” | d” d |”S )NŚtrueŚfalsez9retVal |= UA_Server_addReference(server, %s, %s, %s, %s);ś0if (retVal != UA_STATUSCODE_GOOD) return retVal;Ś
)Ś	isForwardŚappendr   ŚsourceŚreferenceTyper   ŚtargetŚjoin)Z	referenceŚcodeZforwardFlagr   r   r   ŚgenerateReferenceCode.   s    ż’
r3   c                 C   sL   g }|  d” | jr|  d” | jr.|  d” | jdkrH|  d| j ” |S )NzEUA_ReferenceTypeAttributes attr = UA_ReferenceTypeAttributes_default;śattr.isAbstract = true;zattr.symmetric  = true;Ś z/attr.inverseName  = UA_LOCALIZEDTEXT("", "%s");)r-   Ś
isAbstractŚ	symmetricŚinverseName©r#   r2   r   r   r   ŚgenerateReferenceTypeNodeCode9   s    



’r:   c                 C   s   g }|  d” | jrd}d}| jd@ r2|d7 }d}| jd@ rT|sH|d7 }|d	7 }d}| jd
@ rv|sj|d7 }|d7 }d}|d7 }|  |” |S )Nz7UA_ObjectAttributes attr = UA_ObjectAttributes_default;zattr.eventNotifier = Té   Z#UA_EVENTNOTIFIER_SUBSCRIBE_TO_EVENTFé   z | ZUA_EVENTNOTIFIER_HISTORY_READé   ZUA_EVENTNOTIFIER_HISTORY_WRITEś;)r-   ŚeventNotifier)r#   r2   Z	code_partZis_firstr   r   r   ŚgenerateObjectNodeCodeE   s*    




r@   c                 C   sö   t | ts(t | ts(td t| j”| jd ur6d S | jtdkr\| jd u rXtd| _d S t | tr“t | ts“| 	| ”}|d u r td| j
j d t| j t|| |j| _n>| jd u rÜtd| j
j d t| j t| j| | jj| _d S )NzGNode {}: DataType can only be set for VariableNode and VariableTypeNodeś	ns=0;i=62z	ns=0;i=24ś6Cannot get node for HasTypeDefinition of VariableNode ś zParent node not defined for )r   r	   r
   ŚRuntimeErrorŚformatr   r   ŚdataTyper   ŚgetNodeTypeDefinitionŚ
browseNameŚnameŚsetNodeDatatypeRecursiver&   ©r#   ŚnodesetZtypeDefNoder   r   r   rJ   \   s$    






rJ   c                 C   sZ  t | ts(t | ts(td t| j”| jd ur6d S | jtdkrX| jd u rTd| _d S t | trüt | tsü| 	| ”}|d u rtd| j
j d t| j t |tsČtd t| j| j
jt|j”t|| |jd urę|j| _ntd t| j”nZ| jd u rtd t| j”t| j| | jjd urB| jj| _ntd t| j”d S )	NzHNode {}: ValueRank can only be set for VariableNode and VariableTypeNoderA   éž’’’rB   rC   zKNode {} ({}) has an invalid type definition. {} is not a VariableType node.z2Node {}: the ValueRank of the parent node is None.zJNode {}: does not have a parent. Probably the parent node was blacklisted?)r   r	   r
   rD   rE   r   r   Ś	valueRankr   rG   rH   rI   ŚsetNodeValueRankRecursiver&   rK   r   r   r   rO   |   s4    



’


rO   c              	   C   s  g }g }g }| j d u r*t| | | d” | d| j  ” | j dkrŅ| d| j  ” | d | j ”” t| j| j kr¦t| jD ]"\}}| d |tt|”” qn"t	d| j D ]}| d |”” q²| d” | j
d u ršt| | | d	” | | | j
””}|d u r8td
t| j
 d | jj d t| j | dt| j
 ” | ” r>| jd urt| j|j| j |\}	}
}||	7 }||
7 }||7 }| j d ur| j dkrt| j| j krt| jjdkrd}d}| jD ]*}tt|}|dkr|| }nd}qą|dkrt| jj|kr| d” | d” nB| jd ur| d” t d|jj d | jj d t| j ” |||gS )Nz/* Value rank inherited */zattr.valueRank = %d;r   zattr.arrayDimensionsSize = %d;zUA_UInt32 arrayDimensions[{}];zarrayDimensions[{}] = {};zarrayDimensions[{}] = 0;z+attr.arrayDimensions = &arrayDimensions[0];z/* DataType inherited */z'Cannot get BaseDataType for dataType : z	 of node rC   zattr.dataType = %s;r;   FTz:attr.value.arrayDimensionsSize = attr.arrayDimensionsSize;z2attr.value.arrayDimensions = attr.arrayDimensions;z/* Cannot encode the value */zCannot encode dataTypeNode: z for value of node )rN   rO   r-   rE   ŚlenŚarrayDimensionsŚ	enumerateŚintr   ŚrangerF   rJ   ŚgetBaseDataTypeŚgetDataTypeNoderD   rH   rI   r   r   ŚisEncodableŚvalueŚgenerateValueCodeŚnodesr   ŚloggerŚwarn)r#   rL   r2   ŚcodeCleanupŚ
codeGlobalŚidxŚvZdimŚdataTypeNodeŚcode1ŚcodeCleanup1ŚcodeGlobal1ZnumElementsZhasZeror   r   r   ŚgenerateCommonVariableCode©   sX    








,
<




,re   c                 C   s   g }g }g }|  d” | jr&|  d” |  d| j ” |  d| j ” |  d| j ” t| |\}}}||7 }||7 }||7 }|||gS )Nz;UA_VariableAttributes attr = UA_VariableAttributes_default;zattr.historizing = true;z"attr.minimumSamplingInterval = %f;zattr.userAccessLevel = %d;zattr.accessLevel = %d;)r-   ŚhistorizingŚminimumSamplingIntervalŚuserAccessLevelŚaccessLevelre   ©r#   rL   r2   r]   r^   rb   rc   rd   r   r   r   ŚgenerateVariableNodeCodeė   s    

rk   c                 C   sX   g }g }g }|  d” | jr&|  d” t| |\}}}||7 }||7 }||7 }|||gS )NzCUA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;r4   )r-   r6   re   rj   r   r   r   ŚgenerateVariableTypeNodeCodeü   s    

rl   c                 C   s   | d   ” | dd   S )Nr   r;   )r"   )ZinputStringr   r   r   ŚlowerFirstChar
  s    rm   Fc                 C   sL  dg}dg}t  dt|j ” t  dt| j ” | |j”}| |j”jj}	|j	d urn|j	j
d urn|j	j
}	t|	}
|
dkrd}
d|
 }|d u røt| |d}| d| d	 | d
 ” | |j”j}|d | d |	 ”  d }| dj|rņdnd||d” | j
}|d krg }t|D ]\}}|d u r4q| j| j}| j| }tt|}|r`dnd}t|trÄt|dkrqt  d” tt|}d|d jj }t|}| d| d	 | d | d t|” ” | |d jj”j}|d | d |d jj ”  d }| dj|d | |d” t|D ]@\}}| t|d | d t| d |||d |dd” q8| || | d t|” ” | || | d | d | d ” qt  d| d t|j d t| ” | ” s|| | }| t|||||d||d ” q|sD| d!| d" | d# ” ||gS )$Nr5   zBuilding extensionObject for z	Encoding ŚNumericRangeŚStringŚUA_r   zUA_STACKARRAY(ś, z, 1);ś[r   ś]z1UA_init({ref}{instanceName}, &{typeArrayString});ś&)ŚrefŚinstanceNameŚtypeArrayStringŚ.z->zExtensionObject contains arrayz, {0});z,UA_init({instanceName}, &{typeArrayString});)rv   rw   Z_gehtNed_memberF©Ś
asIndirectzSize = {0};z = r>   zEncoding of field z is zdefined by )rz   rL   ŚencRuleś"UA_Variant_setScalar(&attr.value, z, &ś);)r[   Śdebugr   r   ŚencodingRulerV   rF   rH   rI   ŚsymbolicNamerX   r   r'   r-   Ś
typesArrayŚupperrE   rR   rm   r   ŚlistrP   Śinfor   r   r   ŚisNone)r#   r&   rL   Śglobal_var_coderv   ŚisArrayElementr2   r]   ZparentDataTypeZparentDataTypeNameZtypeBrowseNodeZ
typeStringŚtypeArrrw   Śvaluesr_   ZsubvZencFieldr{   Z
memberNameZaccessorZencTypeStringZinstanceNameSafeZ
encTypeArrZencTypeArrayStringZsubArrayIdxŚvalŚ	valueNamer   r   r   Ś"generateExtensionObjectSubtypeCode  sx    ž



,$’ ’ &(
’r   c                 C   s   t | jj}|dkrd}|S )Nrn   ro   )r   rH   rI   )ra   ZtypeBrowseNamer   r   r   ŚgetTypeBrowseNameZ  s    r   c                 C   sT   |   |jj”}|d u s|jr"d}n|j}t|jj ” }d| d | d | d S )NŚUA_TYPESrt   rr   r   rs   )ŚgetNodeByBrowseNamer   r   Ś
isInternalr   r   r   )rL   rX   ZtypeNoder   ŚtypeNamer   r   r   ŚgetTypesArrayForValuec  s    r   c                 C   s@   |j d uo>|j dko>|j dkp>t| jdko>|j dkp>|j dkS )Né’’’’r   r;   rM   éż’’’)rN   rP   rX   )r#   Ś
parentNoder   r   r   ŚisArrayVariableNodem  s    žr   Tc              
   C   sų  g }g }g }t |d }t| jdkr.g d¢S t| jd tsFg d¢S | |j”}t| |r"t| jd trt	 
dt|j ” qīt| jd tr®t	 
dt|j ” qīt| jd trT| dt| d | d tt| j d	 ” t| jD ]V\}	}
t	 d
t|	 ” |d t|	 d }t|
||||dd\}}|| }|| }qśn~| d| jd jj d | d tt| j d	 ” t| jD ]<\}	}
t|
||	}| t|d t|	 d |
|||” q| d| d tt| j d d |j d |j d t| ”  d ” nĢt| jd trLt	 
dt|j ” n¢t| jd trvt	 
dt|j ” nxt| jd tr“t| jd |||dd\}}|| }|| }t| jd |d}| jd  ” sīt| jd tsī| d| jd jj d | d | jd jj d ” | d| d ” | d| jd jj d | d ” | td| | jd |||dd ” | d!| d t|| jd  d ” | jd jjd"krŅ| d# |”” | d$ |”” | d% | jd jj|”” |||gS )&NZ_variant_DataContentsr   )r5   r5   r5   z8Don't know how to print array of DiagnosticInfo in node z4Don't know how to print array of StatusCode in node rp   rC   rr   z];zBuilding extObj array index rs   T)r&   rL   r   rv   r   z"UA_Variant_setArray(&attr.value, &z, (UA_Int32) rq   rt   r   z]);z6Don't know how to print scalar DiagnosticInfo in node z2Don't know how to print scalar StatusCode in node F)r&   rL   r   r   z *z =  UA_z_new();zif (!z&) return UA_STATUSCODE_BADOUTOFMEMORY;z_init(r}   Ś*ry   r|   Ś
ByteStringz{}->data = NULL;z{}->length = 0;zUA_{0}_delete({1});)r$   rP   rX   r   r   rV   rF   r   r   r[   r\   r   r   r   r   r-   r   rR   r~   r   r   r   r'   r   r   r   r   r   rE   )r#   r   rL   Zbootstrappingr2   r]   r^   r   ra   r_   r`   rv   rb   rc   r   r   r   rY   r  s¬    0ž
6’

’’’’žžžž
žž
’
"$’’$$
’’’’rY   c                 C   s2   g }|  d” | jr|  d” | jr.|  d” |S )Nz7UA_MethodAttributes attr = UA_MethodAttributes_default;zattr.executable = true;zattr.userExecutable = true;)r-   Ś
executableŚuserExecutabler9   r   r   r   ŚgenerateMethodNodeCodeÄ  s    


r   c                 C   s"   g }|  d” | jr|  d” |S )Nz?UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;r4   ©r-   r6   r9   r   r   r   ŚgenerateObjectTypeNodeCodeĶ  s
    

r   c                 C   s"   g }|  d” | jr|  d” |S )Nz;UA_DataTypeAttributes attr = UA_DataTypeAttributes_default;r4   r   r9   r   r   r   ŚgenerateDataTypeNodeCodeŌ  s
    

r   c                 C   s6   g }|  d” | jr|  d” |  dt| j ” |S )Nz3UA_ViewAttributes attr = UA_ViewAttributes_default;zattr.containsNoLoops = true;z!attr.eventNotifier = (UA_Byte)%s;)r-   ŚcontainsNoLoopsr   r?   r9   r   r   r   ŚgenerateViewNodeCodeŪ  s    

r    c                 C   s*   | j D ]}|jjdkrt|j  S qdS )Né-   ZUA_NODEID_NULL)ZinverseReferencesr/   Śir   r0   )r#   ru   r   r   r   ŚgenerateSubtypeOfDefinitionCodeć  s    
r£   c           	   	   C   sā  g }g }|  d” t| tr.| t| ” nt| trH| t| ” nčt| trt| tst	| |\}}}| |” | |” | |” n¤t| trĘt
| |\}}}| |” | |” | |” njt| trą| t| ” nPt| trś| t| ” n6t| tr| t| ” nt| tr0| t| ” | jd urX|  dt| jdd d ” | jd ur|  d” |  dt| jdd d ” |  d” | jd ur°|  d	| j ” | jd urĢ|  d
| j ” |  d t| jj ”  dd””” |  t| jd ” |  t| j r| j jnt! d ” |  t| j r>| j"jnt! d ” |  t#| j$d ” t| tsxt| tr|  %” }|  t|j&d ” n
|  d” |  d t| jj ”  dd””” |  d” | |” d '|”S )Nz*UA_StatusCode retVal = UA_STATUSCODE_GOOD;zattr.displayName = F)Zallocr>   z.#ifdef UA_ENABLE_NODESET_COMPILER_DESCRIPTIONSzattr.description = z#endifzattr.writeMask = %d;zattr.userWriteMask = %d;z:retVal |= UA_Server_addNode_begin(server, UA_NODECLASS_{},ZNODEr5   ś,z UA_NODEID_NULL,zN(const UA_NodeAttributes*)&attr, &UA_TYPES[UA_TYPES_{}ATTRIBUTES],NULL, NULL);r*   r+   )(r-   r   r   Śextendr:   r   r@   r	   r
   rk   rl   r   r   r   r   r   r   r   r    ŚdisplayNamer   ŚdescriptionŚ	writeMaskŚuserWriteMaskrE   r   r   r   r   Śreplacer   r   r&   r   ŚparentReferencer   rH   Ś
popTypeDefr0   r1   )	r#   rL   Ścode_globalr2   r]   rb   rc   rd   Z
typeDefRefr   r   r   ŚgenerateNodeCode_beginź  sh    











’$$
’

r®   c                 C   s^   g }t | tr| d” n
| d” | t| j” t | trJ| d” n
| d” d |”S )Nz'UA_Server_addMethodNode_finish(server, z!UA_Server_addNode_finish(server, z, NULL, 0, NULL, 0, NULL);r}   r+   )r   r   r-   r   r   r1   r9   r   r   r   ŚgenerateNodeCode_finish$  s    



rÆ   )NF)T)5Ś	datatypesr   r   r   r   r   rZ   r   r   r	   r
   r   r   r   r   Zbackend_open62541_datatypesr   r   r   r   r   r   r    ŚloggingŚsysŚversion_infor   Ś	getLoggerr   r[   r$   r'   r3   r:   r@   rJ   rO   re   rk   rl   rm   r   r   r   r   rY   r   r   r   r    r£   r®   rÆ   r   r   r   r   Ś<module>   s>   ( 
 -B
M	

R	: