fixed multisplitflap not waiting for finishing move,

changed to RTOS delay instead of McuWait
main
Jonas Arnold 4 years ago
parent f83dedcfc7
commit 32dc809b88
  1. 15
      ADIS_tinyK22_SplitFlap/source/application.c
  2. 18
      ADIS_tinyK22_SplitFlap/source/multi-splitflap.c
  3. 5
      ADIS_tinyK22_SplitFlap/source/multi-splitflap.h
  4. 18
      ADIS_tinyK22_SplitFlap/source/splitflap.c
  5. 3
      ADIS_tinyK22_SplitFlap/source/splitflap.h
  6. 2
      ADIS_tinyK22_SplitFlap/source/splitflap_positions.h

@ -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;

@ -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]));

@ -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);

@ -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 */
/**********************/

@ -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_ */

@ -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_ */

Loading…
Cancel
Save