Skip to content

Commit a708735

Browse files
committed
More encoder validity checks
1 parent bc63e6a commit a708735

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

Firmware/FFBoard/Src/Axis.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "ODriveCAN.h"
1414
#include "MotorSimplemotion.h"
1515
#include "RmdMotorCAN.h"
16+
#include "critical.hpp"
1617

1718
//////////////////////////////////////////////
1819
/*
@@ -282,8 +283,9 @@ uint8_t Axis::getEncType(){
282283
void Axis::setPos(uint16_t val)
283284
{
284285
startForceFadeIn(0.25,0.5);
285-
if(this->drv != nullptr){
286-
drv->getEncoder()->setPos(val);
286+
Encoder* enc_p = getEncoder();
287+
if(enc_p != nullptr){
288+
enc_p->setPos(val);
287289
}
288290
}
289291

@@ -292,6 +294,7 @@ MotorDriver* Axis::getDriver(){
292294
}
293295

294296
Encoder* Axis::getEncoder(){
297+
if(!drv) return nullptr;
295298
return drv->getEncoder();
296299
}
297300

@@ -306,7 +309,7 @@ void Axis::prepareForUpdate(){
306309

307310
//if (!drv->motorReady()) return;
308311

309-
float angle = getEncAngle(this->drv->getEncoder());
312+
float angle = getEncAngle(getEncoder());
310313

311314
// Scale encoder value to set rotation range
312315
// Update a change of range only when new range is within valid range
@@ -394,21 +397,21 @@ void Axis::setDrvType(uint8_t drvtype)
394397
{
395398
return;
396399
}
397-
this->drv.reset(nullptr);
398-
MotorDriver* drv = drv_chooser.Create((uint16_t)drvtype);
400+
cpp_freertos::CriticalSection::Enter();
401+
this->drv.reset(drv_chooser.Create((uint16_t)drvtype));
399402
if (drv == nullptr)
400403
{
404+
cpp_freertos::CriticalSection::Exit();
401405
return;
402406
}
403-
this->drv = std::unique_ptr<MotorDriver>(drv);
404407
this->conf.drvtype = drvtype;
405408

406409
// Pass encoder to driver again
407410
if(!this->drv->hasIntegratedEncoder()){
408411
this->drv->setEncoder(this->enc);
409412
}
410413
#ifdef TMC4671DRIVER
411-
if (dynamic_cast<TMC4671 *>(drv))
414+
if (dynamic_cast<TMC4671 *>(drv.get()))
412415
{
413416
setupTMC4671();
414417
}
@@ -422,6 +425,7 @@ void Axis::setDrvType(uint8_t drvtype)
422425
{
423426
drv->startMotor();
424427
}
428+
cpp_freertos::CriticalSection::Exit();
425429
}
426430

427431
#ifdef TMC4671DRIVER
@@ -461,7 +465,7 @@ void Axis::setEncType(uint8_t enctype)
461465
this->conf.enctype = 0; // None encoder
462466
}
463467

464-
float angle = getEncAngle(this->drv->getEncoder());
468+
float angle = getEncAngle(this->getEncoder());
465469
//int32_t scaledEnc = scaleEncValue(angle, degreesOfRotation);
466470
// reset metrics
467471
this->resetMetrics(angle);
@@ -939,14 +943,14 @@ CommandStatus Axis::command(const ParsedCommand& cmd,std::vector<CommandReply>&
939943
break;
940944

941945
case Axis_commands::pos:
942-
if (cmd.type == CMDtype::get && this->drv->getEncoder() != nullptr)
946+
if (cmd.type == CMDtype::get && getEncoder() != nullptr)
943947
{
944-
int32_t pos = this->drv->getEncoder()->getPos();
948+
int32_t pos = getEncoder()->getPos();
945949
replies.emplace_back(isInverted() ? -pos : pos);
946950
}
947-
else if (cmd.type == CMDtype::set && this->drv->getEncoder() != nullptr)
951+
else if (cmd.type == CMDtype::set && getEncoder() != nullptr)
948952
{
949-
this->drv->getEncoder()->setPos(isInverted() ? -cmd.val : cmd.val);
953+
getEncoder()->setPos(isInverted() ? -cmd.val : cmd.val);
950954
}
951955
else
952956
{
@@ -1024,8 +1028,8 @@ CommandStatus Axis::command(const ParsedCommand& cmd,std::vector<CommandReply>&
10241028
if (cmd.type == CMDtype::get)
10251029
{
10261030
uint32_t cpr = 0;
1027-
if(this->drv->getEncoder() != nullptr){
1028-
cpr = this->drv->getEncoder()->getCpr();
1031+
if(this->getEncoder() != nullptr){
1032+
cpr = this->getEncoder()->getCpr();
10291033
}
10301034
//#ifdef TMC4671DRIVER // CPR should be consistent with position. Maybe change TMC to prescale to encoder count or correct readout in UI
10311035
// TMC4671 *tmcdrv = dynamic_cast<TMC4671 *>(this->drv.get()); // Special case for TMC. Get the actual encoder resolution

0 commit comments

Comments
 (0)