diff -r f712705bef65 -r 423ea3749212 lib/C/iec_types_all.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/C/iec_types_all.h Sun Jul 06 11:07:38 2014 +0100 @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2007-2011: Edouard TISSERANT and Laurent BESSARD + * + * See COPYING and COPYING.LESSER files for copyright details. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + * + */ + +#ifndef IEC_TYPES_ALL_H +#define IEC_TYPES_ALL_H + + +/* Macro that expand to subtypes */ +#define __ANY(DO) __ANY_DERIVED(DO) __ANY_ELEMENTARY(DO) +#define __ANY_DERIVED(DO) +#define __ANY_ELEMENTARY(DO) __ANY_MAGNITUDE(DO) __ANY_BIT(DO) __ANY_STRING(DO) __ANY_DATE(DO) +#define __ANY_MAGNITUDE(DO) __ANY_NUM(DO) DO(TIME) +#define __ANY_BIT(DO) __ANY_NBIT(DO) DO(BOOL) +#define __ANY_NBIT(DO) DO(BYTE) DO(WORD) DO(DWORD) DO(LWORD) +#define __ANY_STRING(DO) DO(STRING) +#define __ANY_DATE(DO) DO(DATE) DO(TOD) DO(DT) +#define __ANY_NUM(DO) __ANY_REAL(DO) __ANY_INT(DO) +#define __ANY_REAL(DO) DO(REAL) DO(LREAL) +#define __ANY_INT(DO) __ANY_SINT(DO) __ANY_UINT(DO) +#define __ANY_SINT(DO) DO(SINT) DO(INT) DO(DINT) DO(LINT) +#define __ANY_UINT(DO) DO(USINT) DO(UINT) DO(UDINT) DO(ULINT) + + +/* Macro that expand to subtypes */ +#define __ANY_1(DO,P1) __ANY_DERIVED_1(DO,P1) __ANY_ELEMENTARY_1(DO,P1) +#define __ANY_DERIVED_1(DO,P1) +#define __ANY_ELEMENTARY_1(DO,P1) __ANY_MAGNITUDE_1(DO,P1) __ANY_BIT_1(DO,P1) __ANY_STRING_1(DO,P1) __ANY_DATE_1(DO,P1) +#define __ANY_MAGNITUDE_1(DO,P1) __ANY_NUM_1(DO,P1) DO(TIME,P1) +#define __ANY_BIT_1(DO,P1) __ANY_NBIT_1(DO,P1) DO(BOOL,P1) +#define __ANY_NBIT_1(DO,P1) DO(BYTE,P1) DO(WORD,P1) DO(DWORD,P1) DO(LWORD,P1) +#define __ANY_STRING_1(DO,P1) DO(STRING,P1) +#define __ANY_DATE_1(DO,P1) DO(DATE,P1) DO(TOD,P1) DO(DT,P1) +#define __ANY_NUM_1(DO,P1) __ANY_REAL_1(DO,P1) __ANY_INT_1(DO,P1) +#define __ANY_REAL_1(DO,P1) DO(REAL,P1) DO(LREAL,P1) +#define __ANY_INT_1(DO,P1) __ANY_SINT_1(DO,P1) __ANY_UINT_1(DO,P1) +#define __ANY_SINT_1(DO,P1) DO(SINT,P1) DO(INT,P1) DO(DINT,P1) DO(LINT,P1) +#define __ANY_UINT_1(DO,P1) DO(USINT,P1) DO(UINT,P1) DO(UDINT,P1) DO(ULINT,P1) + + + +/*********************/ +/* IEC Types defs */ +/*********************/ + +/* Include non windows.h clashing typedefs */ +#include "iec_types.h" + +#ifndef TRUE + #define TRUE 1 + #define FALSE 0 +#endif + +#define __IEC_DEBUG_FLAG 0x01 +#define __IEC_FORCE_FLAG 0x02 +#define __IEC_RETAIN_FLAG 0x04 +#define __IEC_OUTPUT_FLAG 0x08 + +#define __DECLARE_IEC_TYPE(type)\ +typedef IEC_##type type;\ +\ +typedef struct {\ + IEC_##type value;\ + IEC_BYTE flags;\ +} __IEC_##type##_t;\ +\ +typedef struct {\ + IEC_##type *value;\ + IEC_BYTE flags;\ + IEC_##type fvalue;\ +} __IEC_##type##_p; + +#define __DECLARE_DERIVED_TYPE(type, base)\ +typedef base type;\ +typedef __IEC_##base##_t __IEC_##type##_t;\ +typedef __IEC_##base##_p __IEC_##type##_p; + +#define __DECLARE_COMPLEX_STRUCT(type)\ +typedef struct {\ + type value;\ + IEC_BYTE flags;\ +} __IEC_##type##_t;\ +\ +typedef struct {\ + type *value;\ + IEC_BYTE flags;\ + type fvalue;\ +} __IEC_##type##_p; + +#define __DECLARE_ENUMERATED_TYPE(type, ...)\ +typedef enum {\ + __VA_ARGS__\ +} type;\ +__DECLARE_COMPLEX_STRUCT(type) + +#define __DECLARE_ARRAY_TYPE(type, base, size)\ +typedef struct {\ + base table size;\ +} type;\ +__DECLARE_COMPLEX_STRUCT(type) + +#define __DECLARE_STRUCT_TYPE(type, elements)\ +typedef struct {\ + elements\ +} type;\ +__DECLARE_COMPLEX_STRUCT(type) + +/* Those typdefs clash with windows.h */ +/* i.e. this file cannot be included aside windows.h */ +__ANY(__DECLARE_IEC_TYPE) + +typedef struct { + __IEC_BOOL_t X; // state; --> current step state. 0 : inative, 1: active. We name it 'X' as it may be accessed from IEC 61131.3 code using stepname.X syntax!! + BOOL prev_state; // previous step state. 0 : inative, 1: active + __IEC_TIME_t T; // elapsed_time; --> time since step is active. We name it 'T' as it may be accessed from IEC 61131.3 code using stepname.T syntax!! +} STEP; + + +typedef struct { + BOOL stored; // action storing state. 0 : not stored, 1: stored + __IEC_BOOL_t state; // current action state. 0 : inative, 1: active + BOOL set; // set have been requested (reset each time the body is evaluated) + BOOL reset; // reset have been requested (reset each time the body is evaluated) + TIME set_remaining_time; // time before set will be requested + TIME reset_remaining_time; // time before reset will be requested +} ACTION; + +/* Extra debug types for SFC */ +#define __ANY_SFC(DO) DO(STEP) DO(TRANSITION) DO(ACTION) + +/* Enumerate native types */ +#define __decl_enum_type(TYPENAME) TYPENAME##_ENUM, +#define __decl_enum_pointer(TYPENAME) TYPENAME##_P_ENUM, +#define __decl_enum_output(TYPENAME) TYPENAME##_O_ENUM, +typedef enum{ + __ANY(__decl_enum_type) + __ANY(__decl_enum_pointer) + __ANY(__decl_enum_output) + /* SFC specific types are never external or global */ + UNKNOWN_ENUM +} __IEC_types_enum; + +/* Get size of type from its number */ +#define __decl_size_case(TYPENAME) \ + case TYPENAME##_ENUM:\ + case TYPENAME##_O_ENUM:\ + case TYPENAME##_P_ENUM:\ + return sizeof(TYPENAME); +static inline USINT __get_type_enum_size(__IEC_types_enum t){ + switch(t){ + __ANY(__decl_size_case) + /* size do not correspond to real struct. + * only a bool is used to represent state*/ + default: + return 0; + } + return 0; +} + +#endif /*IEC_TYPES_ALL_H*/