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.

Dependencies:   CANnucleo mbed ppCANOpen

Revision:
10:ec59d628ebdc
diff -r 8352cfe17ab1 -r ec59d628ebdc Application/include/Node_pin0808.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Application/include/Node_pin0808.h	Sat Mar 19 01:44:35 2016 +0000
@@ -0,0 +1,269 @@
+/**
+ ******************************************************************************
+ * @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_PIN0808_H
+#define PPCAN_NODE_PIN0808_H
+
+#include "Node.h"
+
+namespace ppCANOpen
+{
+    
+/** Custom Object Dictionary for pinball io_0808 device.
+  */
+class Node_pin0808 : public Node
+{
+    
+public:
+    Node_pin0808(int id, ServiceProvider * provider, int bLoop = 0);
+    virtual ~Node_pin0808(void);
+
+private:
+    /* constants */
+    /** milliseconds necessary to debounce all input */
+    static const uint8_t DEBOUNCE_TIME = 3;
+
+    /* IO details */
+    uint8_t prevInputBuffers[1];
+    uint8_t inputDebounce[8];    
+    
+    uint8_t prevOutputBuffers[1];
+    int scheduleIndexTime; 
+
+    /**************************************************************************
+     * Implementation Overrides 
+     **************************************************************************
+     */
+
+    /* Application run */
+    virtual void OnFixedUpdate(void);
+    virtual void OnUpdate(void);
+
+    /* SYNC */
+    virtual void OnSync (uint8_t counter);
+
+    /* NMT Control */  
+    virtual void OnInitialize (void);
+    virtual void OnPreoperational (void);
+    virtual void OnOperational (void);
+    virtual void OnStopped (void);
+    
+    
+    /**************************************************************************
+     * Object Dictionary 
+     **************************************************************************
+     */
+    
+    /* Communication --------------------------------------------------------*/
+    /* index 0x1200 :   SDO Server */
+    ObjectData      Obj1200;
+    SubIndexSize    Obj1200_highestSubIndex;
+    uint32_t        Obj1200_ReceiveCobId;
+    uint32_t        Obj1200_TransmitCobId;
+    EntryData       Obj1200_entries[3];
+    
+    /* index 0x1400 :   Receive PDO 1 Parameter (Write Digital Output) */
+    ObjectData      Obj1400;
+    SubIndexSize    Obj1400_highestSubIndex;
+    uint32_t        Obj1400_CobId;
+    uint8_t         Obj1400_TransmissionType;
+    uint16_t        Obj1400_InhibitTime;
+    uint8_t         Obj1400_CompatibilityEntry;
+    uint16_t        Obj1400_EventTimer;
+    EntryData       Obj1400_entries[6];
+    
+    /* index 0x1401 :   Receive PDO 2 Parameter (Write Output Configuration) */
+    ObjectData      Obj1401;
+    SubIndexSize    Obj1401_highestSubIndex;
+    uint32_t        Obj1401_CobId;
+    uint8_t         Obj1401_TransmissionType;
+    uint16_t        Obj1401_InhibitTime;
+    uint8_t         Obj1401_CompatibilityEntry;
+    uint16_t        Obj1401_EventTimer;
+    EntryData       Obj1401_entries[6];
+    
+    /* index 0x1402 :   Receive PDO 3 Parameter (Write/Clear Autotrigger Rule) */
+    ObjectData      Obj1402;
+    SubIndexSize    Obj1402_highestSubIndex;
+    uint32_t        Obj1402_CobId;
+    uint8_t         Obj1402_TransmissionType;
+    uint16_t        Obj1402_InhibitTime;
+    uint8_t         Obj1402_CompatibilityEntry;
+    uint16_t        Obj1402_EventTimer;
+    EntryData       Obj1402_entries[6];
+    
+    /* index 0x1403 :   Receive PDO 5 Parameter (input changes) */
+    ObjectData      Obj1403;
+    SubIndexSize    Obj1403_highestSubIndex;
+    uint32_t        Obj1403_CobId;
+    uint8_t         Obj1403_TransmissionType;
+    uint16_t        Obj1403_InhibitTime;
+    uint8_t         Obj1403_CompatibilityEntry;
+    uint16_t        Obj1403_EventTimer;
+    EntryData       Obj1403_entries[6];
+    
+    /* index 0x1600 :   Receive PDO 1 Mapping */
+    ObjectData      Obj1600;
+    SubIndexSize    Obj1600_highestSubIndex;
+    uint32_t        Obj1600_Map;
+    EntryData       Obj1600_entries[2];
+    
+    /* index 0x1601 :   Transmit PDO 1 Mapping */
+    ObjectData      Obj1601;
+    SubIndexSize    Obj1601_highestSubIndex;
+    uint32_t        Obj1601_Map;
+    EntryData       Obj1601_entries[2];
+    
+    /* index 0x1602 :   Transmit PDO 1 Mapping */
+    ObjectData      Obj1602;
+    SubIndexSize    Obj1602_highestSubIndex;
+    uint32_t        Obj1602_Map;
+    EntryData       Obj1602_entries[2];
+    
+    /* index 0x1603 :   Receive PDO 2 Mapping */
+    ObjectData      Obj1603;
+    SubIndexSize    Obj1603_highestSubIndex;
+    uint32_t        Obj1603_Map;
+    EntryData       Obj1603_entries[2];
+    
+    
+    /* index 0x1800 :   Transmit PDO 1 Parameter */
+    ObjectData      Obj1800;
+    SubIndexSize    Obj1800_highestSubIndex;
+    uint32_t        Obj1800_CobId;
+    uint8_t         Obj1800_TransmissionType;
+    uint16_t        Obj1800_InhibitTime;
+    uint8_t         Obj1800_CompatibilityEntry;
+    uint16_t        Obj1800_EventTimer;
+    EntryData       Obj1800_entries[6];
+    
+    /* index 0x1A00 :   Transmit PDO 1 Mapping */
+    ObjectData      Obj1A00;
+    SubIndexSize    Obj1A00_highestSubIndex;
+    uint32_t        Obj1A00_MapInput;
+    uint32_t        Obj1A00_MapVoid16;
+    uint32_t        Obj1A00_MapChange;
+    uint32_t        Obj1A00_MapSourceId;
+    EntryData       Obj1A00_entries[6];
+    
+    
+    /* Manufacturer Specific ------------------------------------------------*/
+    /* index 0x2001 : Pin Output Configurations */
+    struct OutputConfiguration {
+        static const uint8_t PULSE          = 0x01;
+        static const uint8_t PATTER         = 0x02;
+        static const uint8_t PULSED_PATTER  = 0x04;
+        //static const uint8_t SCHEDULED      = 0x08;
+          
+        uint8_t     type;
+        uint8_t     pulse_ms;
+        uint8_t     pwm_on;
+        uint8_t     pwm_off;
+        uint32_t    writeData;
+    };
+    
+    ObjectData          Obj2001;
+    SubIndexSize        Obj2001_highestSubIndex;
+    OutputConfiguration writeOutputConfig;
+    OutputConfiguration outputConfigs[8];
+    OutputConfiguration outputTimers[8]; /* not actually part of dictionary */
+    EntryData           Obj2001_entries[10];
+    
+    /* index 0x2002 : Output Schedule Configuration */
+    ObjectData      Obj2002;
+    SubIndexSize    Obj2002_highestSubIndex;
+    uint32_t        scheduleConfig;
+    uint32_t        schedules[8];  
+    EntryData       Obj2002_entries[10];
+    
+    /* index 0x2100 : Input change data */
+    ObjectData      Obj2100;
+    SubIndexSize    Obj2100_highestSubIndex;
+    uint8_t         inputChangeMask[1];  
+    /* uint8_t         nodeId; */
+    EntryData       Obj2100_entries[3];
+        
+    /* index 0x2200 : Autotrigger Rules */
+    struct AutotriggerRule {
+        uint8_t     sourceId;
+        uint8_t     input; /* 0-4: inputNum (0-23)
+                              5-7: 0 on inactive
+                                   1 on active
+                                   2 on any change
+                                   3 ???
+                            */
+        uint8_t     setMask[3];
+        uint8_t     clearMask[3];  
+    };
+    
+    struct AutotriggerMessage {
+        uint8_t     input[3];
+        uint8_t     change[3];
+        uint8_t     sourceId;
+    };
+    
+    ObjectData          Obj2200;
+    SubIndexSize        Obj2200_highestSubIndex;
+    AutotriggerRule     writeRule;
+    AutotriggerMessage  autotriggerMessage;
+    AutotriggerRule     rules[24];
+    EntryData           Obj2200_entries[27];
+
+    
+    /* Device Specific ------------------------------------------------------*/
+    /* index 0x6000 :   Mapped variable "inputs" */
+    ObjectData      Obj6000;
+    SubIndexSize    Obj6000_highestSubIndex; 
+    uint8_t         readInputBuffers[1];
+    EntryData       Obj6000_entries[2];
+    
+    /* index 0x6005 :   Global Input Interrupt Enable */
+    ObjectData      Obj6005;
+    SubIndexSize    Obj6005_highestSubIndex; 
+    uint8_t         bInputInterruptEnable;
+    EntryData       Obj6005_entries[2];
+    
+    /* index 0x6006 :   Any Change Interrupt Mask */
+    ObjectData      Obj6006;
+    SubIndexSize    Obj6006_highestSubIndex; 
+    uint8_t         inputInterruptMask[1];
+    EntryData       Obj6006_entries[2];
+    
+    /* index 0x6200 :   Mapped variable "outputs" */
+    ObjectData      Obj6200;
+    SubIndexSize    Obj6200_highestSubIndex; 
+    uint8_t         writeOutputBuffers[1];
+    EntryData       Obj6200_entries[2];
+    
+    /* Scan Method */
+    virtual ObjectData * ScanIndex(IndexSize index);
+};
+
+} /* namespace ppCANOpen */
+
+#endif // PPCAN_NODE_PIN0808_H