/*! * \brief follows a line segment. * \return Returns TRUE if still on line segment */ bool FollowSegment(void) { uint16_t currLine; REF_LineKind currLineKind; currLine = REF_GetLineValue(); currLineKind = REF_GetLineKind(); if (currLineKind==REF_LINE_STRAIGHT) { PID_Line(currLine, REF_MIDDLE_LINE_VALUE); /* move along the line */ return TRUE; } else { return FALSE; /* intersection/change of direction or not on line any more */ } }
void TURN_Turn(TURN_Kind kind, bool toLine) { #if 0 uint16_t lineVal; bool online; #endif switch(kind) { case TURN_LEFT90: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), -TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), TURN_DutyPercent); #if 0 if (toLine) { WAIT1_WaitOSms(TURN_TimeMs*2/3); /* turn half way */ do { lineVal = REF_GetLineValue(&online); } while(lineVal>REF_MIDDLE_LINE_VALUE); } else { WAIT1_WaitOSms(TURN_TimeMs); /* only use waiting time */ } #else WAIT1_WaitOSms(TURN_TimeMs); /* only use waiting time */ #endif #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_RIGHT90: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -TURN_DutyPercent); #if 0 if (toLine) { WAIT1_WaitOSms(TURN_TimeMs*2/3); /* turn half way */ do { lineVal = REF_GetLineValue(&online); } while(lineVal<REF_MIDDLE_LINE_VALUE); } else { WAIT1_WaitOSms(TURN_TimeMs); /* only use waiting time */ } #else WAIT1_WaitOSms(TURN_TimeMs); /* only use waiting time */ #endif #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_LEFT180: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), -TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), TURN_DutyPercent); WAIT1_WaitOSms(2*TURN_TimeMs); #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_RIGHT180: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -TURN_DutyPercent); WAIT1_WaitOSms(2*TURN_TimeMs); #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_STEP_FW: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), TURN_DutyPercent); WAIT1_WaitOSms(TURN_StepMs); #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_STEP_BW: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), -TURN_DutyPercent); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -TURN_DutyPercent); WAIT1_WaitOSms(TURN_StepMs); #if TURN_STOP_AFTER_TURN MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif #endif break; case TURN_STOP: MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 0); MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 0); #if TURN_WAIT_AFTER_STEP_MS > 0 WAIT1_WaitOSms(TURN_WAIT_AFTER_STEP_MS); #endif break; default: break; } }