diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenDevice.cpp b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenDevice.cpp index 7f6a993..04cc924 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenDevice.cpp +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenDevice.cpp @@ -35,8 +35,8 @@ ecmcCANOpenDevice::ecmcCANOpenDevice(ecmcSocketCANWriteBuffer* writeBuffer, isMaster_ = false; pdoCounter_ = 0; sdoCounter_ = 0; - sdo1Busy_.test_and_set(); // make sure only one sdo is accessing the bus at the same time - sdo1Busy_.clear(); + sdo1Lock_.test_and_set(); // make sure only one sdo is accessing the bus at the same time + sdo1Lock_.clear(); for(int i = 0 ; itest_and_set(); + if(!gotLock) { + // wait for busy to go down + return 0; + } + + busy_ = gotLock; + epicsMutexUnlock(getLockMutex_); + return gotLock; +} + +int ecmcCANOpenSDO::tryUnlock() { + epicsMutexLock(getLockMutex_); + if(busy_) { + ptrSdo1Lock_->clear(); + busy_ = false; + } + epicsMutexUnlock(getLockMutex_); + return 0; +} + //# w 0x603 [8] 0x40 0x40 0x26 0x00 0x00 0x00 0x00 0x00 //# w 0x603 [8] 0x61 0x40 0x26 0x00 0x00 0x00 0x00 0x00 //# w 0x603 [8] 0x71 0x40 0x26 0x00 0x00 0x00 0x00 0x00 diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenSDO.h b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenSDO.h index faefb30..8e88fa6 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenSDO.h +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcCANOpenSDO.h @@ -41,6 +41,7 @@ class ecmcCANOpenSDO { int readSampleTimeMs, int exeSampleTimeMs, const char *name, + std::atomic_flag *ptrSdo1Lock, int dbgMode); ~ecmcCANOpenSDO(); void execute(); @@ -54,7 +55,8 @@ class ecmcCANOpenSDO { int writeDataStateMachine(can_frame *frame); int writeNextDataToSlave(int useToggle); int writeWaitForDataConfFrame(int useToggle, can_frame *frame); - + int tryLock(); + int tryUnlock(); ecmcSocketCANWriteBuffer *writeBuffer_; uint32_t cobIdRx_; // with cobid uint32_t cobIdTx_; // with cobid @@ -90,9 +92,12 @@ class ecmcCANOpenSDO { uint32_t writtenBytes_; char *name_; epicsMutexId dataMutex_; + epicsMutexId getLockMutex_; int busyCounter_; //std::atomic_flag *ptrSdo1Busy_; - std::atomic_flag busy_; + //std::atomic_flag busy_; + std::atomic_flag *ptrSdo1Lock_; + bool busy_; }; #endif /* ECMC_CANOPEN_SDO_H_ */ diff --git a/iocsh/pvs.log b/iocsh/pvs.log index 3c912bc..40a302e 100644 --- a/iocsh/pvs.log +++ b/iocsh/pvs.log @@ -1,12 +1,12 @@ -REQMOD:mcag-trgt-muts--20872:MODULES -REQMOD:mcag-trgt-muts--20872:VERSIONS -REQMOD:mcag-trgt-muts--20872:MOD_VER -REQMOD:mcag-trgt-muts--20872:exit -REQMOD:mcag-trgt-muts--20872:BaseVersion -REQMOD:mcag-trgt-muts--20872:require_VER -REQMOD:mcag-trgt-muts--20872:ecmccfg_VER -REQMOD:mcag-trgt-muts--20872:asyn_VER -REQMOD:mcag-trgt-muts--20872:exprtk_VER -REQMOD:mcag-trgt-muts--20872:motor_VER -REQMOD:mcag-trgt-muts--20872:ecmc_VER -REQMOD:mcag-trgt-muts--20872:ecmc_plugin_socketcan_VER +REQMOD:mcag-trgt-muts--16711:MODULES +REQMOD:mcag-trgt-muts--16711:VERSIONS +REQMOD:mcag-trgt-muts--16711:MOD_VER +REQMOD:mcag-trgt-muts--16711:exit +REQMOD:mcag-trgt-muts--16711:BaseVersion +REQMOD:mcag-trgt-muts--16711:require_VER +REQMOD:mcag-trgt-muts--16711:ecmccfg_VER +REQMOD:mcag-trgt-muts--16711:asyn_VER +REQMOD:mcag-trgt-muts--16711:exprtk_VER +REQMOD:mcag-trgt-muts--16711:motor_VER +REQMOD:mcag-trgt-muts--16711:ecmc_VER +REQMOD:mcag-trgt-muts--16711:ecmc_plugin_socketcan_VER