diff --git a/components/DendoStepper/DendoStepper.cpp b/components/DendoStepper/DendoStepper.cpp index 07d31aa..d053874 100644 --- a/components/DendoStepper/DendoStepper.cpp +++ b/components/DendoStepper/DendoStepper.cpp @@ -128,10 +128,13 @@ esp_err_t DendoStepper::runPos(int32_t relative) if (ctrl.dir == newDir){ //current direction is the same ctrl.statusPrev = ctrl.status; //update previous status ctrl.status = ctrl.status==COAST ? COAST : ACC; //stay at coast otherwise switch to ACC + xSemaphoreTake(semaphore_isrVariables, portMAX_DELAY); calc(abs(relative + ctrl.stepsRemaining)); //calculate new velolcity profile for new+remaining steps + ESP_LOGW("DendoStepper", "EXTEND running movement (stepsRemaining: %d + stepsNew: %d)", ctrl.stepsRemaining, relative); + xSemaphoreGive(semaphore_isrVariables); } else { //direction has changed //direction change not supported TODO wait for decel finish / queue? - STEP_LOGW("DendoStepper", "DIRECTION HOT-CHANGE NOT SUPPORTED - Finising previous move, this command will be ignored"); + STEP_LOGE("DendoStepper", "DIRECTION HOT-CHANGE NOT SUPPORTED - Finising previous move, this command will be ignored"); return ESP_ERR_NOT_SUPPORTED; } } @@ -333,14 +336,17 @@ bool DendoStepper::xISR() ctrl.stepCnt++; - //CUSTOM: track actual precice current position - if (ctrl.dir) { - ctrl.posActual ++; - } else { - ctrl.posActual --; - } + ////CUSTOM: track actual precice current position + //if (ctrl.dir) { + // ctrl.posActual ++; + //} else { + // ctrl.posActual --; + //} + //CUSTOM: track remaining steps for eventually resuming + xSemaphoreTake(semaphore_isrVariables, portMAX_DELAY); ctrl.stepsRemaining = ctrl.stepCnt - ctrl.stepCnt; + xSemaphoreGive(semaphore_isrVariables); // we are done if (ctrl.stepsToGo == ctrl.stepCnt && !ctrl.runInfinite) diff --git a/components/DendoStepper/include/DendoStepper.h b/components/DendoStepper/include/DendoStepper.h index a327ecc..9b535ad 100644 --- a/components/DendoStepper/include/DendoStepper.h +++ b/components/DendoStepper/include/DendoStepper.h @@ -29,6 +29,7 @@ #include "freertos/task.h" #include "esp_timer.h" #include "math.h" +#include "freertos/semphr.h" //#define STEP_DEBUG @@ -95,7 +96,7 @@ typedef struct uint32_t accSteps = 0; uint32_t decSteps = 0; int32_t stepsRemaining = 0; - uint64_t posActual = 0; //actual current pos incremented at every step + //uint64_t posActual = 0; //actual current pos incremented at every step uint8_t statusPrev = DISABLED; //FIXME currently unused uint8_t status = DISABLED; bool dir = CW; @@ -111,6 +112,7 @@ private: ctrl_var_t ctrl; esp_timer_handle_t dyingTimer; TaskHandle_t enTask; + SemaphoreHandle_t semaphore_isrVariables = NULL; uint64_t currentPos = 0; // absolute position bool timerStarted = 0; diff --git a/main/guide-stepper.cpp b/main/guide-stepper.cpp index 8dbd96b..e70c890 100644 --- a/main/guide-stepper.cpp +++ b/main/guide-stepper.cpp @@ -34,7 +34,7 @@ extern "C" #define ACCEL_MS 100.0 //ms from 0 to max #define DECEL_MS 90.0 //ms from max to 0 -#define STEPPER_STEPS_PER_ROT 1600 +#define STEPPER_STEPS_PER_ROT 800 #define STEPPER_STEPS_PER_MM STEPPER_STEPS_PER_ROT/4 #define D_CABLE 6 @@ -71,7 +71,7 @@ void travelSteps(int stepsTarget){ //--- wait if direction changed --- if (dirPrev != dir){ - ESP_LOGI(TAG, " dir-change detected - waiting for move to finish \n "); + ESP_LOGW(TAG, " dir-change detected - waiting for move to finish \n "); while(step.getState() != 1) vTaskDelay(1); //wait for move to finish } @@ -235,6 +235,8 @@ void task_stepper_ctl(void *pvParameter) //read potentiometer and normalize (0-1) to get a variable for testing potiModifier = (float) gpio_readAdc(ADC_CHANNEL_POTI) / 4095; //0-4095 -> 0-1 //ESP_LOGI(TAG, "current poti-modifier = %f", potiModifier); + ESP_LOGI(TAG, "delaying stepper-ctl task by %.1f ms (poti value)", 2000 * potiModifier); + vTaskDelay(2000 * potiModifier / portTICK_PERIOD_MS); //calculate steps to move cableLen = (double)encStepsDelta * 1000 / ENCODER_STEPS_PER_METER;