⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node_8cpp-source.html

📁 美国COPLEY驱动器,程序开发工具之一.
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00391"></a>00391 <span class="comment">/***************************************************************************/</span><a name="l00392"></a><a class="code" href="classNode.html#a29">00392</a> <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *<a class="code" href="classNode.html#a29">Node::GetIdentity</a>( <a class="code" href="structNodeIdentity.html">NodeIdentity</a> &amp;<span class="keywordtype">id</span> )<a name="l00393"></a>00393 {<a name="l00394"></a>00394    <span class="comment">// Find the number of supported fields</span><a name="l00395"></a>00395    <a class="code" href="CML__Utils_8h.html#a5">int8</a> ct;<a name="l00396"></a>00396    <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a13">Upld8</a>( 0x1018, 0, ct );<a name="l00397"></a>00397    <span class="keywordflow">if</span>( err ) <span class="keywordflow">return</span> err;<a name="l00398"></a>00398 <a name="l00399"></a>00399    <span class="keywordflow">if</span>( ct &lt; 1 || ct &gt; 4 )<a name="l00400"></a>00400       <span class="keywordflow">return</span> &amp;<a class="code" href="classCanOpenError.html#s12">CanOpenError::IllegalFieldCt</a>;<a name="l00401"></a>00401 <a name="l00402"></a>00402    <span class="keywordtype">id</span>.productCode = 0;<a name="l00403"></a>00403    <span class="keywordtype">id</span>.revision    = 0;<a name="l00404"></a>00404    <span class="keywordtype">id</span>.serial      = 0;<a name="l00405"></a>00405 <a name="l00406"></a>00406    err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a9">Upld32</a>( 0x1018, 1, <span class="keywordtype">id</span>.vendorID );<a name="l00407"></a>00407    <span class="keywordflow">if</span>( !err &amp;&amp; ct &gt; 1 ) err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a9">Upld32</a>( 0x1018, 2, <span class="keywordtype">id</span>.productCode );<a name="l00408"></a>00408    <span class="keywordflow">if</span>( !err &amp;&amp; ct &gt; 2 ) err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a9">Upld32</a>( 0x1018, 3, <span class="keywordtype">id</span>.revision    );<a name="l00409"></a>00409    <span class="keywordflow">if</span>( !err &amp;&amp; ct &gt; 3 ) err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a9">Upld32</a>( 0x1018, 4, <span class="keywordtype">id</span>.serial      );<a name="l00410"></a>00410 <a name="l00411"></a>00411    <span class="keywordflow">return</span> err;<a name="l00412"></a>00412 }<a name="l00413"></a>00413 <a name="l00414"></a>00414 <span class="comment">/***************************************************************************/</span><span class="comment"></span><a name="l00415"></a>00415 <span class="comment">/**</span><a name="l00416"></a>00416 <span class="comment">Reset this node.</span><a name="l00417"></a>00417 <span class="comment">@return An error object</span><a name="l00418"></a>00418 <span class="comment">*/</span><a name="l00419"></a>00419 <span class="comment">/***************************************************************************/</span><a name="l00420"></a><a class="code" href="classNode.html#a18">00420</a> <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *<a class="code" href="classNode.html#a18">Node::ResetNode</a>( <span class="keywordtype">void</span> )<a name="l00421"></a>00421 {<a name="l00422"></a>00422    <a class="code" href="CML_8h.html#a0">cml</a>.<a class="code" href="classCopleyMotionLibrary.html#a8">Debug</a>( <span class="stringliteral">"ResetNode %d.\n"</span>, <a class="code" href="classNode.html#a38">GetNodeID</a>() );<a name="l00423"></a>00423 <a name="l00424"></a>00424    <span class="comment">// Disable the node guarding task</span><a name="l00425"></a>00425    mutex.<a class="code" href="classMutex.html#a2">Lock</a>();<a name="l00426"></a>00426    guardType    = <a class="code" href="CML__Node_8h.html#a10a6">GUARDTYPE_NONE</a>;<a name="l00427"></a>00427    guardTimeout = -1;<a name="l00428"></a>00428    guardToggle  = -1;<a name="l00429"></a>00429    guardEvents.<a class="code" href="classEventMap.html#a6">setBits</a>( <a class="code" href="Node_8cpp.html#a1">GUARD_EVENT_CHANGE</a> );<a name="l00430"></a>00430    mutex.<a class="code" href="classMutex.html#a3">Unlock</a>();<a name="l00431"></a>00431 <a name="l00432"></a>00432    <span class="comment">// Wait for the node guarding task to change it's state</span><a name="l00433"></a>00433    <a class="code" href="classEventNone.html">EventNone</a> e = <a class="code" href="Node_8cpp.html#a1">GUARD_EVENT_CHANGE</a>;<a name="l00434"></a>00434 <a name="l00435"></a>00435    <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *err = e.<a class="code" href="classEvent.html#a7">Wait</a>( guardEvents, 500 );<a name="l00436"></a>00436    <span class="keywordflow">if</span>( err )<a name="l00437"></a>00437    {<a name="l00438"></a>00438       <a class="code" href="CML_8h.html#a0">cml</a>.<a class="code" href="classCopleyMotionLibrary.html#a9">Warn</a>( <span class="stringliteral">"Error %s waiting for node guard task during ResetNode call\n"</span>, err-&gt;<a class="code" href="classError.html#a0">toString</a>() );<a name="l00439"></a>00439       <span class="keywordflow">return</span> err;<a name="l00440"></a>00440    }<a name="l00441"></a>00441 <a name="l00442"></a>00442    <span class="comment">// Send the node a reset message</span><a name="l00443"></a>00443    err = <a class="code" href="classReceiver.html#p0">co</a>-&gt;<a class="code" href="classCanOpen.html#a6">ResetNode</a>( nodeID );<a name="l00444"></a>00444    <span class="keywordflow">if</span>( err ) <span class="keywordflow">return</span> err;<a name="l00445"></a>00445 <a name="l00446"></a>00446    <span class="comment">// Wait for the state to change to pre-op without sending</span><a name="l00447"></a>00447    <span class="comment">// a remote request.  The node should indicate that state</span><a name="l00448"></a>00448    <span class="comment">// on boot up.</span><a name="l00449"></a>00449    <span class="keywordflow">return</span> WaitStateChange( <a class="code" href="CML__Node_8h.html#a9a4">NODESTATE_PRE_OP</a>, <span class="keyword">false</span> );<a name="l00450"></a>00450 }<a name="l00451"></a>00451 <a name="l00452"></a>00452 <span class="comment">/***************************************************************************/</span><span class="comment"></span><a name="l00453"></a>00453 <span class="comment">/**</span><a name="l00454"></a>00454 <span class="comment">Disable node guarding &amp; heartbeat monitoring.</span><a name="l00455"></a>00455 <span class="comment"></span><a name="l00456"></a>00456 <span class="comment">@return A pointer to an error object, or NULL on success</span><a name="l00457"></a>00457 <span class="comment">*/</span><a name="l00458"></a>00458 <span class="comment">/***************************************************************************/</span><a name="l00459"></a><a class="code" href="classNode.html#a3">00459</a> <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *<a class="code" href="classNode.html#a3">Node::StopGuarding</a>( <span class="keywordtype">void</span> )<a name="l00460"></a>00460 {<a name="l00461"></a>00461    <span class="comment">// Clear both heartbeat and node guard times.</span><a name="l00462"></a>00462    <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a10">Dnld16</a>( 0x1017, 0, (<a class="code" href="CML__Utils_8h.html#a8">uint16</a>)0 );<a name="l00463"></a>00463    <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a10">Dnld16</a>( 0x100C, 0, (<a class="code" href="CML__Utils_8h.html#a8">uint16</a>)0 );<a name="l00464"></a>00464 <a name="l00465"></a>00465    mutex.<a class="code" href="classMutex.html#a2">Lock</a>();<a name="l00466"></a>00466    guardType    = <a class="code" href="CML__Node_8h.html#a10a6">GUARDTYPE_NONE</a>;<a name="l00467"></a>00467    guardTimeout = -1;<a name="l00468"></a>00468    guardToggle  = -1;<a name="l00469"></a>00469    guardEvents.<a class="code" href="classEventMap.html#a6">setBits</a>( <a class="code" href="Node_8cpp.html#a1">GUARD_EVENT_CHANGE</a> );<a name="l00470"></a>00470    mutex.<a class="code" href="classMutex.html#a3">Unlock</a>();<a name="l00471"></a>00471 <a name="l00472"></a>00472    <span class="keywordflow">return</span> 0;<a name="l00473"></a>00473 }<a name="l00474"></a>00474 <a name="l00475"></a>00475 <span class="comment">/***************************************************************************/</span><span class="comment"></span><a name="l00476"></a>00476 <span class="comment">/**</span><a name="l00477"></a>00477 <span class="comment">Enable heartbeat messages from this node, and start a thread to monitor</span><a name="l00478"></a>00478 <span class="comment">them.</span><a name="l00479"></a>00479 <span class="comment">@param period The producer timeout value (milliseconds).  The node will</span><a name="l00480"></a>00480 <span class="comment">       be configured to produce a heartbeat message at this interval.</span><a name="l00481"></a>00481 <span class="comment">       </span><a name="l00482"></a>00482 <span class="comment">@param timeout The additional number of milliseconds that the monitor</span><a name="l00483"></a>00483 <span class="comment">       thread will wait before indicating an error.  Thus, the consumer</span><a name="l00484"></a>00484 <span class="comment">       heartbeat interval will be (period + timeout).</span><a name="l00485"></a>00485 <span class="comment">       </span><a name="l00486"></a>00486 <span class="comment">@return A pointer to an error object, or NULL on success</span><a name="l00487"></a>00487 <span class="comment">*/</span><a name="l00488"></a>00488 <span class="comment">/***************************************************************************/</span><a name="l00489"></a><a class="code" href="classNode.html#a4">00489</a> <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *<a class="code" href="classNode.html#a4">Node::StartHeartbeat</a>( <a class="code" href="CML__Utils_8h.html#a8">uint16</a> period, <a class="code" href="CML__Utils_8h.html#a8">uint16</a> timeout )<a name="l00490"></a>00490 {<a name="l00491"></a>00491    <span class="comment">// If the period is sent as zero, return an error.</span><a name="l00492"></a>00492    <span class="keywordflow">if</span>( !period )<a name="l00493"></a>00493       <span class="keywordflow">return</span> &amp;<a class="code" href="classCanOpenError.html#s1">CanOpenError::BadParam</a>;<a name="l00494"></a>00494 <a name="l00495"></a>00495    <span class="comment">// Set the node's heartbeat time.</span><a name="l00496"></a>00496    <span class="keyword">const</span> <a class="code" href="classError.html">Error</a> *err = <a class="code" href="classNode.html#o0">sdo</a>.<a class="code" href="classSDO.html#a10">Dnld16</a>( 0x1017, 0, period );<a name="l00497"></a>00497 <a name="l00498"></a>00498    <span class="keywordflow">if</span>( !err )<a name="l00499"></a>00499    {<a name="l00500"></a>00500       mutex.<a class="code" href="classMutex.html#a2">Lock</a>();<a name="l00501"></a>00501       guardType    = <a class="code" href="CML__Node_8h.html#a10a7">GUARDTYPE_HEARTBEAT</a>;<a name="l00502"></a>00502       guardTimeout = (<a class="code" href="CML__Utils_8h.html#a9">int32</a>)period + (<a class="code" href="CML__Utils_8h.html#a9">int32</a>)timeout;<a name="l00503"></a>00503       guardToggle  = -1;<a name="l00504"></a>00504       guardEvents.<a class="code" href="classEventMap.html#a6">setBits</a>( <a class="code" href="Node_8cpp.html#a1">GUARD_EVENT_CHANGE</a> );<a name="l00505"></a>00505       mutex.<a class="code" href="classMutex.html#a3">Unlock</a>();<a name="l00506"></a>00506    }<a name="l00507"></a>00507 <a name="l00508"></a>00508    <span class="keywordflow">return</span> err;<a name="l00509"></a>00509 }<a name="l00510"></a>00510 <a name="l00511"></a>00511 <span class="comment">/***************************************************************************/</span><span class="comment"></span><a name="l00512"></a>00512 <span class="comment">/**</span><a name="l00513"></a>00513 <span class="comment">Enable node guarding on this node.</span><a name="l00514"></a>00514 <span class="comment"></span><a name="l00515"></a>00515 <span class="comment">When node guarding is enabled, a new thread is created which will send a </span><a name="l00516"></a>00516 <span class="comment">remote request to this node every (guardTime) milliseconds.  The node must</span><a name="l00517"></a>00517 <span class="comment">respond to this message within the guard time.  If the node does not respond</span><a name="l00518"></a>00518 <span class="comment">then the thread will notify the node of a state change.</span><a name="l00519"></a>00519 <span class="comment"></span><a name="l00520"></a>00520 <span class="comment">@param guardTime The period in milliseconds of the guard messages sent</span><a name="l00521"></a>00521 <span class="comment">       to the node.  It can range from 1 to 65535.</span><a name="l00522"></a>00522 <span class="comment">       </span><a name="l00523"></a>00523 <span class="comment">@param lifeFactor A multiplier used by the node to determine how long to </span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -