library for C++ CANOpen implementation. mbed independant, but is easy to attach into with mbed.
Dependents: ppCANOpen_Example DISCO-F746NG_rtos_test
Example:
Import programppCANOpen_Example
I am no longer actively working on the ppCANOpen library, however, I want to publish this project so that anyone who wants to pick up any of the pieces can have a good example. This is a a project I was working on using the ppCANOpen library. It has a pretty in deep use of the object dictionary structure. And a number of functions to control high voltage pinball drivers, if you're into that sort of thing.
include/Node.h
- Committer:
- ptpaterson
- Date:
- 2016-02-13
- Revision:
- 5:22a337cdc0e3
- Parent:
- 4:2034b04c86d2
File content as of revision 5:22a337cdc0e3:
/**
******************************************************************************
* @file
* @author Paul Paterson
* @version
* @date 2015-12-14
* @brief CANOpen implementation library
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2015 Paul Paterson
*
* All rights reserved.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PPCAN_NODE_H
#define PPCAN_NODE_H
#include "ObjectDictionary.h"
/*=========================================================================
* Forward declarations
*=========================================================================
*/
struct CanOpenMessage;
//struct ObjectData;
/* NMT Constants --------------------------------------------------------*/
#define NMT_STATE_TOGGLE_BIT 0x80
/* NMT Macros -----------------------------------------------------------*/
#define NMT_SET_STATE(curState, newState) (curState) = (((curState) & NMT_STATE_TOGGLE_BIT) | ((newState) & (~NMT_STATE_TOGGLE_BIT))))
namespace ppCANOpen
{
/* Avoid circular reference */
class ServiceProvider;
/** Node Class to implement feature of a CANOpen NMT node
*/
class Node
{
public:
/* ========================================================================
* Internal structures and constants
* ========================================================================
*/
/** Node network management state */
struct State {
static const int INITIALIZED = 0x00;
static const int DISCONNECTED = 0x01;
static const int CONNECTING = 0x02;
static const int PREPARING = 0x02;
static const int STOPPED = 0x04;
static const int OPERATIONAL = 0x05;
static const int PREOPERATIONAL = 0x7F;
static const int UNKNOWN = 0x0F;
int nmtState;
int bBoot;
int bSDO;
int bEmergency;
int bSYNC;
int bLifeGuard;
int bPDO;
int bLSS;
int bLifeGuardToggle;
};
/* ========================================================================
* Construction
* ========================================================================
*/
/** Maintain the multitude of states for a node */
Node (int id, ServiceProvider * provider, int bLoop = 0);
/* ========================================================================
* Public Methods
* ========================================================================
*/
/** Call from ServiceProvider on an interrupt */
void FixedUpdate (uint32_t time);
/** Call from ServiceProvider every loop of Run() */
void Update (void);
/** Handle message given by the ServiceProvider*/
int DispatchMessage(CanOpenMessage *canOpenMsg);
/* ========================================================================
* Public Member Variables
* ========================================================================
*/
/* Common Node properties -----------------------------------------------*/
/** Network id for the node
* @note Ref is held in object dictionary and upon setting, may need to
* update some other objects.
*/
int nodeId;
/** Loopback Mode. Default off (0), if on (1) then will hear it's own
* messages
*/
int bLoopbackOn;
protected:
/* ========================================================================
* Protected? Methods to handle various messages
* Used to deal with everything from inside of Dispatch Message
* ========================================================================
*/
/* PDO (7.2.2), MPDO (7.2.3) --------------------------------------------*/
int HandlePdo (CanOpenMessage *canOpenMsg);
/* SDO (7.2.4) ----------------------------------------------------------*/
int HandleSdo (CanOpenMessage *canOpenMsg);
int HandleExpeditedDownload (int sdoNum, int index, int subIndex, int dataCount, char * data);
int HandleInitiateDownloadRequest (int sdoNum, int index, int subIndex, int dataCount, char * data);
int HandleExpeditedUpload (int sdoNum, int index, int subIndex);
// TODO: express and not express
/* SYNC object (7.2.5) --------------------------------------------------*/
int HandleSync (CanOpenMessage *canOpenMsg);
/* Time Stamp object (7.2.6) --------------------------------------------*/
/* Handled all inside of the ServiceProvider */
/* Emergency object (7.2.7) ---------------------------------------------*/
int ConsumeEmergency (void);// TODO: fix params
/* Network Management (7.2.8) -------------------------------------------*/
/* ---- Node Control (7.2.8.2.1) ----------------------------------------*/
int HandleNodeControl (CanOpenMessage *canOpenMsg);
/* ---- Error Control (7.2.8.2.2) ---------------------------------------*/
int HandleNodeGuardRequest (int masterId);
int ConsumeHeartbeat (int producerId);
protected:
/* ========================================================================
* Protected Methods to implement node application in derived classes
* ========================================================================
*/
/** Perform actions every cycle (when in operational mode)
* @note Override to implement user application
* @note The OnTick function should avoid modifying data in the object
* dictionary unless necessary, because there will almost certainly be
* a race condition.
*/
virtual void OnFixedUpdate(void) = 0;
virtual void OnUpdate(void) = 0;
/* SYNC -----------------------------------------------------------------*/
/** Perform actions when state changed to stop
* @note Override to implement user application
*/
virtual void OnSync (uint8_t counter) = 0;
/* NMT Node Control -----------------------------------------------------*/
/** Perform actions when node reset
* @note Override to implement user application
*/
virtual void OnInitialize (void) = 0;
/** Perform actions when state changed to pre-operational
* @note Override to implement user application
*/
virtual void OnPreoperational (void) = 0;
/** Perform actions when state changed to operational
* @note Override to implement user application
*/
virtual void OnOperational (void) = 0;
/** Perform actions when state changed to stop
* @note Override to implement user application
*/
virtual void OnStopped (void) = 0;
/* Object Dictionary Handling -------------------------------------------*/
/** Abstract method to give access to the object entries of derived
* classes
*/
virtual ObjectData * ScanIndex(IndexSize index) = 0;
/* ========================================================================
* Protected Methods to Post Messages
* ========================================================================
*/
int PostTPDO (int cobId);
/* ========================================================================
* Protected Member Variables
* ========================================================================
*/
/* Object Dictionary Handling -------------------------------------------*/
/** Array of ObjectData to contain all of the object dictionary data */
ObjectData *dictionary;
/* Elapsed Time ---------------------------------------------------------*/
/** Millisecond time stamp at this OnTick() */
uint32_t timeCurrentTick;
/** Millisecond difference between current OnTick() and the previous */
uint32_t timeSinceLastTick;
// should be private
// TODO: implement functions in Node class to post all types of messages so
// derived classes do not have to consider message structure.
protected:
/* ========================================================================
* Private members
* ========================================================================
*/
/* ServiceProvider ------------------------------------------------------*/
/** Reference to Service Provider that this node is attached to */
ServiceProvider * pMyProvider;
private:
/* Common Node Methods --------------------------------------------------*/
/** Change state of the node */
void ChangeState(int newState);
/* Common Node properties -----------------------------------------------*/
/** Network and communication state of the node */
State state;
};
} /* namespace ppCANOpen */
#endif // PPCAN_NODE_H
