1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-08-30 17:49:56 +02:00

Changed trinamic to use pinmapper [untested]. Fixed a few minor bugs.

This commit is contained in:
Stefan de Bruijn
2021-07-03 21:36:16 +02:00
parent 56081e4786
commit d9c76505c0
10 changed files with 20 additions and 74 deletions

View File

@@ -945,7 +945,7 @@ Error gc_execute_line(char* line, uint8_t client) {
pValue = trunc(gc_block.values.p); // Convert p value to integer
if (pValue > 0) {
// P1 means G54, P2 means G55, etc.
coord_select = static_cast<CoordIndex>(pValue - 1 + CoordIndex::G54);
coord_select = static_cast<CoordIndex>(pValue - 1 + int(CoordIndex::G54));
} else {
// P0 means use currently-selected system
coord_select = gc_block.modal.coord_select;

View File

@@ -42,7 +42,8 @@
#include <freertos/queue.h>
#include <Arduino.h> // IRAM_ATTR
#include <string.h> // memset, memcpy
#include <atomic>
#include <algorithm> // min, max
#include <atomic> // fence
AxisMask limitAxes = 0; // Axes that have limit switches
AxisMask homingAxes = 0; // Axes that have homing configured

View File

@@ -25,43 +25,6 @@
#include <TMCStepper.h> // https://github.com/teemuatlut/TMCStepper
#include <atomic>
// This is global so it can be accessed from the override
namespace Motors {
namespace Details {
// How this hack works... In short, we just derive from the TMCStepper classes, and add the pin as a field. This is
// fine of course, as long as we know what CS pin we have to switch. Unfortunately, this is a bit tougher, because
// the TMC5160Stepper class derives from TMC2130Stepper. Normally, this is solved through multiple inheritance, where
// we put the pin in the second class. Unfortunately, that requires dynamic_cast down the road, which is not available.
// So instead, we use the old _pinCS in the TMC2130Stepper class to figure out which class we actually have, and cast
// away with static_cast.
class MyTMC2130Stepper : public TMC2130Stepper {
public:
MyTMC2130Stepper(Pin& cspin, float rsense, int spiIndex) : TMC2130Stepper(2130, rsense, spiIndex), _cspin(cspin) {}
Pin& _cspin;
};
class MyTMC5160Stepper : public TMC5160Stepper {
public:
MyTMC5160Stepper(Pin& cspin, float rsense, int spiIndex) : TMC5160Stepper(5160, rsense, spiIndex), _cspin(cspin) {}
Pin& _cspin;
};
}
}
// Override default functions to use our pin framework
void TMC2130Stepper::switchCSpin(bool state) {
// We use the _pinCS to figure out which derived class we have
switch (this->_pinCS) {
case 2130:
static_cast<Motors::Details::MyTMC2130Stepper*>(this)->_cspin.synchronousWrite(state);
break;
case 5160:
static_cast<Motors::Details::MyTMC5160Stepper*>(this)->_cspin.synchronousWrite(state);
break;
}
}
namespace Motors {
TrinamicDriver::TrinamicDriver(uint16_t driver_part_number, int8_t spi_index) :
TrinamicBase(driver_part_number), _spi_index(spi_index) {}
@@ -69,10 +32,13 @@ namespace Motors {
void TrinamicDriver::init() {
_has_errors = false;
_cs_pin.setAttr(Pin::Attr::Output | Pin::Attr::InitialOn);
_cs_mapping = PinMapper(_cs_pin);
if (_driver_part_number == 2130) {
tmcstepper = new Details::MyTMC2130Stepper(_cs_pin, _r_sense, _spi_index);
tmcstepper = new TMC2130Stepper(_cs_mapping.pinId(), _r_sense, _spi_index);
} else if (_driver_part_number == 5160) {
tmcstepper = new Details::MyTMC5160Stepper(_cs_pin, _r_sense, _spi_index);
tmcstepper = new TMC5160Stepper(_cs_mapping.pinId(), _r_sense, _spi_index);
} else {
info_serial("%s Unsupported Trinamic part number TMC%d", reportAxisNameMsg(axis_index(), dual_axis_index()), _driver_part_number);
_has_errors = true; // This motor cannot be used
@@ -81,8 +47,6 @@ namespace Motors {
_has_errors = false;
_cs_pin.setAttr(Pin::Attr::Output | Pin::Attr::InitialOn);
// use slower speed if I2S
if (_cs_pin.capabilities().has(Pin::Capabilities::I2S)) {
tmcstepper->setSPISpeed(_spi_freq);

View File

@@ -21,6 +21,7 @@
#include "TrinamicBase.h"
#include "../Pin.h"
#include "../PinMapper.h"
#include <cstdint>
@@ -40,6 +41,7 @@ namespace Motors {
TMC2130Stepper* tmcstepper; // all other driver types are subclasses of this one
Pin _cs_pin; // The chip select pin (can be the same for daisy chain)
PinMapper _cs_mapping;
int8_t _spi_index;
bool test();

View File

@@ -240,9 +240,3 @@ char* trim(char* str) {
end[1] = '\0';
return str;
}
// Returns the number of set number of set bits
// Would return 3 for 01100010
int numberOfSetBits(uint32_t i) {
return __builtin_popcount(i);
}

View File

@@ -112,8 +112,6 @@ float constrain_float(float in, float min, float max);
bool char_is_numeric(char value);
char* trim(char* value);
int numberOfSetBits(uint32_t i);
template <class T>
void swap(T& a, T& b) {
T c(a);

View File

@@ -8,6 +8,7 @@
#include <map>
#include <cstring>
#include <vector>
#include <nvs.h>
#ifdef ENABLE_WIFI
@@ -211,7 +212,11 @@ void StringSetting::load() {
_currentValue = _defaultValue;
return;
}
char buf[len];
// TODO: Can't we allocate the string immediately?
std::vector<char> buffer;
buffer.resize(len);
char* buf = buffer.data();
err = nvs_get_str(_handle, _keyName, buf, &len);
if (err) {
_storedValue = _defaultValue;

View File

@@ -106,7 +106,7 @@ float system_convert_axis_steps_to_mpos(int32_t* steps, uint8_t idx) {
void system_convert_array_steps_to_mpos(float* position, int32_t* steps) {
auto n_axis = config->_axes->_numberAxis;
float motors[n_axis];
float motors[MAX_N_AXIS];
for (int idx = 0; idx < n_axis; idx++) {
motors[idx] = (float)steps[idx] / config->_axes->_axis[idx]->_stepsPerMm;
}

View File

@@ -2,27 +2,10 @@
#include "Task.h"
#include "Queue.h"
#include <mutex>
/* "mux" data structure (spinlock) */
typedef struct {
/* owner field values:
* 0 - Uninitialized (invalid)
* portMUX_FREE_VAL - Mux is free, can be locked by either CPU
* CORE_ID_PRO / CORE_ID_APP - Mux is locked to the particular core
*
* Any value other than portMUX_FREE_VAL, CORE_ID_PRO, CORE_ID_APP indicates corruption
*/
uint32_t owner;
/* count field:
* If mux is unlocked, count should be zero.
* If mux is locked, count is non-zero & represents the number of recursive locks on the mux.
*/
uint32_t count;
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
const char* lastLockedFn;
int lastLockedLine;
#endif
} portMUX_TYPE;
using portMUX_TYPE = std::mutex;
#define portMAX_DELAY (TickType_t)0xffffffffUL

View File

@@ -51,8 +51,7 @@ TickType_t xTaskGetTickCount(void);
// Keep this in sync with the portMUX_TYPE struct definition please.
#ifndef CONFIG_FREERTOS_PORTMUX_DEBUG
# define portMUX_INITIALIZER_UNLOCKED \
{ .owner = portMUX_FREE_VAL, .count = 0, }
# define portMUX_INITIALIZER_UNLOCKED {}
#else
# define portMUX_INITIALIZER_UNLOCKED \
{ .owner = portMUX_FREE_VAL, .count = 0, .lastLockedFn = "(never locked)", .lastLockedLine = -1 }