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:
2015-12-30
Revision:
2:c724ff3a4e4d
Child:
3:12b3c25bdeba

File content as of revision 2:c724ff3a4e4d:

/**
 ******************************************************************************
 * @file
 * @author  Paul Paterson
 * @version
 * @date    2015-12-14
 * @brief   CANOpen implementation library
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; 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 "canopen_protocol.h"

namespace ppCANOpen
{

/* Avoid circular reference */
class ServiceProvider;
class ObjectDictionary;

/** Maintain the multitude of states for a node */
typedef struct {
    NmtState nmtState;
    int csBoot_Up;
    int csSDO;
    int csEmergency;
    int csSYNC;
    int csLifeGuard;
    int csPDO;
    int csLSS;
} NodeState;

/** Node Class to implement feature of a CANOpen NMT node
 */
class Node
{
public:
    Node (void);    
    
    /* ========================================================================
     * Methods to message indication and confirmation
     * Called by a ServiceProvider when a message is received.
     * ========================================================================
     */
    
    /* PDO (7.2.2), MPDO (7.2.3) --------------------------------------------*/
    
    int ConsumePdo (int pdoNum, char * dataIn);
    int HandlePdoReadRequest (int pdoNum);
    
    
    /* SDO (7.2.4) ----------------------------------------------------------*/
    
    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) --------------------------------------------------*/
    
    // TODO: SYNC consumer 
    
    /* Time Stamp object (7.2.6) --------------------------------------------*/
    
    // TODO: time consumer
    
    /* 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 (void);


    /* ---- Error Control (7.2.8.2.2) ---------------------------------------*/
    
    int HandleNodeGuardRequest (int masterId);
    int ConsumeHeartbeat (int producerId);
    
    
    /* ========================================================================
     * Methods to handle operation of node device
     * ========================================================================
     */
    
    /**
     *  @note
     */
    // TODO: pass elapsed time to Update method
    virtual void Update (void);
    
    
    /* ========================================================================
     * Public members
     * ========================================================================
     */
     
    /** Network id for the node
      * @note May need to be a pointer, because node id is held in object dictionary
      */
    int nodeId;
    
    /** Network and communication state of the node
      * @note
      */
    NodeState state; 


protected:
    
    /* ========================================================================
     * Methods to implement node control in derived classes
     * ========================================================================
     */
    
    /** Perform actions when node reset
      * @note Override to implement user application
      */
    virtual void OnInitialize (void);
    
    /** Perform actions when state changed to pre-operational
      * @note Override to implement user application
      */
    virtual void OnPreoperational (void);
    
    /** Perform actions when state changed to operational
      * @note Override to implement user application
      */
    virtual void OnOperational (void);
    
    /** Perform actions when state changed to stop
      * @note Override to implement user application
      */
    virtual void OnStopped (void);
    
    
    /* ========================================================================
     * Object Dictionary
     * ========================================================================
     */

    /** object dictionary */
    ObjectDictionary * pDictionary;

private:    
    
};

} /* namespace ppCANOpen */

#endif // PPCAN_NODE_H