leonid@252: /* leonid@252: This file is part of CanFestival, a library implementing CanOpen Stack. leonid@252: leonid@252: leonid@252: Copyright (C): Edouard TISSERANT and Francis DUPIN leonid@252: leonid@252: leonid@252: See COPYING file for copyrights details. leonid@252: leonid@252: leonid@252: This library is free software; you can redistribute it and/or leonid@252: modify it under the terms of the GNU Lesser General Public leonid@252: License as published by the Free Software Foundation; either leonid@252: version 2.1 of the License, or (at your option) any later version. leonid@252: leonid@252: leonid@252: This library is distributed in the hope that it will be useful, leonid@252: but WITHOUT ANY WARRANTY; without even the implied warranty of leonid@252: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU leonid@252: Lesser General Public License for more details. leonid@252: leonid@252: leonid@252: You should have received a copy of the GNU Lesser General Public leonid@252: License along with this library; if not, write to the Free Software leonid@252: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA leonid@252: */ leonid@252: leonid@252: leonid@252: /*! leonid@252: ** @file sync.c leonid@252: ** @author Edouard TISSERANT and Francis DUPIN leonid@252: ** @date Tue Jun 5 09:32:32 2007 leonid@252: ** leonid@252: ** @brief leonid@252: ** leonid@252: ** leonid@252: */ leonid@252: leonid@252: #include "data.h" leonid@252: #include "sync.h" leonid@252: #include "canfestival.h" etisserant@370: #include "sysdep.h" leonid@252: leonid@252: /* Prototypes for internals functions */ leonid@252: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: ** @param id leonid@252: **/ leonid@252: void SyncAlarm(CO_Data* d, UNS32 id); leonid@252: UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, leonid@252: UNS8 unsused_bSubindex); leonid@252: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: ** @param id leonid@252: **/ leonid@252: void SyncAlarm(CO_Data* d, UNS32 id) leonid@252: { etisserant@291: sendSYNC(d) ; leonid@252: } leonid@252: leonid@252: /*! leonid@252: ** This is called when Index 0x1005 is updated. leonid@252: ** leonid@252: ** @param d leonid@252: ** @param unsused_indextable leonid@252: ** @param unsused_bSubindex leonid@252: ** leonid@252: ** @return leonid@252: **/ leonid@252: UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) leonid@252: { leonid@252: startSYNC(d); leonid@252: return 0; leonid@252: } leonid@252: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: **/ leonid@252: void startSYNC(CO_Data* d) leonid@252: { etisserant@443: if(d->syncTimer != TIMER_NONE){ etisserant@443: stopSYNC(d); etisserant@443: } etisserant@443: leonid@252: RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate); leonid@252: RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate); leonid@252: etisserant@443: if(*d->COB_ID_Sync & 0x40000000ul && *d->Sync_Cycle_Period) leonid@252: { leonid@252: d->syncTimer = SetAlarm( leonid@252: d, leonid@252: 0 /*No id needed*/, leonid@252: &SyncAlarm, leonid@252: US_TO_TIMEVAL(*d->Sync_Cycle_Period), leonid@252: US_TO_TIMEVAL(*d->Sync_Cycle_Period)); leonid@252: } leonid@252: } leonid@252: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: **/ leonid@252: void stopSYNC(CO_Data* d) leonid@252: { etisserant@263: RegisterSetODentryCallBack(d, 0x1005, 0, NULL); etisserant@263: RegisterSetODentryCallBack(d, 0x1006, 0, NULL); leonid@252: d->syncTimer = DelAlarm(d->syncTimer); leonid@252: } leonid@252: etisserant@263: etisserant@263: /*! etisserant@263: ** etisserant@263: ** etisserant@263: ** @param d etisserant@263: ** @param cob_id etisserant@263: ** etisserant@263: ** @return etisserant@263: **/ etisserant@291: UNS8 sendSYNCMessage(CO_Data* d) etisserant@263: { etisserant@263: Message m; etisserant@263: etisserant@263: MSG_WAR(0x3001, "sendSYNC ", 0); etisserant@263: greg@587: m.cob_id = (UNS16)UNS16_LE(*d->COB_ID_Sync); etisserant@263: m.rtr = NOT_A_REQUEST; etisserant@263: m.len = 0; etisserant@263: etisserant@263: return canSend(d->canHandle,&m); etisserant@263: } etisserant@263: etisserant@263: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: ** @param cob_id leonid@252: ** leonid@252: ** @return leonid@252: **/ etisserant@291: UNS8 sendSYNC(CO_Data* d) leonid@252: { etisserant@263: UNS8 res; etisserant@291: res = sendSYNCMessage(d); etisserant@263: proceedSYNC(d) ; etisserant@263: return res ; leonid@252: } leonid@252: leonid@252: /*! leonid@252: ** leonid@252: ** leonid@252: ** @param d leonid@252: ** @param m leonid@252: ** leonid@252: ** @return leonid@252: **/ etisserant@263: UNS8 proceedSYNC(CO_Data* d) leonid@252: { leonid@252: leonid@252: UNS8 res; leonid@252: leonid@252: MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); leonid@252: etisserant@378: (*d->post_sync)(d); leonid@252: leonid@252: /* only operational state allows PDO transmission */ leonid@252: if(! d->CurrentCommunicationState.csPDO) leonid@252: return 0; leonid@252: leonid@252: res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); leonid@252: leonid@252: /*Call user app callback*/ etisserant@378: (*d->post_TPDO)(d); leonid@252: leonid@252: return res; leonid@252: leonid@252: } leonid@252: leonid@252: etisserant@378: void _post_sync(CO_Data* d){} etisserant@378: void _post_TPDO(CO_Data* d){}