/* * multi-splitflap.c * * Created on: 07.10.2022 * Author: jonas */ #include #include #include "multi-splitflap.h" #include "McuRTOS.h" #include "McuLog.h" #include "splitflap.h" /* vars */ static dict_t **flapDict; static uint8_t addedFlaps = 0; static const uint8_t BYTES_PER_KEY = 3; static char* flapKeys[NUM_FLAPS]; // reserve memory /* function declarations */ void initFlapKeys(uint8_t numberOfFlaps); /**********************/ /* INIT / DEINIT */ /**********************/ void MultiSplitFlap_Init(){ addedFlaps = 0; flapDict = dictAlloc(); ((dict_t*)flapDict)->key=NULL; ((dict_t*)flapDict)->value=NULL; ((dict_t*)flapDict)->next=NULL; initFlapKeys(NUM_FLAPS); } void MultiSplitFlap_Deinit(void){ dictDealoc(flapDict); addedFlaps = 0; } /**********************/ /* PUBLIC FUNCTIONS */ /**********************/ void MultiSplitFlap_AddFlap(SF_Handle_t splitflap){ McuLog_info("Adding split flap to multi splitflap combination...\n"); addItem(flapDict, flapKeys[addedFlaps], (SF_Handle_t*)splitflap); McuLog_info("Added flap nr. %i/%i.\n", addedFlaps+1, NUM_FLAPS); addedFlaps++; } 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]; char letter_move[] = " "; letter_move[0] = letter; SF_MoveToFlapAsync(sfHandle, letter_move); 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])); //int32_t test = McuULN2003_GetPos(sf1->motor); } uint8_t MultiSplitFlap_GetAmountOfAddedSplitFlaps(void){ return addedFlaps; } /**********************/ /* INTERNAL FUNCTIONS */ /**********************/ void initFlapKeys(uint8_t numberOfFlaps){ for (uint8_t i = 0; i < numberOfFlaps; ++i) { /* get a memory place for the key */ #if SPLITFLAP_CONFIG_USE_FREERTOS_HEAP flapKeys[i] = pvPortMalloc(sizeof(BYTES_PER_KEY)); #else if((flapKeys[i] = malloc(BYTES_PER_KEY)) == NULL){ McuLog_error("Reserving memory for flap num. %i failed!:\n", i); } sprintf(flapKeys[i], "%i", i); #endif } }