00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00033 #include "data.h"
00034 #include "sync.h"
00035 #include "canfestival.h"
00036
00037
00038
00045 void SyncAlarm(CO_Data* d, UNS32 id);
00046 UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable,
00047 UNS8 unsused_bSubindex);
00048
00055 void SyncAlarm(CO_Data* d, UNS32 id)
00056 {
00057 sendSYNC(d, *d->COB_ID_Sync & 0x1FFFFFFF) ;
00058 }
00059
00069 UNS32 OnCOB_ID_SyncUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
00070 {
00071 startSYNC(d);
00072 return 0;
00073 }
00074
00080 void startSYNC(CO_Data* d)
00081 {
00082 RegisterSetODentryCallBack(d, 0x1005, 0, &OnCOB_ID_SyncUpdate);
00083 RegisterSetODentryCallBack(d, 0x1006, 0, &OnCOB_ID_SyncUpdate);
00084
00085 if(d->syncTimer != TIMER_NONE){
00086 stopSYNC(d);
00087 }
00088
00089 if(*d->COB_ID_Sync & 0x40000000 && *d->Sync_Cycle_Period)
00090 {
00091 d->syncTimer = SetAlarm(
00092 d,
00093 0 ,
00094 &SyncAlarm,
00095 US_TO_TIMEVAL(*d->Sync_Cycle_Period),
00096 US_TO_TIMEVAL(*d->Sync_Cycle_Period));
00097 }
00098 }
00099
00105 void stopSYNC(CO_Data* d)
00106 {
00107 d->syncTimer = DelAlarm(d->syncTimer);
00108 }
00109
00118 UNS8 sendSYNC(CO_Data* d, UNS32 cob_id)
00119 {
00120 Message m;
00121 UNS8 resultat ;
00122
00123 MSG_WAR(0x3001, "sendSYNC ", 0);
00124
00125 m.cob_id.w = cob_id ;
00126 m.rtr = NOT_A_REQUEST;
00127 m.len = 0;
00128 resultat = canSend(d->canHandle,&m) ;
00129 proceedSYNC(d, &m) ;
00130 return resultat ;
00131 }
00132
00141 UNS8 proceedSYNC(CO_Data* d, Message *m)
00142 {
00143
00144 UNS8 res;
00145
00146 MSG_WAR(0x3002, "SYNC received. Proceed. ", 0);
00147
00148 (*d->post_sync)();
00149
00150
00151 if(! d->CurrentCommunicationState.csPDO)
00152 return 0;
00153
00154 res = _sendPDOevent(d, 1 );
00155
00156
00157 (*d->post_TPDO)();
00158
00159 return res;
00160
00161 }
00162
00163
00164 void _post_sync(){}
00165 void _post_TPDO(){}