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: 
etisserant@0: #ifndef __pdo_h__
etisserant@0: #define __pdo_h__
etisserant@0: 
etisserant@0: #include <applicfg.h>
etisserant@0: #include <def.h>
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: 
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: 
etisserant@235: /** Prepare the PDO defined at index to be sent 
etisserant@235:  * 
etisserant@235:  * 
etisserant@235:  * 
etisserant@0:  * Copy all the data to transmit in process_var
etisserant@0:  * *pwCobId : returns the value of the cobid. (subindex 1)
etisserant@0:  * Return 0 or 0xFF if error.
etisserant@0:  */
etisserant@235: UNS8 buildPDO(CO_Data* d, UNS8 numPdo, Message *pdo);
etisserant@0: 
etisserant@0: /** Transmit a PDO request frame on the bus bus_id
etisserant@0:  * to the slave.
etisserant@0:  * bus_id is hardware dependant
etisserant@0:  * Returns 0xFF if error, other in success.
etisserant@0:  */
etisserant@236: UNS8 sendPDOrequest( CO_Data* d, UNS16 RPDOIndex );
etisserant@0: 
etisserant@0: /** Compute a PDO frame reception
etisserant@0:  * bus_id is hardware dependant
etisserant@0:  * return 0xFF if error, else return 0
etisserant@0:  */
etisserant@0: UNS8 proceedPDO (CO_Data* d, Message *m);
etisserant@0: 
etisserant@235: /** 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.    
etisserant@0:  */
etisserant@235: UNS8 sendPDOevent (CO_Data* d);
etisserant@235: 
etisserant@235: /** Function iterates on all TPDO and look TPDO transmit 
etisserant@235:  * type and content change before sending it.
etisserant@235:  */
etisserant@235: UNS8 _sendPDOevent(CO_Data* d, UNS8 isSyncEvent);
etisserant@235: 
etisserant@235: 
etisserant@235: void PDOInit(CO_Data* d);
etisserant@235: void PDOStop(CO_Data* d);
etisserant@235: void PDOEventTimerAlarm(CO_Data* d, UNS32 pdoNum);
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