Changeset 152
- Timestamp:
- 02/26/06 13:38:57 (3 years ago)
- Files:
-
- trunk/hal/lpc2106-cmucam3/serial.c (modified) (1 diff)
- trunk/lib/cc3_ilp/cc3_color_track.c (modified) (5 diffs)
- trunk/lib/cc3_ilp/cc3_color_track.h (modified) (2 diffs)
- trunk/projects/cmucam2/cmucam2.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/hal/lpc2106-cmucam3/serial.c
r146 r152 172 172 switch (uart) { 173 173 case 0: 174 return ((REG (UART0_LSR) & LSR_RBR_EMPTY) != 0);174 return ((REG (UART0_LSR) & LSR_RBR_EMPTY)==0 ); 175 175 case 1: 176 return ((REG (UART1_LSR) & LSR_RBR_EMPTY) != 0);176 return ((REG (UART1_LSR) & LSR_RBR_EMPTY)==0 ); 177 177 default: 178 178 return false; trunk/lib/cc3_ilp/cc3_color_track.c
r150 r152 19 19 uint8_t cc3_track_color(cc3_track_pkt_t *pkt) 20 20 { 21 uint32_t mm_x,mm_y; 22 int y, x; 21 uint16_t y, x; 22 23 x=pkt->scratch_x; 24 y=pkt->scratch_y; 23 25 24 26 if( (pkt->lower_bound.channel[0]>pkt->upper_bound.channel[0]) || … … 30 32 pkt->x1=0; 31 33 pkt->y1=0; 32 mm_x=0;33 mm_y=0;34 pkt->centroid_x=0; 35 pkt->centroid_y=0; 34 36 35 cc3_pixbuf_load(); 37 36 38 for(y=0; y<cc3_g_current_frame.height; y++ ) 37 39 for(x=0; x<cc3_g_current_frame.width; x++ ) … … 59 61 if(pkt->x1 < x ) pkt->x1=x; 60 62 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; 63 65 } 64 66 } … … 69 71 // FIXME: Density hack to keep it an integer 70 72 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; 73 75 74 76 } … … 91 93 92 94 95 } 96 97 98 uint8_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; 104 pkt->num_pixels=0; 105 pkt->x0=UINT16_MAX; 106 pkt->y0=UINT16_MAX; 107 pkt->x1=0; 108 pkt->y1=0; 109 pkt->centroid_x=0; 110 pkt->centroid_y=0; 111 pkt->scratch_x=0; 112 pkt->scratch_y=0; 113 return 1; 114 } 115 116 uint8_t cc3_track_color_scanline(cc3_image_t *img, cc3_track_pkt_t *pkt) 117 { 118 uint32_t x,y; 119 120 for(x=0; x<MAX_BINARY_WIDTH; x++ ) pkt->binary_scanline[x]=0; 121 122 for(y=pkt->scratch_y; y<(pkt->scratch_y+img->height); y++ ) 123 for(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 154 pkt->scratch_y=y; 93 155 94 156 95 157 } 96 158 159 160 161 uint8_t cc3_track_color_scanline_finish(cc3_track_pkt_t *pkt) 162 { 163 if(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 } 171 else 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 12 12 typedef struct { 13 13 uint16_t x0,y0,x1,y1; 14 uint 16_t centroid_x, centroid_y;14 uint32_t centroid_x, centroid_y; 15 15 uint32_t num_pixels; 16 16 uint32_t int_density; … … 19 19 cc3_pixel_t upper_bound; 20 20 cc3_pixel_t lower_bound; 21 uint16_t scratch_x,scratch_y; 21 22 } cc3_track_pkt_t; 22 23 trunk/projects/cmucam2/cmucam2.c
r151 r152 31 31 char *cmucam2_cmds[CMUCAM2_CMD_END]; 32 32 33 //int32_t cmucam2_get_command(cmucam2_command_t *cmd, int32_t *arg_list);33 void cmucam2_track_color(cc3_track_pkt_t *t_pkt, uint8_t poll_mode, uint8_t line_mode ); 34 34 int32_t cmucam2_get_command(int32_t *cmd, int32_t *arg_list); 35 35 void set_cmucam2_commands(void); … … 43 43 int32_t val,n; 44 44 uint32_t arg_list[MAX_ARGS]; 45 uint8_t error,poll_mode ;45 uint8_t error,poll_mode,line_mode; 46 46 cc3_track_pkt_t t_pkt; 47 47 … … 50 50 cmucam2_start: 51 51 poll_mode=0; 52 line_mode=0; 52 53 cc3_system_setup (); 53 54 … … 108 109 break; 109 110 case TRACK_COLOR: 111 { 110 112 if(n!=0 && n!=6) { error=1; break; } else print_ACK(); 111 113 if(n==6) … … 118 120 t_pkt.upper_bound.channel[2]=arg_list[5]; 119 121 } 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 ); 126 123 break; 127 124 case SET_SERVO: 128 125 if(n!=2) { error=1; break; } else print_ACK(); 129 126 cc3_servo_set(arg_list[0], arg_list[1] ); 127 } 130 128 break; 131 129 default: … … 144 142 return 0; 145 143 } 144 145 146 147 void cmucam2_track_color(cc3_track_pkt_t *t_pkt, uint8_t poll_mode, uint8_t line_mode ) 148 { 149 cc3_image_t img; 150 uint16_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 146 174 147 175 void cmucam2_write_t_packet(cc3_track_pkt_t *pkt)
