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: nico@208: /*! nico@208: ** @file sync.c nico@208: ** @author Edouard TISSERANT and Francis DUPIN nico@208: ** @date Tue Jun 5 09:32:32 2007 nico@208: ** nico@208: ** @brief nico@208: ** nico@208: ** nico@208: */ frdupin@71: etisserant@0: #include "data.h" etisserant@0: #include "sync.h" etisserant@149: #include "canfestival.h" etisserant@0: frdupin@71: /* Prototypes for internals functions */ nico@208: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: ** @param id nico@208: **/ frdupin@53: void SyncAlarm(CO_Data* d, UNS32 id); frdupin@53: UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, frdupin@53: UNS8 unsused_bSubindex); frdupin@53: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: ** @param id nico@208: **/ etisserant@0: void SyncAlarm(CO_Data* d, UNS32 id) etisserant@0: { etisserant@0: sendSYNC(d, *d->COB_ID_Sync & 0x1FFFFFFF) ; etisserant@0: } etisserant@0: nico@208: /*! nico@208: ** This is called when Index 0x1005 is updated. nico@208: ** nico@208: ** @param d nico@208: ** @param unsused_indextable nico@208: ** @param unsused_bSubindex nico@208: ** nico@208: ** @return nico@208: **/ etisserant@0: UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) etisserant@0: { etisserant@0: startSYNC(d); lbessard@31: return 0; etisserant@0: } etisserant@0: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: **/ etisserant@0: void startSYNC(CO_Data* d) etisserant@0: { etisserant@0: RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate); etisserant@0: RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate); etisserant@0: etisserant@0: if(d->syncTimer != TIMER_NONE){ etisserant@0: stopSYNC(d); etisserant@0: } etisserant@0: etisserant@0: if(*d->COB_ID_Sync & 0x40000000 && *d->Sync_Cycle_Period) etisserant@0: { etisserant@0: d->syncTimer = SetAlarm( etisserant@0: d, frdupin@71: 0 /*No id needed*/, etisserant@0: &SyncAlarm, etisserant@0: US_TO_TIMEVAL(*d->Sync_Cycle_Period), etisserant@0: US_TO_TIMEVAL(*d->Sync_Cycle_Period)); etisserant@0: } etisserant@0: } etisserant@0: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: **/ etisserant@0: void stopSYNC(CO_Data* d) etisserant@0: { etisserant@0: d->syncTimer = DelAlarm(d->syncTimer); etisserant@0: } etisserant@0: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: ** @param cob_id nico@208: ** nico@208: ** @return nico@208: **/ etisserant@0: UNS8 sendSYNC(CO_Data* d, UNS32 cob_id) etisserant@0: { etisserant@0: Message m; etisserant@0: UNS8 resultat ; etisserant@0: etisserant@0: MSG_WAR(0x3001, "sendSYNC ", 0); etisserant@0: etisserant@0: m.cob_id.w = cob_id ; etisserant@0: m.rtr = NOT_A_REQUEST; etisserant@0: m.len = 0; etisserant@149: resultat = canSend(d->canHandle,&m) ; etisserant@0: proceedSYNC(d, &m) ; etisserant@0: return resultat ; etisserant@0: } etisserant@0: nico@208: /*! nico@208: ** nico@208: ** nico@208: ** @param d nico@208: ** @param m nico@208: ** nico@208: ** @return nico@208: **/ etisserant@0: UNS8 proceedSYNC(CO_Data* d, Message *m) etisserant@0: { etisserant@0: etisserant@235: UNS8 res; frdupin@71: frdupin@71: MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); frdupin@71: etisserant@153: (*d->post_sync)(); etisserant@153: nico@215: /* only operational state allows PDO transmission */ etisserant@236: if(! d->CurrentCommunicationState.csPDO) etisserant@0: return 0; etisserant@235: etisserant@235: res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); etisserant@0: etisserant@235: /*Call user app callback*/ etisserant@235: (*d->post_TPDO)(); etisserant@0: etisserant@235: return res; etisserant@235: etisserant@0: } etisserant@0: etisserant@0: etisserant@149: void _post_sync(){} etisserant@149: void _post_TPDO(){}