Changeset 152

Show
Ignore:
Timestamp:
02/26/06 13:38:57 (3 years ago)
Author:
agr
Message:

hasData serial, and cmucam2

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/hal/lpc2106-cmucam3/serial.c

    r146 r152  
    172172  switch (uart) { 
    173173  case 0: 
    174     return ((REG (UART0_LSR) & LSR_RBR_EMPTY) != 0); 
     174    return ((REG (UART0_LSR) & LSR_RBR_EMPTY)==0 ); 
    175175  case 1: 
    176     return ((REG (UART1_LSR) & LSR_RBR_EMPTY) != 0); 
     176    return ((REG (UART1_LSR) & LSR_RBR_EMPTY)==0 ); 
    177177  default: 
    178178    return false; 
  • trunk/lib/cc3_ilp/cc3_color_track.c

    r150 r152  
    1919uint8_t cc3_track_color(cc3_track_pkt_t *pkt) 
    2020{ 
    21 uint32_t mm_x,mm_y; 
    22  int y, x; 
     21uint16_t y, x; 
     22 
     23x=pkt->scratch_x; 
     24y=pkt->scratch_y; 
    2325 
    2426 if( (pkt->lower_bound.channel[0]>pkt->upper_bound.channel[0]) || 
     
    3032pkt->x1=0; 
    3133pkt->y1=0; 
    32 mm_x=0; 
    33 mm_y=0; 
     34pkt->centroid_x=0; 
     35pkt->centroid_y=0; 
    3436 
    35 cc3_pixbuf_load(); 
     37 
    3638for(y=0; y<cc3_g_current_frame.height; y++ ) 
    3739for(x=0; x<cc3_g_current_frame.width; x++ ) 
     
    5961        if(pkt->x1 < x ) pkt->x1=x;      
    6062        if(pkt->y1 < y ) pkt->y1=y;      
    61         mm_x+=x; 
    62         mm_y+=y; 
     63        pkt->centroid_x+=x; 
     64        pkt->centroid_y+=y; 
    6365        } 
    6466} 
     
    6971        // FIXME:  Density hack to keep it an integer 
    7072        pkt->int_density=(pkt->num_pixels*1000) / ((pkt->x1 - pkt->x0)*(pkt->y1 - pkt->y0)); 
    71         pkt->centroid_x= mm_x / pkt->num_pixels; 
    72         pkt->centroid_y= mm_y / pkt->num_pixels; 
     73        pkt->centroid_x= pkt->centroid_x / pkt->num_pixels; 
     74        pkt->centroid_y= pkt->centroid_y / pkt->num_pixels; 
    7375 
    7476} 
     
    9193 
    9294 
     95} 
     96 
     97 
     98uint8_t cc3_track_color_scanline_start(cc3_track_pkt_t *pkt) 
     99{ 
     100 
     101 if( (pkt->lower_bound.channel[0]>pkt->upper_bound.channel[0]) || 
     102     (pkt->lower_bound.channel[1]>pkt->upper_bound.channel[1]) || 
     103     (pkt->lower_bound.channel[2]>pkt->upper_bound.channel[2]) ) return 0; 
     104pkt->num_pixels=0; 
     105pkt->x0=UINT16_MAX; 
     106pkt->y0=UINT16_MAX; 
     107pkt->x1=0; 
     108pkt->y1=0; 
     109pkt->centroid_x=0; 
     110pkt->centroid_y=0; 
     111pkt->scratch_x=0; 
     112pkt->scratch_y=0; 
     113return 1; 
     114} 
     115 
     116uint8_t cc3_track_color_scanline(cc3_image_t *img, cc3_track_pkt_t *pkt) 
     117{ 
     118uint32_t x,y; 
     119 
     120for(x=0; x<MAX_BINARY_WIDTH; x++ ) pkt->binary_scanline[x]=0; 
     121 
     122for(y=pkt->scratch_y; y<(pkt->scratch_y+img->height); y++ ) 
     123for(x=0; x<img->width; x++ ) 
     124{ 
     125        bool pixel_good=0; 
     126        cc3_pixel_t cp; 
     127        //cc3_pixbuf_read(); 
     128        cc3_get_pixel( img, x, 0, &cp );         
     129        if(cc3_g_current_frame.coi==CC3_ALL ) {  
     130                if(cp.channel[0]>=pkt->lower_bound.channel[0] &&  
     131                cp.channel[0]<=pkt->upper_bound.channel[0] &&  
     132                cp.channel[1]>=pkt->lower_bound.channel[1] &&  
     133                cp.channel[1]<=pkt->upper_bound.channel[1] &&  
     134                cp.channel[2]>=pkt->lower_bound.channel[2] &&  
     135                cp.channel[2]<=pkt->upper_bound.channel[2] ) pixel_good=1;  
     136        } else 
     137        { 
     138                if(cp.channel[cc3_g_current_frame.coi]>=pkt->lower_bound.channel[cc3_g_current_frame.coi] &&  
     139                cp.channel[cc3_g_current_frame.coi]<=pkt->upper_bound.channel[cc3_g_current_frame.coi] ) pixel_good=1;  
     140        } 
     141 
     142        if(pixel_good) 
     143        { 
     144        pkt->num_pixels++; 
     145        if(pkt->x0 > x ) pkt->x0=x;      
     146        if(pkt->y0 > y ) pkt->y0=y;      
     147        if(pkt->x1 < x ) pkt->x1=x;      
     148        if(pkt->y1 < y ) pkt->y1=y;      
     149        pkt->centroid_x+=x; 
     150        pkt->centroid_y+=y; 
     151        } 
     152} 
     153 
     154pkt->scratch_y=y; 
    93155 
    94156 
    95157} 
    96158 
     159 
     160 
     161uint8_t cc3_track_color_scanline_finish(cc3_track_pkt_t *pkt) 
     162{ 
     163if(pkt->num_pixels>0 ) 
     164{ 
     165        // FIXME:  Density hack to keep it an integer 
     166        pkt->int_density=(pkt->num_pixels*1000) / ((pkt->x1 - pkt->x0)*(pkt->y1 - pkt->y0)); 
     167        pkt->centroid_x= pkt->centroid_x / pkt->num_pixels; 
     168        pkt->centroid_y= pkt->centroid_y / pkt->num_pixels; 
     169 
     170} 
     171else  
     172{ 
     173        pkt->int_density=0; 
     174        pkt->x0=0; 
     175        pkt->y0=0; 
     176        pkt->x1=0; 
     177        pkt->y1=0; 
     178        pkt->centroid_x=0; 
     179        pkt->centroid_y=0; 
     180 
     181} 
     182 
     183 
     184} 
     185 
     186 
     187 
  • trunk/lib/cc3_ilp/cc3_color_track.h

    r150 r152  
    1212typedef struct { 
    1313    uint16_t x0,y0,x1,y1; 
    14     uint16_t centroid_x, centroid_y; 
     14    uint32_t centroid_x, centroid_y; 
    1515    uint32_t num_pixels; 
    1616    uint32_t int_density; 
     
    1919    cc3_pixel_t upper_bound; 
    2020    cc3_pixel_t lower_bound; 
     21    uint16_t scratch_x,scratch_y; 
    2122} cc3_track_pkt_t; 
    2223 
  • trunk/projects/cmucam2/cmucam2.c

    r151 r152  
    3131char *cmucam2_cmds[CMUCAM2_CMD_END]; 
    3232 
    33 //int32_t cmucam2_get_command(cmucam2_command_t *cmd, int32_t *arg_list); 
     33void cmucam2_track_color(cc3_track_pkt_t *t_pkt, uint8_t poll_mode, uint8_t line_mode  ); 
    3434int32_t cmucam2_get_command(int32_t *cmd, int32_t *arg_list); 
    3535void set_cmucam2_commands(void); 
     
    4343int32_t val,n; 
    4444uint32_t arg_list[MAX_ARGS]; 
    45 uint8_t error,poll_mode
     45uint8_t error,poll_mode,line_mode
    4646cc3_track_pkt_t t_pkt; 
    4747     
     
    5050    cmucam2_start:  
    5151    poll_mode=0; 
     52    line_mode=0; 
    5253    cc3_system_setup (); 
    5354 
     
    108109            break;  
    109110        case TRACK_COLOR: 
     111            { 
    110112            if(n!=0 && n!=6) { error=1; break; } else print_ACK(); 
    111113            if(n==6) 
     
    118120            t_pkt.upper_bound.channel[2]=arg_list[5]; 
    119121            } 
    120             do  
    121             { 
    122                 cc3_track_color(&t_pkt); 
    123                 cmucam2_write_t_packet(&t_pkt); 
    124                 if(!cc3_uart_has_data(0) ) break; 
    125             } while(poll_mode!=1); 
     122            cmucam2_track_color(&t_pkt, poll_mode, line_mode  ); 
    126123            break; 
    127124        case SET_SERVO: 
    128125            if(n!=2) { error=1; break; } else print_ACK(); 
    129126            cc3_servo_set(arg_list[0], arg_list[1] );  
     127            } 
    130128            break; 
    131129        default: 
     
    144142    return 0; 
    145143} 
     144 
     145 
     146 
     147void cmucam2_track_color(cc3_track_pkt_t *t_pkt, uint8_t poll_mode, uint8_t line_mode  ) 
     148{ 
     149cc3_image_t img; 
     150uint16_t i; 
     151            img.channels=3; 
     152            img.width=cc3_g_current_frame.width; 
     153            img.height=1;  // image will hold just 1 row for scanline processing 
     154            img.pix = malloc(3 * img.width); 
     155            do  
     156            { 
     157                cc3_pixbuf_load(); 
     158                if(cc3_track_color_scanline_start(t_pkt)!=0 ) 
     159                {        
     160                        for(i=0; i<cc3_g_current_frame.height; i++ ) 
     161                        { 
     162                        cc3_pixbuf_read_rows(img.pix, img.width, 1);     
     163                        cc3_track_color_scanline(&img, t_pkt); 
     164                        } 
     165                        cc3_track_color_scanline_finish(t_pkt);       
     166                        cmucam2_write_t_packet(t_pkt); 
     167                } 
     168                if(!cc3_uart_has_data(0) ) break; 
     169            } while(poll_mode!=1); 
     170             
     171            free(img.pix);  
     172} 
     173 
    146174 
    147175void cmucam2_write_t_packet(cc3_track_pkt_t *pkt)