Ejemplo n.º 1
0
BAND *bd_copy(const BAND *A, BAND *B)
#endif
{
   int lb,ub,i,j,n;
   
   if ( !A )
     error(E_NULL,"bd_copy");

   if (A == B) return B;
   
   n = A->mat->n;
   if ( !B )
     B = bd_get(A->lb,A->ub,n);
   else if (B->lb != A->lb || B->ub != A->ub || B->mat->n != n )
     B = bd_resize(B,A->lb,A->ub,n);
   
   if (A->mat == B->mat) return B;
   ub = B->ub = A->ub;
   lb = B->lb = A->lb;

   for ( i=0, j=n-lb; i <= lb; i++, j++ )
     MEM_COPY(A->mat->me[i],B->mat->me[i],j*sizeof(Real));   

   for ( i=lb+1, j=1; i <= lb+ub; i++, j++ )
     MEM_COPY(A->mat->me[i]+j,B->mat->me[i]+j,(n - j)*sizeof(Real));     

   return B;
}
Ejemplo n.º 2
0
BAND *bd_resize(BAND *A, int new_lb, int new_ub, int new_n)
#endif
{
   int lb,ub,i,j,l,shift,umin;
   Real **Av;

   if (new_lb < 0 || new_ub < 0 || new_n <= 0)
     error(E_NEG,"bd_resize");
   if ( ! A )
     return bd_get(new_lb,new_ub,new_n);
    if ( A->lb+A->ub+1 > A->mat->m )
	error(E_INTERN,"bd_resize");

   if ( A->lb == new_lb && A->ub == new_ub && A->mat->n == new_n )
	return A;

   lb = A->lb;
   ub = A->ub;
   Av = A->mat->me;
   umin = min(ub,new_ub);

    /* ensure that unused triangles at edges are zero'd */

   for ( i = 0; i < lb; i++ )
      for ( j = A->mat->n - lb + i; j < A->mat->n; j++ )
	Av[i][j] = 0.0;  
    for ( i = lb+1,l=1; l <= umin; i++,l++ )
      for ( j = 0; j < l; j++ )
	Av[i][j] = 0.0; 

   new_lb = A->lb = min(new_lb,new_n-1);
   new_ub = A->ub = min(new_ub,new_n-1);
   A->mat = m_resize(A->mat,new_lb+new_ub+1,new_n);
   Av = A->mat->me;

   /* if new_lb != lb then move the rows to get the main diag 
      in the new_lb row */

   if (new_lb > lb) {
      shift = new_lb-lb;

      for (i=lb+umin, l=i+shift; i >= 0; i--,l--)
	MEM_COPY(Av[i],Av[l],new_n*sizeof(Real));
      for (l=shift-1; l >= 0; l--)
	__zero__(Av[l],new_n);
   }
   else if (new_lb < lb) { 
      shift = lb - new_lb;

      for (i=shift, l=0; i <= lb+umin; i++,l++)
	MEM_COPY(Av[i],Av[l],new_n*sizeof(Real));
      for (i=lb+umin+1; i <= new_lb+new_ub; i++)
	__zero__(Av[i],new_n);
   }

   return A;
}
Ejemplo n.º 3
0
int test_traj_end(int why)
{

    if((why & END_TRAJ) && trajectory_finished(&robot.traj))
        return END_TRAJ;

    if (why & END_NEAR) {
        int16_t d_near = 100; /* mm */
        /* XXX Change distance depending on speed. */
        if (trajectory_in_window(&robot.traj, d_near, RAD(5.0)))
            return END_NEAR;
    }

    if((why & END_OBSTACLE)) {
        int i;
        for(i=0;i<robot.beacon.nb_beacon;i++) {
            if(robot.beacon.beacon[i].distance > 80) { /*cm*/
                if(robot.distance_qr.previous_var > 0) {
                    /* Going forward. */
                    if(robot.beacon.beacon[i].direction > -30 && robot.beacon.beacon[i].direction < 30) {
                        trajectory_stop(&robot.traj);
                        while(robot.distance_qr.previous_var > 0);
                        trajectory_hardstop(&robot.traj);
                        bd_reset(&robot.distance_bd);
                        return END_OBSTACLE;
                    }
                } else if(robot.distance_qr.previous_var < 0) {
                    /* Going backward */
                    if(robot.beacon.beacon[i].direction < -30 || robot.beacon.beacon[i].direction > 30) {
                        trajectory_stop(&robot.traj);
                        while(robot.distance_qr.previous_var < 0);
                        trajectory_hardstop(&robot.traj);
                        bd_reset(&robot.distance_bd);
                        return END_OBSTACLE;
                    }
                }
            }
        }
    }

    if((why & END_BLOCKING) && bd_get(&robot.distance_bd)) {
        trajectory_hardstop(&robot.traj);
        bd_reset(&robot.distance_bd);
        bd_reset(&robot.angle_bd);
        return END_BLOCKING;
    }

    if((why & END_BLOCKING) && bd_get(&robot.angle_bd)) {
        trajectory_hardstop(&robot.traj);

        bd_reset(&robot.distance_bd);
        bd_reset(&robot.angle_bd);
        return END_BLOCKING;
    }

    if((why & END_TIMER) && strat_get_time() >= MATCH_TIME) {
        trajectory_hardstop(&robot.traj);
        return END_TIMER;
    }

    return 0;
}