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
Application/include/Node_pin0808.h
- Committer:
- ptpaterson
- Date:
- 2016-03-19
- Revision:
- 10:ec59d628ebdc
File content as of revision 10:ec59d628ebdc:
/** ****************************************************************************** * @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