void MPhysics2DPanning::setPosition(const QPointF &position, bool resetPhysics) { Q_D(MPhysics2DPanning); if (QPointF(d->posX, d->posY) != position) { if (d->panDirection.testFlag(Qt::Horizontal)) d->posX = position.x(); if (d->panDirection.testFlag(Qt::Vertical)) d->posY = position.y(); emit positionChanged(position); if (inMotion()) { // If we are in the middle of the movement, we should reduce the speed // but not stop because we might be outside bounds. if (resetPhysics) { d->velX = 0.0; d->velY = 0.0; } } else { // Starts the physics in case the position is set to border // and it needs to slide back into range start(); } } }
void MPhysics2DPanning::start() { Q_D(MPhysics2DPanning); if (!inMotion()) { d->velX = 0.0f; d->velY = 0.0f; // Duration does not matter as we loop until the physics termination condition is hit d->panningAnimation->setDuration(1000000); d->panningAnimation->setLoopCount(-1); d->panningAnimation->setStartValue(0.0f); d->panningAnimation->setEndValue(1.0f); d->integrationStepTimer.invalidate(); d->panningAnimation->start(); } }
void runNode(void *data) { MoveNode *currNode = (MoveNode *)data; MoveNode *currChild = currNode->child; if (currNode->nodeId == NULL) { return; } for (int i = 0; i < pairMap[currNode->nPairId].numSensors; i++) { Sensor *sensor = &pairMap[currNode->nPairId].sensors[i]; // createSensor(sensor); /*if (sensor->type == SHAFT_ENCODER) { sensor->enc = encoderInit(sensor->port, sensor->port + 1, false); }*/ startSensor(sensor); sensor = NULL; } signed char *saveState = NULL; printDebug("Started node."); // printf("Started node %d.\n\r", currNode->nodeId); // printf("Node's child: %d\n\r", currChild->nodeId); int nextPoint = 0; setMotorSpeeds(currNode, nextPoint); nextPoint++; while (nextPoint < currNode->numPoints) { // printf("DEBUG: %d\n\r", nextPoint); while (joystickGetDigital(1, 5, JOY_UP)) { // pause if (saveState == NULL) { saveState = malloc(pairMap[currNode->nPairId].numPorts * sizeof(*(saveState))); if (saveState == NULL) { return; // break completely } for (int i = 0; i < pairMap[currNode->nPairId].numPorts; i++) { saveState[i] = motorGet(pairMap[currNode->nPairId].motorPorts[i]); motorStop(pairMap[currNode->nPairId].motorPorts[i]); } for (int i = 0; i < pairMap[currNode->nPairId].numSensors; i++) { if (pairMap[currNode->nPairId].sensors[i].type == TIME) { pauseTimer(pairMap[currNode->nPairId].sensors[i].port, true); } } printDebug("Paused!"); } if (joystickGetDigital(1, 8, JOY_DOWN)) { // stop it entirely printDebug("Stopping!"); for (int i = 0; i < pairMap[currNode->nPairId].numSensors; i++) { if (pairMap[currNode->nPairId].sensors[i].type == TIME) { resumeTimer(pairMap[currNode->nPairId].sensors[i].port, true); } } free(saveState); saveState = NULL; return; } delay(20); } if (outOfMemory) { return; } if (saveState != NULL) { for (int i = 0; i < pairMap[currNode->nPairId].numPorts; i++) { motorSet(pairMap[currNode->nPairId].motorPorts[i], saveState[i]); } for (int i = 0; i < pairMap[currNode->nPairId].numSensors; i++) { if (pairMap[currNode->nPairId].sensors[i].type == TIME) { resumeTimer(pairMap[currNode->nPairId].sensors[i].port, true); } } free(saveState); saveState = NULL; } if (reachedPoint(currNode, currNode->points[nextPoint].endSensorVal, currNode->points[nextPoint - 1].endSensorVal)) { setMotorSpeeds(currNode, nextPoint); nextPoint++; } if (currChild != NULL) { // printf("DEBUG: %d %d %d\n\r", currChild->nodeId, nextPoint, currChild->startPoint); if (nextPoint + 1 >= currChild->startPoint && needToStart(currNode, currChild)) { void *param = (void *)currChild; taskCreate(runNode, TASK_DEFAULT_STACK_SIZE / 2, param, TASK_PRIORITY_DEFAULT); currChild = currChild->sibling; } } delay(5); } printDebug("Finished node."); // printf("Finished node %d.", currNode->nodeId); if (findParent(currNode)->nodeId == rootNode->nodeId) { while (inMotion()) { delay(20); } if (currNode->sibling != NULL) { delay(currNode->sibling->startVal[0]); runNode(currNode->sibling); } else { printDebug("Done."); delay(500); } } }