/* * efc_ecat.h * * Created on: 20 Nov 2023 * Author: titov */ #ifndef INCLUDE_EFC_ECAT_H_ #define INCLUDE_EFC_ECAT_H_ #ifdef __cplusplus extern "C" { #endif #include #include #include "../src/ssc/applInterface.h" /** * @defgroup Api API * * @{ */ /** * @defgroup Common Общий API * * @{ */ /** * @brief Инициализация EtherCat драйвера * * Вызов функции инициализации должен предшествовать всем оставльным функциям драйвера * * @return @c true при успешной инициализации; иначе @c false */ bool efc_ecat_init(void); /** * @brief Денициализация EtherCat драйвера * * После вызова драйвера обращения к его функциям запрещено * * @return @c void */ void efc_ecat_fini(void); /** * @brief Обработчик циклических задач EtherCat драйвера * * Обработчик должен исполняться в низкоприоритетном потоке * * @return void */ void efc_ecat_loop(void); /** @} */ /* Common */ /** * @defgroup EthercatStateMachine Обработка событий машины состояния API * * @{ */ typedef enum ESMS1 { PreOp = 1, SafeOp = 2, Op = 3 } EcatStateMachineStates; bool efc_ecat_state_pending( EcatStateMachineStates state ); void efc_ecat_state_approve( EcatStateMachineStates state ); typedef void (*efc_ecat_state_pend_handler)( EcatStateMachineStates state ); void efc_ecat_set_state_pend_handler( efc_ecat_state_pend_handler pf ); /** @} */ /* EthercatStateMachine */ typedef void (*efc_ecat_update_sync0_time)( uint32_t time_in_us ); void efc_ecat_set_sync0_time_update_handler( efc_ecat_update_sync0_time pf ); void efc_ecat_set_device_id( uint16_t device_id ); typedef void (*efc_ecat_application_handler)( void ); void efc_ecat_set_application_handler( efc_ecat_application_handler pf ); /** * @defgroup ProcessDataInterface Обработка данных реального времени * * @{ */ /** @} */ /* ProcessDataInterface */ /** * @defgroup ServiceDataInterface Обработка сервисных данных * * @{ */ typedef UINT16 Index; typedef UINT8 SubIndex; typedef UINT32 Size; typedef UINT8 CompliteAccess; typedef UINT16 Data; typedef UINT8 ResultType; enum ResultCode { Done = 0x00, //!<Успешное завершение. ToggleBitNotChanged = 0x01, /**< Index of "Toggle bit not changed" */ SdoProtocolTimeout = 0x02, /**< Index of "SDO timeout" */ CommandSpecifierUnknown = 0x03, /**< Index of "Command specifier unknown" */ OutOfMemory = 0x04, /**< Index of "Out of memory" */ UnsupportedAccess = 0x05, /**< Index of "Unsupported Access" */ WriteOnlyEntry = 0x06, /**< Index of "Write only entry" */ ReadOnlyEntry = 0x07, /**< Index of "Read only entry" */ ObjectNotExisting = 0x08, /**< Index of "Object not existing" */ ObjectCantBePdoMapped = 0x09, /**< Index of "Object can not be mapped to PDO" */ MappedObjectsExceedPdo = 0x0A, /**< Index of "Mapped Object exceeds PDO" */ ParamIsIncompatible = 0x0B, /**< Index of "Parameter is incompatible" */ InternalDeviceIncompatibility = 0x0C, /**< Index of "Device incompatibility" */ HardwareError = 0x0D, /**< Index of "Hardware error" */ ParamLengthError = 0x0E, /**< Index of "Parameter length error" */ ParamLengthTooLong = 0x0F, /**< Index of "Parameter is too long" */ ParamLengthTooShort = 0x10, /**< Index of "Parameter is too short" */ SubindexNotExisting = 0x11, /**< Index of "Subindex (Entry) not exists" */ ValueExceeded = 0x12, /**< Index of "Value exceeds" */ ValueTooGreat = 0x13, /**< Index of "Value is too great" */ ValueTooSmall = 0x14, /**< Index of "Value is too small" */ ModuleIdListNotMatch = 0x15, /**< Index of "Unequal Module Id list" */ MaxValueIsLessThanMinValue = 0x16, /**< Index of "Value is less than minimum value" */ GeneralError = 0x17, /**< Index of "General error" */ DataCannotBeReadWrite = 0x18, /**< Index of "Data can not be read or written" */ DataCannotBeAccessedWithLocalControl = 0x19, /**< Index of "Data can not be accessed because of local control" */ DataCannotBeReadWriteInCurrentState = 0x1A, /**< Index of "Data can not be read or written in the current state" */ NoObjectDictionaryIsPresent = 0x1B, /**< Index of "Object is not in the object dictionary" */ EntryCantBeWrittenSi0Not0 = 0x1C, /**< Index of "Entry can not be written because Subindex0 is not 0" */ CompleteAccessNotSupported = 0x1D, /**< The object can not be accessed via complete access */ Working = 0xFF /**< Index of application is handling the SDO request */ }; typedef ResultType (* InterfaceRead)( Index index, SubIndex subindex, Size size, Data * data, CompliteAccess complete_access ); typedef ResultType (* InterfaceWrite)( Index index, SubIndex subindex, Size size, Data * data, CompliteAccess complete_access ); /** @} */ /* Api */ #ifdef __cplusplus } #endif #endif /* INCLUDE_EFC_ECAT_H_ */