亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? canopen.cpp

?? 美國COPLEY驅(qū)動器,程序開發(fā)工具之一.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************/
/*                                                          */
/*  Copley Motion Libraries                                 */
/*                                                          */
/*  Author: Stephen Glow                                    */
/*                                                          */
/*  Copyright (c) 2002-2005 Copley Controls Corp.           */
/*                          http://www.copleycontrols.com   */
/*                                                          */
/************************************************************/

/** \file

This file holds code for the top level CANopen class.
This class is used for over all control of the CANopen network.

*/

#include "CML.h"

CML_NAMESPACE_USE();

// static CANopen error objects
CML_NEW_ERROR( CanOpenError, ThreadStart,     "Error starting CANopen read thread" );
CML_NEW_ERROR( CanOpenError, BadParam,        "Bad parameter value" );
CML_NEW_ERROR( CanOpenError, SDO_Busy,        "SDO object is not idle" );
CML_NEW_ERROR( CanOpenError, SDO_Timeout,     "Timeout waiting on SDO" );
CML_NEW_ERROR( CanOpenError, SDO_Unknown,     "Unknown SDO error" );
CML_NEW_ERROR( CanOpenError, SDO_BadMuxRcvd,  "Invalid multiplexor received in SDO message" );
CML_NEW_ERROR( CanOpenError, SDO_BadMsgRcvd,  "Invalid format for received SDO message" );
CML_NEW_ERROR( CanOpenError, BadNodeID,       "The specified Node ID was invalid" );
CML_NEW_ERROR( CanOpenError, NotInitialized,  "The referenced object has not been initialized" );
CML_NEW_ERROR( CanOpenError, Initialized,     "The referenced object is already initialized" );
CML_NEW_ERROR( CanOpenError, NotSupported,    "The feature is not supported" );
CML_NEW_ERROR( CanOpenError, MonitorRunning,  "Heartbeat or node guarding already started" );
CML_NEW_ERROR( CanOpenError, IllegalFieldCt,  "Illegal field count returned for the requested object" );
CML_NEW_ERROR( CanOpenError, RcvrNotFound,    "No enabled receiver could be found for that ID" );
CML_NEW_ERROR( CanOpenError, RcvrPresent,     "A CAN receiver using that ID is already enabled" );
CML_NEW_ERROR( CanOpenError, Closed,          "The CANopen port is closed" );

/***************************************************************************/
/**
Default constructor.  Simply initializes some local variables.
*/
/***************************************************************************/
CanOpen::CanOpen( void )
{
   synchProducer = 0;
   errorFrameCt = 0;

   for( int i=0; i<CML_HASH_SIZE; i++ )
      hash[i] = 0;
   can = 0;
}

/***************************************************************************/
/**
CanOpen Destructor.  This closes the CANopen network.
*/
/***************************************************************************/
CanOpen::~CanOpen( void )
{
   Close();
}

/***************************************************************************/
/**
Close the CANopen network.  This disables all receivers and stops the
thread that listens on the CAN network.
*/
/***************************************************************************/
void CanOpen::Close( void )
{
   for( int i=0; i<CML_HASH_SIZE; i++ )
   {
      if( hash[i] )
      {
	 DisableReceiver( hash[i] );
	 hash[i] = 0;
      }
   }
   stop();

   if( can )
   {
      can->canOpenPtr = 0;
      can->Close();
      can = 0;
   }
}

/***************************************************************************/
/**
Open the CANopen network.  This function performs the one time initialization 
necessary to communication via the CANopen network.  It should be the first 
function called for the CANopen object.

All configurable settings will be set to their defaults when the CanOpen object
is opened using this method.  For a list of CanOpen object settings and their
default values, please see the CanOpenSettings object.

@param canRef A reference to the CAN interface object that will be used for
       all low level communication over the network.
		 
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::Open( CanInterface &canRef )
{
   CanOpenSettings settings;
   return Open( canRef, settings );
}

/***************************************************************************/
/**
Open the CANopen network.  This function performs the one time initialization 
necessary to communication via the CANopen network.  It should be the first 
function called for the CANopen object.

This version of the Open function takes a CanOpenSettings object reference
as it's second parameter.  The data members of the settings object may be
used to configure some of the CanOpen object's behavior.

@param canRef A reference to the CAN interface object that will be used for
       all low level communication over the network.
		 
@param settings A reference to a CanOpenSettings object.  This object is used
       to customize the behavior of the CanOpen object.
		 
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::Open( CanInterface &canRef, CanOpenSettings &settings )
{
   if( can )
      return &CanOpenError::Initialized;

   // Keep a pointer to the CAN interface object.
   can = &canRef;

   // Open the low level CAN interface
   const Error *err = can->Open();

   if( err && (err != &CanError::AlreadyOpen) )
      return err;

   // Save a pointer to this object in the CanInterface object.
   // This is used to ensure clean destruction of both objects.
   can->canOpenPtr = this;

   setPriority( settings.readThreadPriority );

   // Start a thread that will listen for messages 
   // on the CAN network.
   if( start() )
      return &CanOpenError::ThreadStart;

   return 0;
}

/***************************************************************************/
/**
Send a Network Management message to one or more nodes on the network.
@param code The network management function code to be sent.
@param nodeID The ID of the node to send the message to.  Use 0 to broadcast
       the message to all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::NMT_Msg( int code, int nodeID )
{
   // Check for a valid Node ID
   if( nodeID < 0 || nodeID > 127 )
      return &CanOpenError::BadNodeID;

   CanFrame frame;
   frame.id = 0;
   frame.type = CAN_FRAME_DATA;
   frame.length = 2;
   frame.data[0] = code;
   frame.data[1] = nodeID;

   return Xmit( frame );
}

/***************************************************************************/
/**
Send a network management message to start the specified node.  All nodes
are started if the passed node ID is zero.
@param nodeID The ID of the node to started, or zero for all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::StartNode( int nodeID ){ return NMT_Msg( 1, nodeID ); }

/***************************************************************************/
/**
Send a network management message to stop the specified node.  All nodes
are stopped if the passed node ID is zero.
@param nodeID The ID of the node to stop, or zero for all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::StopNode( int nodeID ) { return NMT_Msg( 2, nodeID ); }

/***************************************************************************/
/**
Send a network management message to put the specified node in pre-operational
state.  All nodes are made pre-operational if the passed node ID is zero.
@param nodeID The ID of the node to make pre-operational.  Zero for all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::PreOpNode( int nodeID ){ return NMT_Msg( 128, nodeID ); }

/***************************************************************************/
/**
Send a network management message to reset the specified node.  All nodes
are reset if the passed node ID is zero.
@param nodeID The ID of the node to reset, or zero for all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::ResetNode( int nodeID ){ return NMT_Msg( 129, nodeID ); }

/***************************************************************************/
/**
Send a network management message to reset the communications of the specified 
node.  All nodes have their communications reset if the passed node ID is zero.
@param nodeID The ID of the node to reset, or zero for all nodes.
@return A pointer to an error object, or NULL on success.
*/
/***************************************************************************/
const Error *CanOpen::ResetComm( int nodeID ){ return NMT_Msg( 130, nodeID ); }

/***************************************************************************/
/**
Transmit a frame over the CANopen network.
*/
/***************************************************************************/
const Error *CanOpen::Xmit( CanFrame &frame, int32 timeout )
{
   if( !can ) return &CanOpenError::Closed;
   return can->Xmit( frame, timeout );
}

/***************************************************************************/
/**
CAN network read thread.  This function defines the thread that will be
used to read the CAN network and pass received frames to the various 
CANopen network reader objects.
*/
/***************************************************************************/
void CanOpen::run( void )
{
   Receiver *r;
   CanFrame frame;

   while( 1 )
   {
      // If the port is closed, return.  This will stop the thread.
      if( !can ) 
	 return;

      const Error *err = can->Recv( frame );

      if( err )
      {
	 cml.Error( "Error reading from CAN interface: %s\n", err->toString() );
	 sleep( 5 );
	 continue;
      }

      if( frame.type == CAN_FRAME_ERROR )
      {
	 errorFrameCt++;
	 continue;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久一区二区三区 | 色8久久精品久久久久久蜜 | 欧美性生活久久| 51精品秘密在线观看| 日韩你懂的在线播放| 国产亚洲一区字幕| 亚洲一区二区四区蜜桃| 一区二区久久久久久| 亚洲国产一区二区三区| 麻豆精品一区二区| 91黄色免费观看| 久久久99久久精品欧美| 一区二区三区成人| 毛片av一区二区| 在线观看91精品国产入口| 国产欧美日韩中文久久| 强制捆绑调教一区二区| 99久久精品国产一区二区三区| 91精品国产美女浴室洗澡无遮挡| 国产精品毛片久久久久久| 成人精品免费看| 欧美三级中文字| 久久久av毛片精品| 日本一区中文字幕| 欧美四级电影网| 亚洲卡通欧美制服中文| 91蜜桃传媒精品久久久一区二区| 欧美成人性战久久| 久久成人久久鬼色| 精品蜜桃在线看| 麻豆极品一区二区三区| 日韩视频免费直播| 麻豆91在线播放免费| 日韩午夜在线播放| 久久精品国产99| 国产香蕉久久精品综合网| 成人a免费在线看| 亚洲欧洲av一区二区三区久久| 成人一区二区三区在线观看| 国产欧美综合色| 91麻豆免费看| 中文字幕中文在线不卡住| 在线观看日韩高清av| 亚洲电影欧美电影有声小说| 欧美三级在线看| 久久精品久久综合| 国产欧美视频一区二区三区| 97精品久久久午夜一区二区三区 | 欧美中文字幕亚洲一区二区va在线 | 精品一区二区三区久久| 精品国产三级a在线观看| 国产91富婆露脸刺激对白| 亚洲女同一区二区| 91精品国产色综合久久不卡电影 | 日韩精品91亚洲二区在线观看 | 成人午夜在线免费| 婷婷综合另类小说色区| 久久久久久久免费视频了| 欧美日韩黄色一区二区| 成人av在线一区二区| 日本不卡一二三| 亚洲成人一二三| 国产精品久久久久一区二区三区共| 5566中文字幕一区二区电影| 91小视频在线免费看| 精彩视频一区二区三区| 亚洲综合久久av| 日韩美女精品在线| 国产精品乱码一区二三区小蝌蚪| 丁香婷婷综合激情五月色| 三级亚洲高清视频| 亚洲成人自拍一区| 亚洲欧洲中文日韩久久av乱码| 26uuuu精品一区二区| 久久久影视传媒| 久久久久久久久久久黄色| 日韩三级精品电影久久久| 欧美一级夜夜爽| 久久亚洲一级片| 久久影院视频免费| 国产三级一区二区三区| 国产日韩亚洲欧美综合| 国产欧美精品区一区二区三区| 久久亚洲精品小早川怜子| 久久午夜电影网| 亚洲欧美在线视频| 亚洲欧洲一区二区三区| 亚洲另类在线制服丝袜| 亚洲成人一区二区在线观看| 日韩av不卡一区二区| 久久精品国产澳门| 成人高清在线视频| 欧美专区在线观看一区| 欧美美女直播网站| 久久久久久久综合| 一区二区三区在线观看欧美| 午夜欧美一区二区三区在线播放| 久久国产精品72免费观看| 91在线码无精品| 精品国产一区二区在线观看| 成人欧美一区二区三区1314| 免费看日韩精品| 91精品福利在线| 欧美国产一区二区在线观看 | 欧美天天综合网| 国产日本欧洲亚洲| 日本欧美肥老太交大片| 国产白丝网站精品污在线入口| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产日韩欧美综合一区| 一区二区三区在线播| 国产精品亚洲一区二区三区妖精| 欧美日韩午夜影院| 一区二区三区在线影院| 成人午夜免费视频| 精品999在线播放| 日本最新不卡在线| 欧美日韩精品福利| 亚洲一二三区不卡| 欧美色中文字幕| 午夜电影一区二区三区| 欧美偷拍一区二区| 亚洲国产日韩综合久久精品| 欧美色精品在线视频| 亚洲一区二区三区四区在线| 欧美中文字幕一区| 首页国产丝袜综合| 日韩欧美国产不卡| 国产一区二区免费在线| 久久免费午夜影院| 国产激情91久久精品导航| 国产精品久久久久一区二区三区| 成人一区二区三区在线观看| 中文字幕巨乱亚洲| 色av成人天堂桃色av| 日本欧美在线观看| 国产亚洲欧美激情| 在线亚洲欧美专区二区| 美女高潮久久久| 国产精品精品国产色婷婷| 91免费观看视频在线| 久久99精品久久久久久国产越南| 亚洲国产成人午夜在线一区| 色8久久精品久久久久久蜜| 久久精品国产在热久久| 亚洲免费大片在线观看| 日韩欧美在线观看一区二区三区| 高清成人在线观看| 欧美三级一区二区| 亚洲综合视频在线观看| 精品久久久久久最新网址| 97se亚洲国产综合自在线不卡| 美脚の诱脚舐め脚责91| 中文字幕一区二区三区四区不卡| 91精品国产91久久久久久最新毛片 | 亚洲va欧美va天堂v国产综合| 亚洲精品一线二线三线无人区| 日本精品一级二级| 99re视频这里只有精品| 国产麻豆日韩欧美久久| 奇米精品一区二区三区在线观看| 国产精品久久三区| 国产欧美视频一区二区| 精品噜噜噜噜久久久久久久久试看 | 亚洲男人天堂av网| 国产精品高潮久久久久无| 欧美精品一区二区高清在线观看 | 国产一区在线观看麻豆| 激情综合网av| 国产精品亚洲一区二区三区妖精 | 国产精品色在线观看| 国产女人aaa级久久久级| 国产日产欧美一区二区视频| 国产偷国产偷精品高清尤物| 久久久久久久久久美女| 国产精品色婷婷| 中文字幕一区二区三区在线播放| 国产精品久久久久久久久免费桃花| 国产色产综合产在线视频| 国产偷v国产偷v亚洲高清 | 丁香婷婷综合色啪| 91国偷自产一区二区使用方法| 欧美在线免费视屏| 日韩精品一区在线| www一区二区| 久久91精品国产91久久小草| 久久99久久久久久久久久久| 成人激情开心网| 欧美色综合影院| 国产午夜三级一区二区三| 亚洲精品欧美二区三区中文字幕| 亚洲福利视频三区| 韩国三级在线一区| 色综合久久天天| 国产日韩在线不卡| 蜜臀av一区二区在线免费观看| 成人一道本在线| 精品国产sm最大网站免费看| 亚洲免费观看在线观看| 国产高清成人在线|