Sam Grove
/
canopen_slavenode
CANfestival - an open source CANopen framework
framework/src/sync.c@0:6219434a0cb5, 2011-05-30 (annotated)
- Committer:
- sam_grove
- Date:
- Mon May 30 07:14:41 2011 +0000
- Revision:
- 0:6219434a0cb5
Initial public release of slave node framework port
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove |
0:6219434a0cb5 | 1 | /* |
sam_grove |
0:6219434a0cb5 | 2 | This file is part of CanFestival, a library implementing CanOpen Stack. |
sam_grove |
0:6219434a0cb5 | 3 | |
sam_grove |
0:6219434a0cb5 | 4 | |
sam_grove |
0:6219434a0cb5 | 5 | Copyright (C): Edouard TISSERANT and Francis DUPIN |
sam_grove |
0:6219434a0cb5 | 6 | |
sam_grove |
0:6219434a0cb5 | 7 | |
sam_grove |
0:6219434a0cb5 | 8 | See COPYING file for copyrights details. |
sam_grove |
0:6219434a0cb5 | 9 | |
sam_grove |
0:6219434a0cb5 | 10 | |
sam_grove |
0:6219434a0cb5 | 11 | This library is free software; you can redistribute it and/or |
sam_grove |
0:6219434a0cb5 | 12 | modify it under the terms of the GNU Lesser General Public |
sam_grove |
0:6219434a0cb5 | 13 | License as published by the Free Software Foundation; either |
sam_grove |
0:6219434a0cb5 | 14 | version 2.1 of the License, or (at your option) any later version. |
sam_grove |
0:6219434a0cb5 | 15 | |
sam_grove |
0:6219434a0cb5 | 16 | |
sam_grove |
0:6219434a0cb5 | 17 | This library is distributed in the hope that it will be useful, |
sam_grove |
0:6219434a0cb5 | 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
sam_grove |
0:6219434a0cb5 | 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
sam_grove |
0:6219434a0cb5 | 20 | Lesser General Public License for more details. |
sam_grove |
0:6219434a0cb5 | 21 | |
sam_grove |
0:6219434a0cb5 | 22 | |
sam_grove |
0:6219434a0cb5 | 23 | You should have received a copy of the GNU Lesser General Public |
sam_grove |
0:6219434a0cb5 | 24 | License along with this library; if not, write to the Free Software |
sam_grove |
0:6219434a0cb5 | 25 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
sam_grove |
0:6219434a0cb5 | 26 | */ |
sam_grove |
0:6219434a0cb5 | 27 | |
sam_grove |
0:6219434a0cb5 | 28 | |
sam_grove |
0:6219434a0cb5 | 29 | /*! |
sam_grove |
0:6219434a0cb5 | 30 | ** @file sync.c |
sam_grove |
0:6219434a0cb5 | 31 | ** @author Edouard TISSERANT and Francis DUPIN |
sam_grove |
0:6219434a0cb5 | 32 | ** @date Tue Jun 5 09:32:32 2007 |
sam_grove |
0:6219434a0cb5 | 33 | ** |
sam_grove |
0:6219434a0cb5 | 34 | ** @brief |
sam_grove |
0:6219434a0cb5 | 35 | ** |
sam_grove |
0:6219434a0cb5 | 36 | ** |
sam_grove |
0:6219434a0cb5 | 37 | */ |
sam_grove |
0:6219434a0cb5 | 38 | |
sam_grove |
0:6219434a0cb5 | 39 | #include "data.h" |
sam_grove |
0:6219434a0cb5 | 40 | #include "sync.h" |
sam_grove |
0:6219434a0cb5 | 41 | #include "canfestival.h" |
sam_grove |
0:6219434a0cb5 | 42 | #include "sysdep.h" |
sam_grove |
0:6219434a0cb5 | 43 | |
sam_grove |
0:6219434a0cb5 | 44 | /* Prototypes for internals functions */ |
sam_grove |
0:6219434a0cb5 | 45 | |
sam_grove |
0:6219434a0cb5 | 46 | /*! |
sam_grove |
0:6219434a0cb5 | 47 | ** |
sam_grove |
0:6219434a0cb5 | 48 | ** |
sam_grove |
0:6219434a0cb5 | 49 | ** @param d |
sam_grove |
0:6219434a0cb5 | 50 | ** @param id |
sam_grove |
0:6219434a0cb5 | 51 | **/ |
sam_grove |
0:6219434a0cb5 | 52 | void SyncAlarm(CO_Data* d, UNS32 id); |
sam_grove |
0:6219434a0cb5 | 53 | UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, |
sam_grove |
0:6219434a0cb5 | 54 | UNS8 unsused_bSubindex); |
sam_grove |
0:6219434a0cb5 | 55 | |
sam_grove |
0:6219434a0cb5 | 56 | /*! |
sam_grove |
0:6219434a0cb5 | 57 | ** |
sam_grove |
0:6219434a0cb5 | 58 | ** |
sam_grove |
0:6219434a0cb5 | 59 | ** @param d |
sam_grove |
0:6219434a0cb5 | 60 | ** @param id |
sam_grove |
0:6219434a0cb5 | 61 | **/ |
sam_grove |
0:6219434a0cb5 | 62 | void SyncAlarm(CO_Data* d, UNS32 id) |
sam_grove |
0:6219434a0cb5 | 63 | { |
sam_grove |
0:6219434a0cb5 | 64 | sendSYNC(d) ; |
sam_grove |
0:6219434a0cb5 | 65 | } |
sam_grove |
0:6219434a0cb5 | 66 | |
sam_grove |
0:6219434a0cb5 | 67 | /*! |
sam_grove |
0:6219434a0cb5 | 68 | ** This is called when Index 0x1005 is updated. |
sam_grove |
0:6219434a0cb5 | 69 | ** |
sam_grove |
0:6219434a0cb5 | 70 | ** @param d |
sam_grove |
0:6219434a0cb5 | 71 | ** @param unsused_indextable |
sam_grove |
0:6219434a0cb5 | 72 | ** @param unsused_bSubindex |
sam_grove |
0:6219434a0cb5 | 73 | ** |
sam_grove |
0:6219434a0cb5 | 74 | ** @return |
sam_grove |
0:6219434a0cb5 | 75 | **/ |
sam_grove |
0:6219434a0cb5 | 76 | UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) |
sam_grove |
0:6219434a0cb5 | 77 | { |
sam_grove |
0:6219434a0cb5 | 78 | startSYNC(d); |
sam_grove |
0:6219434a0cb5 | 79 | return 0; |
sam_grove |
0:6219434a0cb5 | 80 | } |
sam_grove |
0:6219434a0cb5 | 81 | |
sam_grove |
0:6219434a0cb5 | 82 | /*! |
sam_grove |
0:6219434a0cb5 | 83 | ** |
sam_grove |
0:6219434a0cb5 | 84 | ** |
sam_grove |
0:6219434a0cb5 | 85 | ** @param d |
sam_grove |
0:6219434a0cb5 | 86 | **/ |
sam_grove |
0:6219434a0cb5 | 87 | void startSYNC(CO_Data* d) |
sam_grove |
0:6219434a0cb5 | 88 | { |
sam_grove |
0:6219434a0cb5 | 89 | if(d->syncTimer != TIMER_NONE){ |
sam_grove |
0:6219434a0cb5 | 90 | stopSYNC(d); |
sam_grove |
0:6219434a0cb5 | 91 | } |
sam_grove |
0:6219434a0cb5 | 92 | |
sam_grove |
0:6219434a0cb5 | 93 | RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate); |
sam_grove |
0:6219434a0cb5 | 94 | RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate); |
sam_grove |
0:6219434a0cb5 | 95 | |
sam_grove |
0:6219434a0cb5 | 96 | if(*d->COB_ID_Sync & 0x40000000ul && *d->Sync_Cycle_Period) |
sam_grove |
0:6219434a0cb5 | 97 | { |
sam_grove |
0:6219434a0cb5 | 98 | d->syncTimer = SetAlarm( |
sam_grove |
0:6219434a0cb5 | 99 | d, |
sam_grove |
0:6219434a0cb5 | 100 | 0 /*No id needed*/, |
sam_grove |
0:6219434a0cb5 | 101 | &SyncAlarm, |
sam_grove |
0:6219434a0cb5 | 102 | US_TO_TIMEVAL(*d->Sync_Cycle_Period), |
sam_grove |
0:6219434a0cb5 | 103 | US_TO_TIMEVAL(*d->Sync_Cycle_Period)); |
sam_grove |
0:6219434a0cb5 | 104 | } |
sam_grove |
0:6219434a0cb5 | 105 | } |
sam_grove |
0:6219434a0cb5 | 106 | |
sam_grove |
0:6219434a0cb5 | 107 | /*! |
sam_grove |
0:6219434a0cb5 | 108 | ** |
sam_grove |
0:6219434a0cb5 | 109 | ** |
sam_grove |
0:6219434a0cb5 | 110 | ** @param d |
sam_grove |
0:6219434a0cb5 | 111 | **/ |
sam_grove |
0:6219434a0cb5 | 112 | void stopSYNC(CO_Data* d) |
sam_grove |
0:6219434a0cb5 | 113 | { |
sam_grove |
0:6219434a0cb5 | 114 | RegisterSetODentryCallBack(d, 0x1005, 0, NULL); |
sam_grove |
0:6219434a0cb5 | 115 | RegisterSetODentryCallBack(d, 0x1006, 0, NULL); |
sam_grove |
0:6219434a0cb5 | 116 | d->syncTimer = DelAlarm(d->syncTimer); |
sam_grove |
0:6219434a0cb5 | 117 | } |
sam_grove |
0:6219434a0cb5 | 118 | |
sam_grove |
0:6219434a0cb5 | 119 | |
sam_grove |
0:6219434a0cb5 | 120 | /*! |
sam_grove |
0:6219434a0cb5 | 121 | ** |
sam_grove |
0:6219434a0cb5 | 122 | ** |
sam_grove |
0:6219434a0cb5 | 123 | ** @param d |
sam_grove |
0:6219434a0cb5 | 124 | ** @param cob_id |
sam_grove |
0:6219434a0cb5 | 125 | ** |
sam_grove |
0:6219434a0cb5 | 126 | ** @return |
sam_grove |
0:6219434a0cb5 | 127 | **/ |
sam_grove |
0:6219434a0cb5 | 128 | UNS8 sendSYNCMessage(CO_Data* d) |
sam_grove |
0:6219434a0cb5 | 129 | { |
sam_grove |
0:6219434a0cb5 | 130 | Message m; |
sam_grove |
0:6219434a0cb5 | 131 | |
sam_grove |
0:6219434a0cb5 | 132 | MSG_WAR(0x3001, "sendSYNC ", 0); |
sam_grove |
0:6219434a0cb5 | 133 | |
sam_grove |
0:6219434a0cb5 | 134 | m.cob_id = (UNS16)UNS16_LE(*d->COB_ID_Sync); |
sam_grove |
0:6219434a0cb5 | 135 | m.rtr = NOT_A_REQUEST; |
sam_grove |
0:6219434a0cb5 | 136 | m.len = 0; |
sam_grove |
0:6219434a0cb5 | 137 | |
sam_grove |
0:6219434a0cb5 | 138 | return canSend(d->canHandle,&m); |
sam_grove |
0:6219434a0cb5 | 139 | } |
sam_grove |
0:6219434a0cb5 | 140 | |
sam_grove |
0:6219434a0cb5 | 141 | |
sam_grove |
0:6219434a0cb5 | 142 | /*! |
sam_grove |
0:6219434a0cb5 | 143 | ** |
sam_grove |
0:6219434a0cb5 | 144 | ** |
sam_grove |
0:6219434a0cb5 | 145 | ** @param d |
sam_grove |
0:6219434a0cb5 | 146 | ** @param cob_id |
sam_grove |
0:6219434a0cb5 | 147 | ** |
sam_grove |
0:6219434a0cb5 | 148 | ** @return |
sam_grove |
0:6219434a0cb5 | 149 | **/ |
sam_grove |
0:6219434a0cb5 | 150 | UNS8 sendSYNC(CO_Data* d) |
sam_grove |
0:6219434a0cb5 | 151 | { |
sam_grove |
0:6219434a0cb5 | 152 | UNS8 res; |
sam_grove |
0:6219434a0cb5 | 153 | res = sendSYNCMessage(d); |
sam_grove |
0:6219434a0cb5 | 154 | proceedSYNC(d) ; |
sam_grove |
0:6219434a0cb5 | 155 | return res ; |
sam_grove |
0:6219434a0cb5 | 156 | } |
sam_grove |
0:6219434a0cb5 | 157 | |
sam_grove |
0:6219434a0cb5 | 158 | /*! |
sam_grove |
0:6219434a0cb5 | 159 | ** |
sam_grove |
0:6219434a0cb5 | 160 | ** |
sam_grove |
0:6219434a0cb5 | 161 | ** @param d |
sam_grove |
0:6219434a0cb5 | 162 | ** @param m |
sam_grove |
0:6219434a0cb5 | 163 | ** |
sam_grove |
0:6219434a0cb5 | 164 | ** @return |
sam_grove |
0:6219434a0cb5 | 165 | **/ |
sam_grove |
0:6219434a0cb5 | 166 | UNS8 proceedSYNC(CO_Data* d) |
sam_grove |
0:6219434a0cb5 | 167 | { |
sam_grove |
0:6219434a0cb5 | 168 | |
sam_grove |
0:6219434a0cb5 | 169 | UNS8 res; |
sam_grove |
0:6219434a0cb5 | 170 | |
sam_grove |
0:6219434a0cb5 | 171 | MSG_WAR(0x3002, "SYNC received. Proceed. ", 0); |
sam_grove |
0:6219434a0cb5 | 172 | |
sam_grove |
0:6219434a0cb5 | 173 | (*d->post_sync)(d); |
sam_grove |
0:6219434a0cb5 | 174 | |
sam_grove |
0:6219434a0cb5 | 175 | /* only operational state allows PDO transmission */ |
sam_grove |
0:6219434a0cb5 | 176 | if(! d->CurrentCommunicationState.csPDO) |
sam_grove |
0:6219434a0cb5 | 177 | return 0; |
sam_grove |
0:6219434a0cb5 | 178 | |
sam_grove |
0:6219434a0cb5 | 179 | res = _sendPDOevent(d, 1 /*isSyncEvent*/ ); |
sam_grove |
0:6219434a0cb5 | 180 | |
sam_grove |
0:6219434a0cb5 | 181 | /*Call user app callback*/ |
sam_grove |
0:6219434a0cb5 | 182 | (*d->post_TPDO)(d); |
sam_grove |
0:6219434a0cb5 | 183 | |
sam_grove |
0:6219434a0cb5 | 184 | return res; |
sam_grove |
0:6219434a0cb5 | 185 | |
sam_grove |
0:6219434a0cb5 | 186 | } |
sam_grove |
0:6219434a0cb5 | 187 | |
sam_grove |
0:6219434a0cb5 | 188 | |
sam_grove |
0:6219434a0cb5 | 189 | void _post_sync(CO_Data* d){} |
sam_grove |
0:6219434a0cb5 | 190 | void _post_TPDO(CO_Data* d){} |