📄 node_8cpp-source.html
字号:
<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> &<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 < 1 || ct > 4 )<a name="l00400"></a>00400 <span class="keywordflow">return</span> &<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 && ct > 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 && ct > 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 && ct > 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-><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>-><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 & 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> &<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 + -