1 /****************************************************************************
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
8 Description: include file for api function of EplOBD-Module
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
19 2. Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
23 3. Neither the name of SYSTEC electronic GmbH nor the names of its
24 contributors may be used to endorse or promote products derived
25 from this software without prior written permission. For written
26 permission, please contact info@systec-electronic.com.
28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32 COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 POSSIBILITY OF SUCH DAMAGE.
43 If a provision of this License is or becomes illegal, invalid or
44 unenforceable in any jurisdiction, that shall not affect:
45 1. the validity or enforceability in that jurisdiction of any other
46 provision of this License; or
47 2. the validity or enforceability in other jurisdictions of that or
48 any other provision of this License.
50 -------------------------------------------------------------------------
52 $RCSfile: EplObd.h,v $
56 $Revision: 1.5 $ $Date: 2008/04/17 21:36:32 $
63 -------------------------------------------------------------------------
67 2006/06/02 k.t.: start of the implementation, version 1.00
70 ****************************************************************************/
78 // ============================================================================
80 // ============================================================================
82 #define EPL_OBD_TABLE_INDEX_END 0xFFFF
84 // for the usage of BOOLEAN in OD
86 #define OBD_FALSE 0x00
88 // default OD index for Node id
89 #define EPL_OBD_NODE_ID_INDEX 0x1F93
90 // default subindex for NodeId in OD
91 #define EPL_OBD_NODE_ID_SUBINDEX 0x01
92 // default subindex for NodeIDByHW_BOOL
93 #define EPL_OBD_NODE_ID_HWBOOL_SUBINDEX 0x02
95 // ============================================================================
97 // ============================================================================
99 // directions for access to object dictionary
102 kEplObdDirInit = 0x00, // initialising after power on
103 kEplObdDirStore = 0x01, // store all object values to non volatile memory
104 kEplObdDirLoad = 0x02, // load all object values from non volatile memory
105 kEplObdDirRestore = 0x03, // deletes non volatile memory (restore)
106 kEplObdDirOBKCheck = 0xFF // reserved
110 // commands for store
113 kEplObdCommNothing = 0x00,
114 kEplObdCommOpenWrite = 0x01,
115 kEplObdCommWriteObj = 0x02,
116 kEplObdCommCloseWrite = 0x03,
117 kEplObdCommOpenRead = 0x04,
118 kEplObdCommReadObj = 0x05,
119 kEplObdCommCloseRead = 0x06,
120 kEplObdCommClear = 0x07,
121 kEplObdCommUnknown = 0xFF
124 //-----------------------------------------------------------------------------------------------------------
125 // events of object callback function
129 // ---------------------
130 kEplObdEvCheckExist = 0x06, // checking if object does exist (reading and writing) NULL
131 kEplObdEvPreRead = 0x00, // before reading an object source data buffer in OD
132 kEplObdEvPostRead = 0x01, // after reading an object destination data buffer from caller
133 kEplObdEvWrStringDomain = 0x07, // event for changing string/domain data pointer or size struct tEplObdVStringDomain in RAM
134 kEplObdEvInitWrite = 0x04, // initializes writing an object (checking object size) size of object in OD (tEplObdSize)
135 kEplObdEvPreWrite = 0x02, // before writing an object source data buffer from caller
136 kEplObdEvPostWrite = 0x03, // after writing an object destination data buffer in OD
137 // kEplObdEvAbortSdo = 0x05 // after an abort of an SDO transfer
141 // part of OD (bit oriented)
142 typedef unsigned int tEplObdPart;
144 #define kEplObdPartNo 0x00 // nothing
145 #define kEplObdPartGen 0x01 // part (0x1000 - 0x1FFF)
146 #define kEplObdPartMan 0x02 // manufacturer part (0x2000 - 0x5FFF)
147 #define kEplObdPartDev 0x04 // device part (0x6000 - 0x9FFF)
148 #define kEplObdPartUsr 0x08 // dynamic part e.g. for ICE61131-3
151 #define kEplObdPartApp ( kEplObdPartMan | kEplObdPartDev | kEplObdPartUsr) // manufacturer and device part (0x2000 - 0x9FFF) and user OD
152 #define kEplObdPartAll (kEplObdPartGen | kEplObdPartMan | kEplObdPartDev | kEplObdPartUsr) // whole OD
154 //-----------------------------------------------------------------------------------------------------------
155 // access types for objects
156 // must be a difine because bit-flags
157 typedef unsigned int tEplObdAccess;
159 #define kEplObdAccRead 0x01 // object can be read
160 #define kEplObdAccWrite 0x02 // object can be written
161 #define kEplObdAccConst 0x04 // object contains a constant value
162 #define kEplObdAccPdo 0x08 // object can be mapped in a PDO
163 #define kEplObdAccArray 0x10 // object contains an array of numerical values
164 #define kEplObdAccRange 0x20 // object contains lower and upper limit
165 #define kEplObdAccVar 0x40 // object data is placed in application
166 #define kEplObdAccStore 0x80 // object data can be stored to non volatile memory
168 // combinations (not all combinations are required)
169 #define kEplObdAccR (0 | 0 | 0 | 0 | 0 | 0 | kEplObdAccRead)
170 #define kEplObdAccW (0 | 0 | 0 | 0 | 0 | kEplObdAccWrite | 0 )
171 #define kEplObdAccRW (0 | 0 | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
172 #define kEplObdAccCR (0 | 0 | 0 | 0 | kEplObdAccConst | 0 | kEplObdAccRead)
173 #define kEplObdAccGR (0 | 0 | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
174 #define kEplObdAccGW (0 | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
175 #define kEplObdAccGRW (0 | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
176 #define kEplObdAccVR (0 | kEplObdAccVar | 0 | 0 | 0 | 0 | kEplObdAccRead)
177 #define kEplObdAccVW (0 | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | 0 )
178 #define kEplObdAccVRW (0 | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
179 #define kEplObdAccVPR (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
180 #define kEplObdAccVPW (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
181 #define kEplObdAccVPRW (0 | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
182 #define kEplObdAccVGR (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
183 #define kEplObdAccVGW (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
184 #define kEplObdAccVGRW (0 | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
185 #define kEplObdAccVGPR (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
186 #define kEplObdAccVGPW (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
187 #define kEplObdAccVGPRW (0 | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
188 #define kEplObdAccSR (kEplObdAccStore | 0 | 0 | 0 | 0 | 0 | kEplObdAccRead)
189 #define kEplObdAccSW (kEplObdAccStore | 0 | 0 | 0 | 0 | kEplObdAccWrite | 0 )
190 #define kEplObdAccSRW (kEplObdAccStore | 0 | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
191 #define kEplObdAccSCR (kEplObdAccStore | 0 | 0 | 0 | kEplObdAccConst | 0 | kEplObdAccRead)
192 #define kEplObdAccSGR (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
193 #define kEplObdAccSGW (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
194 #define kEplObdAccSGRW (kEplObdAccStore | 0 | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
195 #define kEplObdAccSVR (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | 0 | kEplObdAccRead)
196 #define kEplObdAccSVW (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | 0 )
197 #define kEplObdAccSVRW (kEplObdAccStore | kEplObdAccVar | 0 | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
198 #define kEplObdAccSVPR (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
199 #define kEplObdAccSVPW (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
200 #define kEplObdAccSVPRW (kEplObdAccStore | kEplObdAccVar | 0 | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
201 #define kEplObdAccSVGR (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | 0 | kEplObdAccRead)
202 #define kEplObdAccSVGW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | 0 )
203 #define kEplObdAccSVGRW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | 0 | 0 | kEplObdAccWrite | kEplObdAccRead)
204 #define kEplObdAccSVGPR (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | 0 | kEplObdAccRead)
205 #define kEplObdAccSVGPW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | 0 )
206 #define kEplObdAccSVGPRW (kEplObdAccStore | kEplObdAccVar | kEplObdAccRange | kEplObdAccPdo | 0 | kEplObdAccWrite | kEplObdAccRead)
210 typedef unsigned int tEplObdSize; // For all objects as objects size are used an unsigned int.
213 // -------------------------------------------------------------------------
214 // types for data types defined in DS301
215 // -------------------------------------------------------------------------
217 // types of objects in object dictionary
218 // DS-301 defines these types as WORD
221 // types which are always supported
222 kEplObdTypBool = 0x0001,
224 kEplObdTypInt8 = 0x0002,
225 kEplObdTypInt16 = 0x0003,
226 kEplObdTypInt32 = 0x0004,
227 kEplObdTypUInt8 = 0x0005,
228 kEplObdTypUInt16 = 0x0006,
229 kEplObdTypUInt32 = 0x0007,
230 kEplObdTypReal32 = 0x0008,
231 kEplObdTypVString = 0x0009,
232 kEplObdTypOString = 0x000A,
233 kEplObdTypDomain = 0x000F,
235 kEplObdTypInt24 = 0x0010,
236 kEplObdTypUInt24 = 0x0016,
238 kEplObdTypReal64 = 0x0011,
239 kEplObdTypInt40 = 0x0012,
240 kEplObdTypInt48 = 0x0013,
241 kEplObdTypInt56 = 0x0014,
242 kEplObdTypInt64 = 0x0015,
243 kEplObdTypUInt40 = 0x0018,
244 kEplObdTypUInt48 = 0x0019,
245 kEplObdTypUInt56 = 0x001A,
246 kEplObdTypUInt64 = 0x001B,
247 kEplObdTypTimeOfDay = 0x000C,
248 kEplObdTypTimeDiff = 0x000D
251 // other types are not supported in this version
254 // -------------------------------------------------------------------------
255 // types for data types defined in DS301
256 // -------------------------------------------------------------------------
258 typedef unsigned char tEplObdBoolean; // 0001
259 typedef signed char tEplObdInteger8; // 0002
260 typedef signed short int tEplObdInteger16; // 0003
261 typedef signed long tEplObdInteger32; // 0004
262 typedef unsigned char tEplObdUnsigned8; // 0005
263 typedef unsigned short int tEplObdUnsigned16; // 0006
264 typedef unsigned long tEplObdUnsigned32; // 0007
265 typedef float tEplObdReal32; // 0008
266 typedef unsigned char tEplObdDomain; // 000F
267 typedef signed long tEplObdInteger24; // 0010
268 typedef unsigned long tEplObdUnsigned24; // 0016
270 typedef signed QWORD tEplObdInteger40; // 0012
271 typedef signed QWORD tEplObdInteger48; // 0013
272 typedef signed QWORD tEplObdInteger56; // 0014
273 typedef signed QWORD tEplObdInteger64; // 0015
275 typedef unsigned QWORD tEplObdUnsigned40; // 0018
276 typedef unsigned QWORD tEplObdUnsigned48; // 0019
277 typedef unsigned QWORD tEplObdUnsigned56; // 001A
278 typedef unsigned QWORD tEplObdUnsigned64; // 001B
280 typedef double tEplObdReal64; // 0011
282 typedef tTimeOfDay tEplObdTimeOfDay; // 000C
283 typedef tTimeOfDay tEplObdTimeDifference; // 000D
286 // -------------------------------------------------------------------------
287 // structur for defining a variable
288 // -------------------------------------------------------------------------
289 // -------------------------------------------------------------------------
292 kVarValidSize = 0x01,
293 kVarValidData = 0x02,
294 // kVarValidCallback = 0x04,
295 // kVarValidArg = 0x08,
297 kVarValidAll = 0x03 // currently only size and data are implemented and used
302 typedef tEplKernel (PUBLIC ROM* tEplVarCallback) (CCM_DECL_INSTANCE_HDL_
307 tEplVarParamValid m_ValidFlag;
308 unsigned int m_uiIndex;
309 unsigned int m_uiSubindex;
312 // tEplVarCallback m_fpCallback;
322 #if (EPL_PDO_USE_STATIC_MAPPING == FALSE)
323 tEplVarCallback m_fpCallback;
334 } tEplObdOString; // 000C
340 } tEplObdVString; // 000D
346 char * m_pDefString; // $$$ d.k. it is unused, so we could delete it
354 BYTE * m_pDefString; // $$$ d.k. it is unused, so we could delete it
359 //r.d. parameter struct for changing object size and/or pointer to data of Strings or Domains
362 tEplObdSize m_DownloadSize; // download size from SDO or APP
363 tEplObdSize m_ObjSize; // current object size from OD - should be changed from callback function
364 void * m_pData; // current object ptr from OD - should be changed from callback function
366 } tEplObdVStringDomain; // 000D
369 // ============================================================================
371 // ============================================================================
372 // -------------------------------------------------------------------------
374 // -------------------------------------------------------------------------
376 // Change not the order for this struct!!!
379 unsigned int m_uiSubIndex;
381 tEplObdAccess m_Access;
383 void MEM* m_pCurrent; // points always to RAM
387 // r.d.: has always to be because new OBD-Macros for arrays
388 typedef tEplObdSubEntry * tEplObdSubEntryPtr;
390 // -------------------------------------------------------------------------
391 // callback function for objdictionary modul
392 // -------------------------------------------------------------------------
394 // parameters for callback function
397 tEplObdEvent m_ObdEvent;
398 unsigned int m_uiIndex;
399 unsigned int m_uiSubIndex;
405 // define type for callback function: pParam_p points to tEplObdCbParam
406 typedef tEplKernel (PUBLIC ROM* tEplObdCallback) (CCM_DECL_INSTANCE_HDL_
407 tEplObdCbParam MEM* pParam_p);
409 // do not change the order for this struct!!!
413 unsigned int m_uiIndex;
414 tEplObdSubEntryPtr m_pSubIndex;
415 unsigned int m_uiCount;
416 tEplObdCallback m_fpCallback; // function is called back if object access
422 typedef tEplObdEntry * tEplObdEntryPtr;
426 // -------------------------------------------------------------------------
427 // structur to initialize OBD module
428 // -------------------------------------------------------------------------
432 tEplObdEntryPtr m_pPart;
433 tEplObdEntryPtr m_pManufacturerPart;
434 tEplObdEntryPtr m_pDevicePart;
436 #if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
438 tEplObdEntryPtr m_pUserPart;
445 // -------------------------------------------------------------------------
446 // structur for parameters of STORE RESTORE command
447 // -------------------------------------------------------------------------
451 tEplObdCommand m_bCommand;
452 tEplObdPart m_bCurrentOdPart;
454 tEplObdSize m_ObjSize;
456 } tEplObdCbStoreParam;
459 typedef tEplKernel (PUBLIC ROM* tInitTabEntryCallback) (
460 void MEM* pTabEntry_p,
461 unsigned int uiObjIndex_p);
463 typedef tEplKernel (PUBLIC ROM* tEplObdStoreLoadObjCallback) (CCM_DECL_INSTANCE_HDL_
464 tEplObdCbStoreParam MEM* pCbStoreParam_p);
466 // -------------------------------------------------------------------------
467 // this stucture is used for parameters for function ObdInitModuleTab()
468 // -------------------------------------------------------------------------
471 unsigned int m_uiLowerObjIndex; // lower limit of ObjIndex
472 unsigned int m_uiUpperObjIndex; // upper limit of ObjIndex
473 tInitTabEntryCallback m_fpInitTabEntry; // will be called if ObjIndex was found
474 void MEM* m_pTabBase; // base address of table
475 unsigned int m_uiEntrySize; // size of table entry // 25-feb-2005 r.d.: expansion from BYTE to WORD necessary for PDO bit mapping
476 unsigned int m_uiMaxEntries; // max. tabel entries
478 } tEplObdModulTabParam;
480 //-------------------------------------------------------------------
481 // enum for function EplObdSetNodeId
482 //-------------------------------------------------------------------
485 kEplObdNodeIdUnknown = 0x00, // unknown how the node id was set
486 kEplObdNodeIdSoftware = 0x01, // node id set by software
487 kEplObdNodeIdHardware = 0x02 // node id set by hardware
491 // ============================================================================
493 // ============================================================================
497 // ============================================================================
499 // ============================================================================
502 #endif // #ifndef _EPLOBD_H_