etisserant@0: /* etisserant@0: This file is part of CanFestival, a library implementing CanOpen Stack. etisserant@0: etisserant@0: Copyright (C): Edouard TISSERANT and Francis DUPIN etisserant@0: etisserant@0: See COPYING file for copyrights details. etisserant@0: etisserant@0: This library is free software; you can redistribute it and/or etisserant@0: modify it under the terms of the GNU Lesser General Public etisserant@0: License as published by the Free Software Foundation; either etisserant@0: version 2.1 of the License, or (at your option) any later version. etisserant@0: etisserant@0: This library is distributed in the hope that it will be useful, etisserant@0: but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@0: Lesser General Public License for more details. etisserant@0: etisserant@0: You should have received a copy of the GNU Lesser General Public etisserant@0: License along with this library; if not, write to the Free Software etisserant@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: */ etisserant@0: greg@528: /** @defgroup pdo Process Data Object (PDO) greg@528: * PDO is a communication object defined by the DPO communication parameter and PDA mapping parameter objects. greg@528: * It is an uncomfirmed communication service without protocol overhead. greg@528: * @ingroup comobj greg@528: */ greg@528: etisserant@0: #ifndef __pdo_h__ etisserant@0: #define __pdo_h__ etisserant@0: etisserant@0: #include etisserant@0: #include etisserant@0: etisserant@235: #include "can.h" etisserant@235: etisserant@235: typedef struct struct_s_PDO_status s_PDO_status; etisserant@0: etisserant@0: #include "data.h" etisserant@0: Mongo@670: /* Handler for RxPDO event timers : empty function that user can overload */ Mongo@670: void _RxPDO_EventTimers_Handler(CO_Data *d, UNS32 pdoNum); Mongo@670: etisserant@235: /* Status of the TPDO : */ etisserant@235: #define PDO_INHIBITED 0x01 etisserant@236: #define PDO_RTR_SYNC_READY 0x01 etisserant@235: etisserant@0: /** The PDO structure */ etisserant@235: struct struct_s_PDO_status { etisserant@235: UNS8 transmit_type_parameter; etisserant@235: TIMER_HANDLE event_timer; etisserant@235: TIMER_HANDLE inhibit_timer; etisserant@235: Message last_message; etisserant@235: }; etisserant@0: etisserant@366: #define s_PDO_status_Initializer {0, TIMER_NONE, TIMER_NONE, Message_Initializer} etisserant@235: etisserant@235: /** definitions of the different types of PDOs' transmission etisserant@235: * etisserant@235: * SYNCHRO(n) means that the PDO will be transmited every n SYNC signal. etisserant@0: */ etisserant@235: #define TRANS_EVERY_N_SYNC(n) (n) /*n = 1 to 240 */ etisserant@426: #define TRANS_SYNC_ACYCLIC 0 /* Trans after reception of n SYNC. n = 1 to 240 */ etisserant@235: #define TRANS_SYNC_MIN 1 /* Trans after reception of n SYNC. n = 1 to 240 */ etisserant@235: #define TRANS_SYNC_MAX 240 /* Trans after reception of n SYNC. n = 1 to 240 */ etisserant@235: #define TRANS_RTR_SYNC 252 /* Transmission on request */ etisserant@235: #define TRANS_RTR 253 /* Transmission on request */ etisserant@235: #define TRANS_EVENT_SPECIFIC 254 /* Transmission on event */ etisserant@235: #define TRANS_EVENT_PROFILE 255 /* Transmission on event */ etisserant@0: greg@529: /** greg@528: * @brief Copy all the data to transmit in process_var greg@528: * Prepare the PDO defined at index to be sent etisserant@0: * *pwCobId : returns the value of the cobid. (subindex 1) greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param numPdo The PDO number greg@528: * @param *pdo Pointer on a CAN message structure greg@528: * @return 0 or 0xFF if error. etisserant@0: */ etisserant@235: UNS8 buildPDO(CO_Data* d, UNS8 numPdo, Message *pdo); etisserant@0: greg@528: /** greg@528: * @ingroup pdo greg@561: * @brief Transmit a PDO request frame on the network to the slave. greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param RPDOIndex Index of the receive PDO greg@561: * @return greg@561: * - CanFestival file descriptor is returned upon success. greg@561: * - 0xFF is returned if RPDO Index is not found. greg@561: greg@528: * @return 0xFF if error, other in success. etisserant@0: */ etisserant@236: UNS8 sendPDOrequest( CO_Data* d, UNS16 RPDOIndex ); etisserant@0: greg@528: /** greg@528: * @brief Compute a PDO frame reception etisserant@0: * bus_id is hardware dependant greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param *m Pointer on a CAN message structure greg@528: * @return 0xFF if error, else return 0 etisserant@0: */ etisserant@0: UNS8 proceedPDO (CO_Data* d, Message *m); etisserant@0: greg@529: /** greg@528: * @brief Used by the application to signal changes in process data etisserant@235: * that could be mapped to some TPDO. etisserant@235: * This do not necessarily imply PDO emission. etisserant@235: * Function iterates on all TPDO and look TPDO transmit etisserant@235: * type and content change before sending it. greg@528: * @param *d Pointer on a CAN object data structure etisserant@0: */ etisserant@235: UNS8 sendPDOevent (CO_Data* d); Christian@649: UNS8 sendOnePDOevent (CO_Data* d, UNS8 pdoNum); etisserant@235: greg@528: /** greg@528: * @ingroup pdo greg@528: * @brief Function iterates on all TPDO and look TPDO transmit etisserant@235: * type and content change before sending it. greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param isSyncEvent etisserant@235: */ etisserant@235: UNS8 _sendPDOevent(CO_Data* d, UNS8 isSyncEvent); etisserant@235: greg@528: /** greg@528: * @brief Initialize PDO feature greg@528: * @param *d Pointer on a CAN object data structure greg@528: */ greg@528: void PDOInit(CO_Data* d); etisserant@235: greg@528: /** greg@528: * @brief Stop PDO feature greg@528: * @param *d Pointer on a CAN object data structure greg@528: */ etisserant@235: void PDOStop(CO_Data* d); greg@528: greg@528: /** greg@528: * @ingroup pdo greg@528: * @brief Set timer for PDO event greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param pdoNum The PDO number greg@528: */ etisserant@235: void PDOEventTimerAlarm(CO_Data* d, UNS32 pdoNum); greg@528: greg@528: /** greg@528: * @ingroup pdo greg@528: * @brief Inhibit timer for PDO event greg@528: * @param *d Pointer on a CAN object data structure greg@528: * @param pdoNum The PDO number greg@528: */ etisserant@235: void PDOInhibitTimerAlarm(CO_Data* d, UNS32 pdoNum); etisserant@0: greg@201: /* copy bit per bit in little endian */ greg@201: void CopyBits(UNS8 NbBits, UNS8* SrcByteIndex, UNS8 SrcBitIndex, UNS8 SrcBigEndian, UNS8* DestByteIndex, UNS8 DestBitIndex, UNS8 DestBigEndian); etisserant@0: #endif