![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: Application/include/Node_pin0808.h
- Revision:
- 10:ec59d628ebdc
--- /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>© 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