size_t GetAns(const size_t fieldSize, const size_t w, const vector_2d_size_t& diff, const size_t firstLevel, vector_move_t& sequence) { const size_t k = diff.size(); size_t ans = fieldSize; sequence.clear(); sequence.push_back(move_t(firstLevel, 0)); set_size_t used; used.insert(firstLevel); set_size_t unused; for (size_t i = 0; i < k; i++) { if (i != firstLevel) unused.insert(i); } for (size_t i = 1; i < k; i++) { size_t minDiff = 0; size_t minIndex = 0; const size_t minUnused = GetMinUnused(used, unused, diff, minDiff, minIndex); LOCAL_ASSERT(used.find(minUnused) == used.end()); LOCAL_ASSERT(unused.find(minUnused) != unused.end()); if (minDiff * w < fieldSize) { sequence.push_back(move_t(minUnused, minIndex + 1)); ans += minDiff * w; } else { sequence.push_back(move_t(minUnused, 0)); ans += fieldSize; } used.insert(minUnused); unused.erase(minUnused); } LOCAL_ASSERT(unused.empty()); return ans; }
/*Moves every motor that has to be moved.*/ void StepperControl::performTask(uint8_t taskIndex){ //If there is a task to execute, do so. if(taskList[2][taskIndex] != 0){ idleCounter = 0; //Resetting idle counter since at least one motor is being moved now. for(int i=0; i<motorsCount; i++){ if(taskList[2][taskIndex] & (1 << i)) move_t(i); } taskList[2][taskIndex] = 0; //taskList[1][taskIndex] = 0; } }