From 32dc809b88508d05647d27ad998b9fb191478c91 Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Thu, 20 Oct 2022 13:02:24 +0200 Subject: [PATCH] fixed multisplitflap not waiting for finishing move, changed to RTOS delay instead of McuWait --- ADIS_tinyK22_SplitFlap/source/application.c | 15 +++++++++++---- .../source/multi-splitflap.c | 18 +++++++++++++++++- .../source/multi-splitflap.h | 5 +++-- ADIS_tinyK22_SplitFlap/source/splitflap.c | 18 +++++++++++++----- ADIS_tinyK22_SplitFlap/source/splitflap.h | 3 +++ .../source/splitflap_positions.h | 2 +- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/ADIS_tinyK22_SplitFlap/source/application.c b/ADIS_tinyK22_SplitFlap/source/application.c index 174a3e2..710429c 100644 --- a/ADIS_tinyK22_SplitFlap/source/application.c +++ b/ADIS_tinyK22_SplitFlap/source/application.c @@ -82,8 +82,15 @@ static void App_Task(void* pv){ #endif /* MULTI SPLIT FLAP TESTING */ - char sentence[] = "JONAS!"; - MultiSplitFlap_Display(sentence); + char sentences[][2] = {"HI", "IT", "IS", "ME", "!!" }; // "COLLIN!"; + while(1){ + for(int i = 0; i < sizeof(sentences)/sizeof(sentences[0]); i++){ + MultiSplitFlap_Display(sentences[i]); + vTaskDelay(pdMS_TO_TICKS(2000)); + } + } + + // endless loop (no return! this would produce an bkpt0) for(;;) {} @@ -166,7 +173,7 @@ void configureSplitflaps(void){ /* create config instance for splitflap 0 */ SF_Config_t sf0Config; sf0Config.setupIdentifier = 0; - sf0Config.hardwareIdentifier = 34; + sf0Config.hardwareIdentifier = 4; sf0Config.magSensorConfig = magSensor0Config; sf0Config.motorConfig = motor0Config; @@ -203,7 +210,7 @@ void configureSplitflaps(void){ /* create config instance for splitflap 0 */ SF_Config_t sf1Config; sf1Config.setupIdentifier = 1; - sf1Config.hardwareIdentifier = 35; + sf1Config.hardwareIdentifier = 22; sf1Config.magSensorConfig = magSensor1Config; sf1Config.motorConfig = motor1Config; diff --git a/ADIS_tinyK22_SplitFlap/source/multi-splitflap.c b/ADIS_tinyK22_SplitFlap/source/multi-splitflap.c index 95156ac..e34cef6 100644 --- a/ADIS_tinyK22_SplitFlap/source/multi-splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/multi-splitflap.c @@ -48,7 +48,8 @@ void MultiSplitFlap_AddFlap(SF_Handle_t splitflap){ addedFlaps++; } -void MultiSplitFlap_Display(char sentence[]){ +bool MultiSplitFlap_Display(char sentence[]){ + // Start movements for (uint8_t num = 0; num < NUM_FLAPS; ++num) { SF_Handle_t sfHandle = (SF_Handle_t)(getItem(*flapDict, flapKeys[num])); char letter = sentence[num]; @@ -58,6 +59,21 @@ void MultiSplitFlap_Display(char sentence[]){ McuLog_info("Multi splitflap: Commanded Flap nr. %i to letter '%c'.\n", num+1, letter); vTaskDelay(pdMS_TO_TICKS(100)); } + + // wait until finished + bool done = false; + while(done == false){ + done = true; + for (uint8_t num = 0; num < NUM_FLAPS; ++num) { + SF_Handle_t sfHandle = (SF_Handle_t)(getItem(*flapDict, flapKeys[num])); + if(SF_GetCurrentState(sfHandle) == SF_STATE_MOVING){ + done = false; + } + } + } + + return done; + // for testing purposes only //SF_t* sf0 = (SF_t*)(SF_Handle_t)(getItem(*flapDict, flapKeys[0])); //SF_t* sf1 = (SF_t*)(SF_Handle_t)(getItem(*flapDict, flapKeys[1])); diff --git a/ADIS_tinyK22_SplitFlap/source/multi-splitflap.h b/ADIS_tinyK22_SplitFlap/source/multi-splitflap.h index bded770..6a4af0b 100644 --- a/ADIS_tinyK22_SplitFlap/source/multi-splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/multi-splitflap.h @@ -23,8 +23,9 @@ void MultiSplitFlap_Deinit(void); void MultiSplitFlap_AddFlap(SF_Handle_t splitflap); /* display a sentence on the splitflap combination - * splitflaps must be initialized to be able to display something!*/ -void MultiSplitFlap_Display(char sentence[]); + * splitflaps must be initialized to be able to display something! + * returns true when all movements finished */ +bool MultiSplitFlap_Display(char sentence[]); /* returns the amount of registered split flap displays in the combination */ uint8_t MultiSplitFlap_GetAmountOfAddedSplitFlaps(void); diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.c b/ADIS_tinyK22_SplitFlap/source/splitflap.c index c17d238..7dd1afd 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.c +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.c @@ -46,7 +46,7 @@ void SF_InitConfig(void){ // + 0.5 so the rounding is done correctly int32_t position = (stepsPerSegment * (float)i + 0.5); addItem(splitFlapDict, SF_Letters[i], (int32_t*)position); - McuLog_info("Letter '%s': Position %i", SF_Letters[i], (int)position); + //McuLog_info("Letter '%s': Position %i", SF_Letters[i], (int)position); } } @@ -154,13 +154,15 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ // move out of sensor while(SF_GetMagSensorAtZeroPosition((SF_t*)instance) == true){ McuULN2003_IncStep(((SF_t*)instance)->motor); - McuWait_Waitms(20); + vTaskDelay(pdMS_TO_TICKS(20)); + //McuWait_Waitms(20); } // turn until sensor is on and not reached one full rotation already (timeout) while(SF_GetMagSensorAtZeroPosition((SF_t*)instance) == false && numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND ){ McuULN2003_IncStep(((SF_t*)instance)->motor); - McuWait_Waitms(20); + vTaskDelay(pdMS_TO_TICKS(20)); + //McuWait_Waitms(20); numStepsMoved++; } @@ -168,7 +170,8 @@ bool SF_MoveMotorToZeroPosition(SF_Handle_t instance){ if(numStepsMoved < SPLITFLAP_STEPS_ONE_ROUND){ for(int i=0; i < offsetSteps; i++){ McuULN2003_IncStep(((SF_t*)instance)->motor); - McuWait_Waitms(20); + vTaskDelay(pdMS_TO_TICKS(20)); + //McuWait_Waitms(20); } } McuULN2003_SetPos(((SF_t*)instance)->motor, 0); @@ -206,7 +209,8 @@ void SF_MoveSteps(SF_Handle_t instance, uint32_t steps){ if(McuULN2003_StepCallback(((SF_t*)instance)->motor, true)){ steps--; } - McuWait_Waitms(1); + vTaskDelay(pdMS_TO_TICKS(1)); + //McuWait_Waitms(1); } McuULN2003_AccelerationEnd(((SF_t*)instance)->motor); @@ -264,6 +268,10 @@ int32_t SF_GetMotorPosition(SF_Handle_t instance){ return McuULN2003_GetPos(((SF_t*)instance)->motor); } +SF_State SF_GetCurrentState(SF_Handle_t instance){ + return ((SF_t*)instance)->state; +} + /**********************/ /* INTERNAL FUNCTIONS */ /**********************/ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap.h b/ADIS_tinyK22_SplitFlap/source/splitflap.h index 7dfbbaa..bfb112f 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap.h @@ -112,6 +112,9 @@ void SF_MoveToFlapAsync(SF_Handle_t instance, Flap_t flap); /* get current position of motor */ int32_t SF_GetMotorPosition(SF_Handle_t instance); +/* get current state of the split flap */ +SF_State SF_GetCurrentState(SF_Handle_t instance); + #endif /* SPLITFLAP_H_ */ diff --git a/ADIS_tinyK22_SplitFlap/source/splitflap_positions.h b/ADIS_tinyK22_SplitFlap/source/splitflap_positions.h index 29cf73b..7e826b1 100644 --- a/ADIS_tinyK22_SplitFlap/source/splitflap_positions.h +++ b/ADIS_tinyK22_SplitFlap/source/splitflap_positions.h @@ -18,7 +18,7 @@ Flap_t SF_Letters[] = { " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", " "!", "?", ":"}; /* registers offset steps for initialization per hwId. [0] = hwId. [1] = offsetSteps */ -HardwareIdentifier_t offsetStepsPerHw[][2] = { {33, 12}, {35, 20}}; +HardwareIdentifier_t offsetStepsPerHw[][2] = { {6, 0}, {22, 13}}; #endif /* SPLITFLAP_POSITIONS_H_ */