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(){
282283void 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
294296Encoder* 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