Lock seems to work. Add more SDO:s to testscript to test lock
This commit is contained in:
@@ -192,7 +192,7 @@ void ecmcCANOpenSDO::execute() {
|
||||
|
||||
if(busyCounter_>ECMC_SDO_REPLY_TIMOUT_MS) {
|
||||
// cancel read or write
|
||||
printf("SDO BUSY timeout!!\n");
|
||||
printf("SDO BUSY timeout!! %s\n",name_);
|
||||
memset(tempReadBuffer_,0,ODSize_);
|
||||
readStates_ = READ_IDLE;
|
||||
writeStates_ = WRITE_IDLE;
|
||||
@@ -215,7 +215,7 @@ void ecmcCANOpenSDO::execute() {
|
||||
exeCounter_ =0;
|
||||
readStates_ = READ_REQ_TRANSFER;
|
||||
if(dbgMode_) {
|
||||
printf("STATE = READ_REQ_TRANSFER\n");
|
||||
printf("STATE = READ_REQ_TRANSFER %s\n",name_);
|
||||
}
|
||||
// IMPORTANT!! LOCKLOCK!!!! LOCK all slave trafic while 0x583 and 0x603 for any other trafic while processing
|
||||
//initiate
|
||||
@@ -224,7 +224,7 @@ void ecmcCANOpenSDO::execute() {
|
||||
writeBuffer_->addWriteCAN(&readReqTransferFrame_);
|
||||
|
||||
if(dbgMode_) {
|
||||
printf("STATE = READ_WAIT_FOR_CONF\n");
|
||||
printf("STATE = READ_WAIT_FOR_CONF %s\n",name_);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -263,7 +263,7 @@ int ecmcCANOpenSDO::readDataStateMachine(can_frame *frame) {
|
||||
}
|
||||
readStates_ = READ_WAIT_FOR_DATA; //Next frame should be data!
|
||||
if(dbgMode_) {
|
||||
printf("STATE = READ_WAIT_FOR_DATA\n");
|
||||
printf("STATE = READ_WAIT_FOR_DATA %s\n",name_);
|
||||
}
|
||||
writeBuffer_->addWriteCAN(&readConfReqFrameTg0_); // Send tg0 frame and wait for data, also size must match to go ahead
|
||||
useTg1Frame_ = 1;
|
||||
@@ -300,7 +300,7 @@ int ecmcCANOpenSDO::readDataStateMachine(can_frame *frame) {
|
||||
memcpy(dataBuffer_,tempReadBuffer_,ODSize_);
|
||||
epicsMutexUnlock(dataMutex_);
|
||||
if(dbgMode_) {
|
||||
printf("STATE = READ_IDLE\n");
|
||||
printf("STATE = READ_IDLE %s\n",name_);
|
||||
printf("All data read from slave SDO.\n");
|
||||
//copy complete data to dataBuffer_
|
||||
printBuffer();
|
||||
@@ -317,7 +317,7 @@ int ecmcCANOpenSDO::readDataStateMachine(can_frame *frame) {
|
||||
}
|
||||
|
||||
int ecmcCANOpenSDO::writeDataStateMachine(can_frame *frame) {
|
||||
printf("writeDataStateMachine\n");
|
||||
printf("writeDataStateMachine %s\n",name_);
|
||||
int bytes = 0;
|
||||
switch(writeStates_) {
|
||||
case WRITE_WAIT_FOR_CONF:
|
||||
@@ -332,7 +332,7 @@ int ecmcCANOpenSDO::writeDataStateMachine(can_frame *frame) {
|
||||
writeNextDataToSlave(useTg1Frame_);
|
||||
writeStates_ = WRITE_DATA; //Next frame should be data!
|
||||
if(dbgMode_) {
|
||||
printf("STATE = WRITE_DATA\n");
|
||||
printf("STATE = WRITE_DATA %s\n",name_);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -349,7 +349,7 @@ int ecmcCANOpenSDO::writeDataStateMachine(can_frame *frame) {
|
||||
writeStates_ = WRITE_IDLE;
|
||||
useTg1Frame_ = 0;
|
||||
if(dbgMode_) {
|
||||
printf("STATE = WRITE_IDLE\n");
|
||||
printf("STATE = WRITE_IDLE %s\n",name_);
|
||||
printf("All data written to slave SDO.\n");
|
||||
printBuffer();
|
||||
}
|
||||
@@ -457,7 +457,7 @@ void ecmcCANOpenSDO::setValue(uint8_t *data, size_t bytes) {
|
||||
|
||||
int ecmcCANOpenSDO::writeValue() {
|
||||
// Busy right now!
|
||||
printf("WRITEVALUE!!\n");
|
||||
printf("WRITEVALUE %s\n",name_);
|
||||
|
||||
if(busy_) {
|
||||
return ECMC_CAN_ERROR_SDO_WRITE_BUSY;
|
||||
@@ -474,14 +474,14 @@ int ecmcCANOpenSDO::writeValue() {
|
||||
|
||||
writeStates_ = WRITE_REQ_TRANSFER;
|
||||
if(dbgMode_) {
|
||||
printf("STATE = WRITE_REQ_TRANSFER\n");
|
||||
printf("STATE = WRITE_REQ_TRANSFER %s\n",name_);
|
||||
}
|
||||
|
||||
writeBuffer_->addWriteCAN(&writeReqTransferFrame_);
|
||||
|
||||
writeStates_ = WRITE_WAIT_FOR_CONF;
|
||||
if(dbgMode_) {
|
||||
printf("STATE = WRITE_WAIT_FOR_CONF\n");
|
||||
printf("STATE = WRITE_WAIT_FOR_CONF %s\n",name_);
|
||||
}
|
||||
return 0;
|
||||
// State machine is now in rx frame()
|
||||
@@ -493,15 +493,15 @@ int ecmcCANOpenSDO::tryLock() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool gotLock = ptrSdo1Lock_->test_and_set();
|
||||
if(!gotLock) {
|
||||
bool prevLock = ptrSdo1Lock_->test_and_set();
|
||||
if(prevLock) {
|
||||
// wait for busy to go down
|
||||
return 0;
|
||||
}
|
||||
|
||||
busy_ = gotLock;
|
||||
busy_ = true;
|
||||
epicsMutexUnlock(getLockMutex_);
|
||||
return gotLock;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ecmcCANOpenSDO::tryUnlock() {
|
||||
|
||||
@@ -94,8 +94,6 @@ class ecmcCANOpenSDO {
|
||||
epicsMutexId dataMutex_;
|
||||
epicsMutexId getLockMutex_;
|
||||
int busyCounter_;
|
||||
//std::atomic_flag *ptrSdo1Busy_;
|
||||
//std::atomic_flag busy_;
|
||||
std::atomic_flag *ptrSdo1Lock_;
|
||||
bool busy_;
|
||||
};
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
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
|
||||
REQMOD:mcag-trgt-muts--18678:MODULES
|
||||
REQMOD:mcag-trgt-muts--18678:VERSIONS
|
||||
REQMOD:mcag-trgt-muts--18678:MOD_VER
|
||||
REQMOD:mcag-trgt-muts--18678:exit
|
||||
REQMOD:mcag-trgt-muts--18678:BaseVersion
|
||||
REQMOD:mcag-trgt-muts--18678:require_VER
|
||||
REQMOD:mcag-trgt-muts--18678:ecmccfg_VER
|
||||
REQMOD:mcag-trgt-muts--18678:asyn_VER
|
||||
REQMOD:mcag-trgt-muts--18678:exprtk_VER
|
||||
REQMOD:mcag-trgt-muts--18678:motor_VER
|
||||
REQMOD:mcag-trgt-muts--18678:ecmc_VER
|
||||
REQMOD:mcag-trgt-muts--18678:ecmc_plugin_socketcan_VER
|
||||
|
||||
@@ -77,7 +77,7 @@ ecmcCANOpenAddDevice("testDevice",3)
|
||||
# <ODSize> : Size of PDO (max 8 bytes).
|
||||
# <readTimeoutMs> : Readtimeout in ms.
|
||||
# <writeCycleMs> : Cycle time for write (if <= 0 then only write on change).
|
||||
ecmcCANOpenAddPDO("status",3,0x183,2,8,10000,0) # READ
|
||||
ecmcCANOpenAddPDO("status1",3,0x183,2,8,10000,0) # READ
|
||||
|
||||
# ecmcCANOpenAddSDO -h
|
||||
# Use ecmcCANOpenAddSDO(<name>, <node id>,.....)
|
||||
@@ -91,7 +91,10 @@ ecmcCANOpenAddPDO("status",3,0x183,2,8,10000,0) # READ
|
||||
# <ODSize> : OS Size.
|
||||
# <readTimeoutMs> : Readtimeout in ms.
|
||||
#
|
||||
ecmcCANOpenAddSDO("analogValues",3,0x583,0x603,2,0x2640,0x0,56,7000) # READ
|
||||
ecmcCANOpenAddSDO("analogValues1",3,0x583,0x603,2,0x2640,0x0,56,7000) # READ
|
||||
ecmcCANOpenAddSDO("analogValues2",3,0x583,0x603,2,0x2640,0x0,56,7000) # READ
|
||||
ecmcCANOpenAddSDO("analogValues3",3,0x583,0x603,2,0x2640,0x0,56,7000) # READ
|
||||
ecmcCANOpenAddSDO("analogValues4",3,0x583,0x603,2,0x2640,0x0,56,7000) # READ
|
||||
ecmcCANOpenAddSDO("basicConfig",3,0x583,0x603,1,0x2690,0x1,7,0) # WRITE
|
||||
|
||||
##############################################################################
|
||||
|
||||
Reference in New Issue
Block a user