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

Committer:
ptpaterson
Date:
Sat Mar 19 01:44:35 2016 +0000
Revision:
10:ec59d628ebdc
Final Submission (probs)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ptpaterson 10:ec59d628ebdc 1 /**
ptpaterson 10:ec59d628ebdc 2 ******************************************************************************
ptpaterson 10:ec59d628ebdc 3 * @file
ptpaterson 10:ec59d628ebdc 4 * @author Paul Paterson
ptpaterson 10:ec59d628ebdc 5 * @version
ptpaterson 10:ec59d628ebdc 6 * @date 2015-12-14
ptpaterson 10:ec59d628ebdc 7 * @brief CANOpen implementation library
ptpaterson 10:ec59d628ebdc 8 ******************************************************************************
ptpaterson 10:ec59d628ebdc 9 * @attention
ptpaterson 10:ec59d628ebdc 10 *
ptpaterson 10:ec59d628ebdc 11 * <h2><center>&copy; COPYRIGHT(c) 2015 Paul Paterson
ptpaterson 10:ec59d628ebdc 12 *
ptpaterson 10:ec59d628ebdc 13 * All rights reserved.
ptpaterson 10:ec59d628ebdc 14
ptpaterson 10:ec59d628ebdc 15 This program is free software: you can redistribute it and/or modify
ptpaterson 10:ec59d628ebdc 16 it under the terms of the GNU General Public License as published by
ptpaterson 10:ec59d628ebdc 17 the Free Software Foundation, either version 3 of the License, or
ptpaterson 10:ec59d628ebdc 18 (at your option) any later version.
ptpaterson 10:ec59d628ebdc 19
ptpaterson 10:ec59d628ebdc 20 This program is distributed in the hope that it will be useful,
ptpaterson 10:ec59d628ebdc 21 but WITHOUT ANY WARRANTY; without even the implied warranty of
ptpaterson 10:ec59d628ebdc 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ptpaterson 10:ec59d628ebdc 23 GNU General Public License for more details.
ptpaterson 10:ec59d628ebdc 24
ptpaterson 10:ec59d628ebdc 25 You should have received a copy of the GNU General Public License
ptpaterson 10:ec59d628ebdc 26 along with this program. If not, see <http://www.gnu.org/licenses/>.
ptpaterson 10:ec59d628ebdc 27 */
ptpaterson 10:ec59d628ebdc 28
ptpaterson 10:ec59d628ebdc 29 #ifndef PPCAN_NODE_PIN0808_H
ptpaterson 10:ec59d628ebdc 30 #define PPCAN_NODE_PIN0808_H
ptpaterson 10:ec59d628ebdc 31
ptpaterson 10:ec59d628ebdc 32 #include "Node.h"
ptpaterson 10:ec59d628ebdc 33
ptpaterson 10:ec59d628ebdc 34 namespace ppCANOpen
ptpaterson 10:ec59d628ebdc 35 {
ptpaterson 10:ec59d628ebdc 36
ptpaterson 10:ec59d628ebdc 37 /** Custom Object Dictionary for pinball io_0808 device.
ptpaterson 10:ec59d628ebdc 38 */
ptpaterson 10:ec59d628ebdc 39 class Node_pin0808 : public Node
ptpaterson 10:ec59d628ebdc 40 {
ptpaterson 10:ec59d628ebdc 41
ptpaterson 10:ec59d628ebdc 42 public:
ptpaterson 10:ec59d628ebdc 43 Node_pin0808(int id, ServiceProvider * provider, int bLoop = 0);
ptpaterson 10:ec59d628ebdc 44 virtual ~Node_pin0808(void);
ptpaterson 10:ec59d628ebdc 45
ptpaterson 10:ec59d628ebdc 46 private:
ptpaterson 10:ec59d628ebdc 47 /* constants */
ptpaterson 10:ec59d628ebdc 48 /** milliseconds necessary to debounce all input */
ptpaterson 10:ec59d628ebdc 49 static const uint8_t DEBOUNCE_TIME = 3;
ptpaterson 10:ec59d628ebdc 50
ptpaterson 10:ec59d628ebdc 51 /* IO details */
ptpaterson 10:ec59d628ebdc 52 uint8_t prevInputBuffers[1];
ptpaterson 10:ec59d628ebdc 53 uint8_t inputDebounce[8];
ptpaterson 10:ec59d628ebdc 54
ptpaterson 10:ec59d628ebdc 55 uint8_t prevOutputBuffers[1];
ptpaterson 10:ec59d628ebdc 56 int scheduleIndexTime;
ptpaterson 10:ec59d628ebdc 57
ptpaterson 10:ec59d628ebdc 58 /**************************************************************************
ptpaterson 10:ec59d628ebdc 59 * Implementation Overrides
ptpaterson 10:ec59d628ebdc 60 **************************************************************************
ptpaterson 10:ec59d628ebdc 61 */
ptpaterson 10:ec59d628ebdc 62
ptpaterson 10:ec59d628ebdc 63 /* Application run */
ptpaterson 10:ec59d628ebdc 64 virtual void OnFixedUpdate(void);
ptpaterson 10:ec59d628ebdc 65 virtual void OnUpdate(void);
ptpaterson 10:ec59d628ebdc 66
ptpaterson 10:ec59d628ebdc 67 /* SYNC */
ptpaterson 10:ec59d628ebdc 68 virtual void OnSync (uint8_t counter);
ptpaterson 10:ec59d628ebdc 69
ptpaterson 10:ec59d628ebdc 70 /* NMT Control */
ptpaterson 10:ec59d628ebdc 71 virtual void OnInitialize (void);
ptpaterson 10:ec59d628ebdc 72 virtual void OnPreoperational (void);
ptpaterson 10:ec59d628ebdc 73 virtual void OnOperational (void);
ptpaterson 10:ec59d628ebdc 74 virtual void OnStopped (void);
ptpaterson 10:ec59d628ebdc 75
ptpaterson 10:ec59d628ebdc 76
ptpaterson 10:ec59d628ebdc 77 /**************************************************************************
ptpaterson 10:ec59d628ebdc 78 * Object Dictionary
ptpaterson 10:ec59d628ebdc 79 **************************************************************************
ptpaterson 10:ec59d628ebdc 80 */
ptpaterson 10:ec59d628ebdc 81
ptpaterson 10:ec59d628ebdc 82 /* Communication --------------------------------------------------------*/
ptpaterson 10:ec59d628ebdc 83 /* index 0x1200 : SDO Server */
ptpaterson 10:ec59d628ebdc 84 ObjectData Obj1200;
ptpaterson 10:ec59d628ebdc 85 SubIndexSize Obj1200_highestSubIndex;
ptpaterson 10:ec59d628ebdc 86 uint32_t Obj1200_ReceiveCobId;
ptpaterson 10:ec59d628ebdc 87 uint32_t Obj1200_TransmitCobId;
ptpaterson 10:ec59d628ebdc 88 EntryData Obj1200_entries[3];
ptpaterson 10:ec59d628ebdc 89
ptpaterson 10:ec59d628ebdc 90 /* index 0x1400 : Receive PDO 1 Parameter (Write Digital Output) */
ptpaterson 10:ec59d628ebdc 91 ObjectData Obj1400;
ptpaterson 10:ec59d628ebdc 92 SubIndexSize Obj1400_highestSubIndex;
ptpaterson 10:ec59d628ebdc 93 uint32_t Obj1400_CobId;
ptpaterson 10:ec59d628ebdc 94 uint8_t Obj1400_TransmissionType;
ptpaterson 10:ec59d628ebdc 95 uint16_t Obj1400_InhibitTime;
ptpaterson 10:ec59d628ebdc 96 uint8_t Obj1400_CompatibilityEntry;
ptpaterson 10:ec59d628ebdc 97 uint16_t Obj1400_EventTimer;
ptpaterson 10:ec59d628ebdc 98 EntryData Obj1400_entries[6];
ptpaterson 10:ec59d628ebdc 99
ptpaterson 10:ec59d628ebdc 100 /* index 0x1401 : Receive PDO 2 Parameter (Write Output Configuration) */
ptpaterson 10:ec59d628ebdc 101 ObjectData Obj1401;
ptpaterson 10:ec59d628ebdc 102 SubIndexSize Obj1401_highestSubIndex;
ptpaterson 10:ec59d628ebdc 103 uint32_t Obj1401_CobId;
ptpaterson 10:ec59d628ebdc 104 uint8_t Obj1401_TransmissionType;
ptpaterson 10:ec59d628ebdc 105 uint16_t Obj1401_InhibitTime;
ptpaterson 10:ec59d628ebdc 106 uint8_t Obj1401_CompatibilityEntry;
ptpaterson 10:ec59d628ebdc 107 uint16_t Obj1401_EventTimer;
ptpaterson 10:ec59d628ebdc 108 EntryData Obj1401_entries[6];
ptpaterson 10:ec59d628ebdc 109
ptpaterson 10:ec59d628ebdc 110 /* index 0x1402 : Receive PDO 3 Parameter (Write/Clear Autotrigger Rule) */
ptpaterson 10:ec59d628ebdc 111 ObjectData Obj1402;
ptpaterson 10:ec59d628ebdc 112 SubIndexSize Obj1402_highestSubIndex;
ptpaterson 10:ec59d628ebdc 113 uint32_t Obj1402_CobId;
ptpaterson 10:ec59d628ebdc 114 uint8_t Obj1402_TransmissionType;
ptpaterson 10:ec59d628ebdc 115 uint16_t Obj1402_InhibitTime;
ptpaterson 10:ec59d628ebdc 116 uint8_t Obj1402_CompatibilityEntry;
ptpaterson 10:ec59d628ebdc 117 uint16_t Obj1402_EventTimer;
ptpaterson 10:ec59d628ebdc 118 EntryData Obj1402_entries[6];
ptpaterson 10:ec59d628ebdc 119
ptpaterson 10:ec59d628ebdc 120 /* index 0x1403 : Receive PDO 5 Parameter (input changes) */
ptpaterson 10:ec59d628ebdc 121 ObjectData Obj1403;
ptpaterson 10:ec59d628ebdc 122 SubIndexSize Obj1403_highestSubIndex;
ptpaterson 10:ec59d628ebdc 123 uint32_t Obj1403_CobId;
ptpaterson 10:ec59d628ebdc 124 uint8_t Obj1403_TransmissionType;
ptpaterson 10:ec59d628ebdc 125 uint16_t Obj1403_InhibitTime;
ptpaterson 10:ec59d628ebdc 126 uint8_t Obj1403_CompatibilityEntry;
ptpaterson 10:ec59d628ebdc 127 uint16_t Obj1403_EventTimer;
ptpaterson 10:ec59d628ebdc 128 EntryData Obj1403_entries[6];
ptpaterson 10:ec59d628ebdc 129
ptpaterson 10:ec59d628ebdc 130 /* index 0x1600 : Receive PDO 1 Mapping */
ptpaterson 10:ec59d628ebdc 131 ObjectData Obj1600;
ptpaterson 10:ec59d628ebdc 132 SubIndexSize Obj1600_highestSubIndex;
ptpaterson 10:ec59d628ebdc 133 uint32_t Obj1600_Map;
ptpaterson 10:ec59d628ebdc 134 EntryData Obj1600_entries[2];
ptpaterson 10:ec59d628ebdc 135
ptpaterson 10:ec59d628ebdc 136 /* index 0x1601 : Transmit PDO 1 Mapping */
ptpaterson 10:ec59d628ebdc 137 ObjectData Obj1601;
ptpaterson 10:ec59d628ebdc 138 SubIndexSize Obj1601_highestSubIndex;
ptpaterson 10:ec59d628ebdc 139 uint32_t Obj1601_Map;
ptpaterson 10:ec59d628ebdc 140 EntryData Obj1601_entries[2];
ptpaterson 10:ec59d628ebdc 141
ptpaterson 10:ec59d628ebdc 142 /* index 0x1602 : Transmit PDO 1 Mapping */
ptpaterson 10:ec59d628ebdc 143 ObjectData Obj1602;
ptpaterson 10:ec59d628ebdc 144 SubIndexSize Obj1602_highestSubIndex;
ptpaterson 10:ec59d628ebdc 145 uint32_t Obj1602_Map;
ptpaterson 10:ec59d628ebdc 146 EntryData Obj1602_entries[2];
ptpaterson 10:ec59d628ebdc 147
ptpaterson 10:ec59d628ebdc 148 /* index 0x1603 : Receive PDO 2 Mapping */
ptpaterson 10:ec59d628ebdc 149 ObjectData Obj1603;
ptpaterson 10:ec59d628ebdc 150 SubIndexSize Obj1603_highestSubIndex;
ptpaterson 10:ec59d628ebdc 151 uint32_t Obj1603_Map;
ptpaterson 10:ec59d628ebdc 152 EntryData Obj1603_entries[2];
ptpaterson 10:ec59d628ebdc 153
ptpaterson 10:ec59d628ebdc 154
ptpaterson 10:ec59d628ebdc 155 /* index 0x1800 : Transmit PDO 1 Parameter */
ptpaterson 10:ec59d628ebdc 156 ObjectData Obj1800;
ptpaterson 10:ec59d628ebdc 157 SubIndexSize Obj1800_highestSubIndex;
ptpaterson 10:ec59d628ebdc 158 uint32_t Obj1800_CobId;
ptpaterson 10:ec59d628ebdc 159 uint8_t Obj1800_TransmissionType;
ptpaterson 10:ec59d628ebdc 160 uint16_t Obj1800_InhibitTime;
ptpaterson 10:ec59d628ebdc 161 uint8_t Obj1800_CompatibilityEntry;
ptpaterson 10:ec59d628ebdc 162 uint16_t Obj1800_EventTimer;
ptpaterson 10:ec59d628ebdc 163 EntryData Obj1800_entries[6];
ptpaterson 10:ec59d628ebdc 164
ptpaterson 10:ec59d628ebdc 165 /* index 0x1A00 : Transmit PDO 1 Mapping */
ptpaterson 10:ec59d628ebdc 166 ObjectData Obj1A00;
ptpaterson 10:ec59d628ebdc 167 SubIndexSize Obj1A00_highestSubIndex;
ptpaterson 10:ec59d628ebdc 168 uint32_t Obj1A00_MapInput;
ptpaterson 10:ec59d628ebdc 169 uint32_t Obj1A00_MapVoid16;
ptpaterson 10:ec59d628ebdc 170 uint32_t Obj1A00_MapChange;
ptpaterson 10:ec59d628ebdc 171 uint32_t Obj1A00_MapSourceId;
ptpaterson 10:ec59d628ebdc 172 EntryData Obj1A00_entries[6];
ptpaterson 10:ec59d628ebdc 173
ptpaterson 10:ec59d628ebdc 174
ptpaterson 10:ec59d628ebdc 175 /* Manufacturer Specific ------------------------------------------------*/
ptpaterson 10:ec59d628ebdc 176 /* index 0x2001 : Pin Output Configurations */
ptpaterson 10:ec59d628ebdc 177 struct OutputConfiguration {
ptpaterson 10:ec59d628ebdc 178 static const uint8_t PULSE = 0x01;
ptpaterson 10:ec59d628ebdc 179 static const uint8_t PATTER = 0x02;
ptpaterson 10:ec59d628ebdc 180 static const uint8_t PULSED_PATTER = 0x04;
ptpaterson 10:ec59d628ebdc 181 //static const uint8_t SCHEDULED = 0x08;
ptpaterson 10:ec59d628ebdc 182
ptpaterson 10:ec59d628ebdc 183 uint8_t type;
ptpaterson 10:ec59d628ebdc 184 uint8_t pulse_ms;
ptpaterson 10:ec59d628ebdc 185 uint8_t pwm_on;
ptpaterson 10:ec59d628ebdc 186 uint8_t pwm_off;
ptpaterson 10:ec59d628ebdc 187 uint32_t writeData;
ptpaterson 10:ec59d628ebdc 188 };
ptpaterson 10:ec59d628ebdc 189
ptpaterson 10:ec59d628ebdc 190 ObjectData Obj2001;
ptpaterson 10:ec59d628ebdc 191 SubIndexSize Obj2001_highestSubIndex;
ptpaterson 10:ec59d628ebdc 192 OutputConfiguration writeOutputConfig;
ptpaterson 10:ec59d628ebdc 193 OutputConfiguration outputConfigs[8];
ptpaterson 10:ec59d628ebdc 194 OutputConfiguration outputTimers[8]; /* not actually part of dictionary */
ptpaterson 10:ec59d628ebdc 195 EntryData Obj2001_entries[10];
ptpaterson 10:ec59d628ebdc 196
ptpaterson 10:ec59d628ebdc 197 /* index 0x2002 : Output Schedule Configuration */
ptpaterson 10:ec59d628ebdc 198 ObjectData Obj2002;
ptpaterson 10:ec59d628ebdc 199 SubIndexSize Obj2002_highestSubIndex;
ptpaterson 10:ec59d628ebdc 200 uint32_t scheduleConfig;
ptpaterson 10:ec59d628ebdc 201 uint32_t schedules[8];
ptpaterson 10:ec59d628ebdc 202 EntryData Obj2002_entries[10];
ptpaterson 10:ec59d628ebdc 203
ptpaterson 10:ec59d628ebdc 204 /* index 0x2100 : Input change data */
ptpaterson 10:ec59d628ebdc 205 ObjectData Obj2100;
ptpaterson 10:ec59d628ebdc 206 SubIndexSize Obj2100_highestSubIndex;
ptpaterson 10:ec59d628ebdc 207 uint8_t inputChangeMask[1];
ptpaterson 10:ec59d628ebdc 208 /* uint8_t nodeId; */
ptpaterson 10:ec59d628ebdc 209 EntryData Obj2100_entries[3];
ptpaterson 10:ec59d628ebdc 210
ptpaterson 10:ec59d628ebdc 211 /* index 0x2200 : Autotrigger Rules */
ptpaterson 10:ec59d628ebdc 212 struct AutotriggerRule {
ptpaterson 10:ec59d628ebdc 213 uint8_t sourceId;
ptpaterson 10:ec59d628ebdc 214 uint8_t input; /* 0-4: inputNum (0-23)
ptpaterson 10:ec59d628ebdc 215 5-7: 0 on inactive
ptpaterson 10:ec59d628ebdc 216 1 on active
ptpaterson 10:ec59d628ebdc 217 2 on any change
ptpaterson 10:ec59d628ebdc 218 3 ???
ptpaterson 10:ec59d628ebdc 219 */
ptpaterson 10:ec59d628ebdc 220 uint8_t setMask[3];
ptpaterson 10:ec59d628ebdc 221 uint8_t clearMask[3];
ptpaterson 10:ec59d628ebdc 222 };
ptpaterson 10:ec59d628ebdc 223
ptpaterson 10:ec59d628ebdc 224 struct AutotriggerMessage {
ptpaterson 10:ec59d628ebdc 225 uint8_t input[3];
ptpaterson 10:ec59d628ebdc 226 uint8_t change[3];
ptpaterson 10:ec59d628ebdc 227 uint8_t sourceId;
ptpaterson 10:ec59d628ebdc 228 };
ptpaterson 10:ec59d628ebdc 229
ptpaterson 10:ec59d628ebdc 230 ObjectData Obj2200;
ptpaterson 10:ec59d628ebdc 231 SubIndexSize Obj2200_highestSubIndex;
ptpaterson 10:ec59d628ebdc 232 AutotriggerRule writeRule;
ptpaterson 10:ec59d628ebdc 233 AutotriggerMessage autotriggerMessage;
ptpaterson 10:ec59d628ebdc 234 AutotriggerRule rules[24];
ptpaterson 10:ec59d628ebdc 235 EntryData Obj2200_entries[27];
ptpaterson 10:ec59d628ebdc 236
ptpaterson 10:ec59d628ebdc 237
ptpaterson 10:ec59d628ebdc 238 /* Device Specific ------------------------------------------------------*/
ptpaterson 10:ec59d628ebdc 239 /* index 0x6000 : Mapped variable "inputs" */
ptpaterson 10:ec59d628ebdc 240 ObjectData Obj6000;
ptpaterson 10:ec59d628ebdc 241 SubIndexSize Obj6000_highestSubIndex;
ptpaterson 10:ec59d628ebdc 242 uint8_t readInputBuffers[1];
ptpaterson 10:ec59d628ebdc 243 EntryData Obj6000_entries[2];
ptpaterson 10:ec59d628ebdc 244
ptpaterson 10:ec59d628ebdc 245 /* index 0x6005 : Global Input Interrupt Enable */
ptpaterson 10:ec59d628ebdc 246 ObjectData Obj6005;
ptpaterson 10:ec59d628ebdc 247 SubIndexSize Obj6005_highestSubIndex;
ptpaterson 10:ec59d628ebdc 248 uint8_t bInputInterruptEnable;
ptpaterson 10:ec59d628ebdc 249 EntryData Obj6005_entries[2];
ptpaterson 10:ec59d628ebdc 250
ptpaterson 10:ec59d628ebdc 251 /* index 0x6006 : Any Change Interrupt Mask */
ptpaterson 10:ec59d628ebdc 252 ObjectData Obj6006;
ptpaterson 10:ec59d628ebdc 253 SubIndexSize Obj6006_highestSubIndex;
ptpaterson 10:ec59d628ebdc 254 uint8_t inputInterruptMask[1];
ptpaterson 10:ec59d628ebdc 255 EntryData Obj6006_entries[2];
ptpaterson 10:ec59d628ebdc 256
ptpaterson 10:ec59d628ebdc 257 /* index 0x6200 : Mapped variable "outputs" */
ptpaterson 10:ec59d628ebdc 258 ObjectData Obj6200;
ptpaterson 10:ec59d628ebdc 259 SubIndexSize Obj6200_highestSubIndex;
ptpaterson 10:ec59d628ebdc 260 uint8_t writeOutputBuffers[1];
ptpaterson 10:ec59d628ebdc 261 EntryData Obj6200_entries[2];
ptpaterson 10:ec59d628ebdc 262
ptpaterson 10:ec59d628ebdc 263 /* Scan Method */
ptpaterson 10:ec59d628ebdc 264 virtual ObjectData * ScanIndex(IndexSize index);
ptpaterson 10:ec59d628ebdc 265 };
ptpaterson 10:ec59d628ebdc 266
ptpaterson 10:ec59d628ebdc 267 } /* namespace ppCANOpen */
ptpaterson 10:ec59d628ebdc 268
ptpaterson 10:ec59d628ebdc 269 #endif // PPCAN_NODE_PIN0808_H