mbed serial interface for the OV528 camera (uCAM TTL 120 from 4D systems).

Dependencies:   MODSERIAL

Dependents:   mbed_uCAM_TTL120_20141118

Library for interfacing the mbed to the OV528 jpeg engine camera from Omnivision. I tested this program using the uCAM TTL 120 from 4D systems, now obsolete.

/media/uploads/jebradshaw/pic0003.jpg

Above is a saved jpeg image from the camera at 480x640 resolution

/media/uploads/jebradshaw/fullsizerender.jpg

Camera and TFT screen setup

/media/uploads/jebradshaw/tft_closeup_60x80.jpg

Closeup of the TFT screen displaying a 60x80 pixel 16 bit color bitmap image. The RGB (565) pixel colors were reversed when read from the camera relative to the TFT screen so a bit mask and shift had to be applied when displaying the pixel color.

bit mask and shift

         int k=12;
         for(int i=0;i<60;i++){
                for(int j=0;j<80;j++){                    
                    //returned 16-bit color is 565(RGB)
                     pixel_col = (imageData[k] << 8);
                     k++;                       
                     pixel_col += imageData[k];
                     k++;
//                 fputc(((picture[k] >> 8) & 0xff), fp);     //write pixel high byte to file 
//                 fputc(picture[k] & 0xff, fp);                 //write low byte
                                        
                //swap R and B bits in returned pixel for TFT display
                int TFT_pix_col = 0;
                TFT_pix_col += (pixel_col & 0x001f) << 11;
                TFT_pix_col += (pixel_col & 0xf800) >> 11;
                TFT_pix_col += (pixel_col & 0x07e0);
                                        
                 TFT.pixel(j, i, TFT_pix_col);  //Do something with the pixel
                }
             }
Committer:
jebradshaw
Date:
Wed Nov 26 16:57:13 2014 +0000
Revision:
3:85db6ea8c0a4
Parent:
2:f80257456c6e
uCAM_TTL120 Library; -Improved cam_read() function with numbytes check and timeout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jebradshaw 0:fcc0eaeeb35c 1 // Library for uCAM-TTL120 from Saelig
jebradshaw 0:fcc0eaeeb35c 2
jebradshaw 0:fcc0eaeeb35c 3 #include "uCAM_TTL120.h"
jebradshaw 0:fcc0eaeeb35c 4 #define __DEBUG
jebradshaw 0:fcc0eaeeb35c 5
jebradshaw 0:fcc0eaeeb35c 6 //----------------- uCAM Functions ------------------------------
jebradshaw 0:fcc0eaeeb35c 7
jebradshaw 0:fcc0eaeeb35c 8 uCAM_TTL120::uCAM_TTL120(PinName tx, PinName rx) : _cam(tx, rx) {
jebradshaw 0:fcc0eaeeb35c 9 _cam.baud(115200); //Initial baud rate
jebradshaw 0:fcc0eaeeb35c 10 timerCam = new Timer();
jebradshaw 0:fcc0eaeeb35c 11
jebradshaw 0:fcc0eaeeb35c 12 timerCam->start();
jebradshaw 0:fcc0eaeeb35c 13 }
jebradshaw 0:fcc0eaeeb35c 14
jebradshaw 3:85db6ea8c0a4 15 int uCAM_TTL120::uCAM_read(char *str, int numchars, float timeout){
jebradshaw 3:85db6ea8c0a4 16 Timer t_Frame;
jebradshaw 3:85db6ea8c0a4 17 int i=0;
jebradshaw 3:85db6ea8c0a4 18 int timeoutState=0;
jebradshaw 3:85db6ea8c0a4 19 t_Frame.start();
jebradshaw 0:fcc0eaeeb35c 20
jebradshaw 3:85db6ea8c0a4 21 while(timeoutState != 3 && (i < numchars)){
jebradshaw 3:85db6ea8c0a4 22 switch(timeoutState){
jebradshaw 3:85db6ea8c0a4 23 case 0:
jebradshaw 3:85db6ea8c0a4 24 while(_cam.readable()){ //if characters are in buffer, read them
jebradshaw 3:85db6ea8c0a4 25 str[i++] = _cam.getc();
jebradshaw 3:85db6ea8c0a4 26 if(i == numchars){
jebradshaw 3:85db6ea8c0a4 27 timeoutState = 3;
jebradshaw 3:85db6ea8c0a4 28 break;
jebradshaw 3:85db6ea8c0a4 29 }
jebradshaw 3:85db6ea8c0a4 30 }
jebradshaw 3:85db6ea8c0a4 31 //if no characters in buffer, initiate timeout
jebradshaw 3:85db6ea8c0a4 32 timeoutState = 1;
jebradshaw 3:85db6ea8c0a4 33 break;
jebradshaw 3:85db6ea8c0a4 34 case 1:
jebradshaw 3:85db6ea8c0a4 35 timeout = t_Frame.read() + timeout; //current time plus timeout time
jebradshaw 3:85db6ea8c0a4 36 timeoutState = 2;
jebradshaw 3:85db6ea8c0a4 37 // pc.printf("Timeout initiated %f\r\n", timeout);
jebradshaw 3:85db6ea8c0a4 38 break;
jebradshaw 3:85db6ea8c0a4 39 case 2:
jebradshaw 3:85db6ea8c0a4 40 if(_cam.readable()){ //check buffer while timeout is running
jebradshaw 3:85db6ea8c0a4 41 str[i++] = _cam.getc();
jebradshaw 3:85db6ea8c0a4 42 if(i == numchars){
jebradshaw 3:85db6ea8c0a4 43 timeoutState = 3;
jebradshaw 3:85db6ea8c0a4 44 }
jebradshaw 3:85db6ea8c0a4 45 else{
jebradshaw 3:85db6ea8c0a4 46 timeoutState = 0;
jebradshaw 3:85db6ea8c0a4 47 }
jebradshaw 3:85db6ea8c0a4 48 break;
jebradshaw 3:85db6ea8c0a4 49 }
jebradshaw 3:85db6ea8c0a4 50 if(t_Frame.read() >= timeout) //if timeout has elapsed, exit the while loop with state 3
jebradshaw 3:85db6ea8c0a4 51 timeoutState = 3;
jebradshaw 3:85db6ea8c0a4 52 break;
jebradshaw 3:85db6ea8c0a4 53 default:
jebradshaw 3:85db6ea8c0a4 54 timeoutState = 0;
jebradshaw 3:85db6ea8c0a4 55 }//switch timeoutState
jebradshaw 3:85db6ea8c0a4 56 }//while timeoutState != 2
jebradshaw 3:85db6ea8c0a4 57 return i; //return number of bytes read
jebradshaw 0:fcc0eaeeb35c 58 }
jebradshaw 0:fcc0eaeeb35c 59
jebradshaw 0:fcc0eaeeb35c 60 void uCAM_TTL120::uCAM_Command_Send(int command,char p1,char p2,char p3,char p4)
jebradshaw 0:fcc0eaeeb35c 61 {
jebradshaw 0:fcc0eaeeb35c 62 _cam.putc((char)(command >> 8) & 0xff);
jebradshaw 0:fcc0eaeeb35c 63 _cam.putc((char)(command & 0xff));
jebradshaw 0:fcc0eaeeb35c 64 _cam.putc(p1);
jebradshaw 0:fcc0eaeeb35c 65 _cam.putc(p2);
jebradshaw 0:fcc0eaeeb35c 66 _cam.putc(p3);
jebradshaw 0:fcc0eaeeb35c 67 _cam.putc(p4);
jebradshaw 0:fcc0eaeeb35c 68 }
jebradshaw 0:fcc0eaeeb35c 69
jebradshaw 2:f80257456c6e 70 int uCAM_TTL120::uCAM_GetACK(int command)
jebradshaw 0:fcc0eaeeb35c 71 {
jebradshaw 0:fcc0eaeeb35c 72 char ser_read[7];
jebradshaw 2:f80257456c6e 73 int i;
jebradshaw 0:fcc0eaeeb35c 74
jebradshaw 2:f80257456c6e 75 for(i=0;i<7;i++) //clear the string
jebradshaw 0:fcc0eaeeb35c 76 ser_read[i] = 0;
jebradshaw 0:fcc0eaeeb35c 77
jebradshaw 2:f80257456c6e 78 wait(.1);
jebradshaw 0:fcc0eaeeb35c 79
jebradshaw 2:f80257456c6e 80 //read serial buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 81 uCAM_read(ser_read, 6, .5);
jebradshaw 2:f80257456c6e 82 if((ser_read[0] == 0xAA) &&
jebradshaw 2:f80257456c6e 83 (ser_read[1] == 0x0E)){
jebradshaw 2:f80257456c6e 84 if((command & 0xff) == ser_read[2])
jebradshaw 0:fcc0eaeeb35c 85 return 1;
jebradshaw 2:f80257456c6e 86 }
jebradshaw 2:f80257456c6e 87 else
jebradshaw 0:fcc0eaeeb35c 88 return 0;
jebradshaw 0:fcc0eaeeb35c 89 }
jebradshaw 0:fcc0eaeeb35c 90
jebradshaw 0:fcc0eaeeb35c 91 int uCAM_TTL120::uCAM_Connect(void)
jebradshaw 0:fcc0eaeeb35c 92 {
jebradshaw 0:fcc0eaeeb35c 93 char ser_read[20];
jebradshaw 0:fcc0eaeeb35c 94 int i, retries;
jebradshaw 0:fcc0eaeeb35c 95
jebradshaw 0:fcc0eaeeb35c 96 for(i=0;i<20;i++) //clear the string
jebradshaw 0:fcc0eaeeb35c 97 ser_read[i] = 0;
jebradshaw 0:fcc0eaeeb35c 98 retries=0;
jebradshaw 0:fcc0eaeeb35c 99
jebradshaw 0:fcc0eaeeb35c 100 while(retries < 60)
jebradshaw 0:fcc0eaeeb35c 101 {
jebradshaw 0:fcc0eaeeb35c 102 uCAM_FlushBuffer();
jebradshaw 0:fcc0eaeeb35c 103
jebradshaw 0:fcc0eaeeb35c 104 //Transmit SYNC command
jebradshaw 0:fcc0eaeeb35c 105 uCAM_Command_Send(uCAM_SYNC,0x00,0x00,0x00,0x00);
jebradshaw 0:fcc0eaeeb35c 106
jebradshaw 0:fcc0eaeeb35c 107 wait(.2);
jebradshaw 0:fcc0eaeeb35c 108
jebradshaw 0:fcc0eaeeb35c 109 //read serial buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 110 uCAM_read(ser_read, 6, .1);
jebradshaw 0:fcc0eaeeb35c 111
jebradshaw 0:fcc0eaeeb35c 112 if((ser_read[0] == 0xAA) &&
jebradshaw 0:fcc0eaeeb35c 113 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 114 (ser_read[2] == 0x0D) && //skip ser_read[3]
jebradshaw 0:fcc0eaeeb35c 115 (ser_read[4] == 0x00))
jebradshaw 0:fcc0eaeeb35c 116 {
jebradshaw 0:fcc0eaeeb35c 117 //after receiving ACK, wait for SYNC (0xAA0D00000000)
jebradshaw 2:f80257456c6e 118 uCAM_read(ser_read, 6, .100);
jebradshaw 2:f80257456c6e 119
jebradshaw 0:fcc0eaeeb35c 120 if((ser_read[0] == 0xAA) &&
jebradshaw 0:fcc0eaeeb35c 121 (ser_read[1] == 0x0D) &&
jebradshaw 0:fcc0eaeeb35c 122 (ser_read[2] == 0x00) &&
jebradshaw 0:fcc0eaeeb35c 123 (ser_read[3] == 0x00) &&
jebradshaw 0:fcc0eaeeb35c 124 (ser_read[4] == 0x00) &&
jebradshaw 0:fcc0eaeeb35c 125 (ser_read[5] == 0x00))
jebradshaw 0:fcc0eaeeb35c 126 {
jebradshaw 0:fcc0eaeeb35c 127 //Transmit ACK command
jebradshaw 0:fcc0eaeeb35c 128 uCAM_Command_Send(uCAM_ACK,0x0D,0x00,0x00,0x00);
jebradshaw 0:fcc0eaeeb35c 129
jebradshaw 0:fcc0eaeeb35c 130 printf("\r\n uCAM 120 Initialized\r\nDelaying 2 seconds for AGC and AEC \r\n circuits to stabilise before image capture.");
jebradshaw 3:85db6ea8c0a4 131 wait(.5); //2 second delay before capturing first image
jebradshaw 0:fcc0eaeeb35c 132 printf(".");
jebradshaw 0:fcc0eaeeb35c 133 wait(.5);
jebradshaw 0:fcc0eaeeb35c 134 printf(".");
jebradshaw 0:fcc0eaeeb35c 135 wait(.5);
jebradshaw 0:fcc0eaeeb35c 136 printf(".");
jebradshaw 0:fcc0eaeeb35c 137 wait(.5);
jebradshaw 0:fcc0eaeeb35c 138 printf(".\r\nFinished\r\n");
jebradshaw 3:85db6ea8c0a4 139
jebradshaw 0:fcc0eaeeb35c 140 return 1; //Camera connection successful
jebradshaw 0:fcc0eaeeb35c 141 }
jebradshaw 0:fcc0eaeeb35c 142 }
jebradshaw 0:fcc0eaeeb35c 143 retries++;
jebradshaw 0:fcc0eaeeb35c 144 }
jebradshaw 0:fcc0eaeeb35c 145 if(retries == 60)
jebradshaw 0:fcc0eaeeb35c 146 return 0;
jebradshaw 0:fcc0eaeeb35c 147
jebradshaw 0:fcc0eaeeb35c 148 return -1;
jebradshaw 0:fcc0eaeeb35c 149 }
jebradshaw 0:fcc0eaeeb35c 150
jebradshaw 0:fcc0eaeeb35c 151 int uCAM_TTL120::uCAM_send_INITIAL_80x60_16RAW(void)
jebradshaw 0:fcc0eaeeb35c 152 {
jebradshaw 0:fcc0eaeeb35c 153 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 154 int i;
jebradshaw 0:fcc0eaeeb35c 155
jebradshaw 0:fcc0eaeeb35c 156 uCAM_Command_Send(uCAM_INITIAL,0x00,0x06,0x01,0x00); // p2=0x06-16 bit color(RAW,565(RGB))
jebradshaw 3:85db6ea8c0a4 157 // p3=0x01-80 x 60 bit resolution
jebradshaw 3:85db6ea8c0a4 158 // p4=0x00-raw
jebradshaw 0:fcc0eaeeb35c 159
jebradshaw 0:fcc0eaeeb35c 160 for(i=0;i<7;i++) //clear the string
jebradshaw 0:fcc0eaeeb35c 161 ser_read[i] = 0;
jebradshaw 0:fcc0eaeeb35c 162
jebradshaw 0:fcc0eaeeb35c 163 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 164 uCAM_read(ser_read, 6, .02); //.01
jebradshaw 0:fcc0eaeeb35c 165
jebradshaw 0:fcc0eaeeb35c 166 if((ser_read[0] == 0xAA) &&
jebradshaw 0:fcc0eaeeb35c 167 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 168 (ser_read[2] == 0x01)){
jebradshaw 0:fcc0eaeeb35c 169 return 1;
jebradshaw 0:fcc0eaeeb35c 170 }
jebradshaw 0:fcc0eaeeb35c 171 else
jebradshaw 0:fcc0eaeeb35c 172 return 0;
jebradshaw 0:fcc0eaeeb35c 173 }
jebradshaw 0:fcc0eaeeb35c 174
jebradshaw 0:fcc0eaeeb35c 175 int uCAM_TTL120::uCAM_send_INITIAL_80x60_2RAW(void)
jebradshaw 0:fcc0eaeeb35c 176 {
jebradshaw 0:fcc0eaeeb35c 177 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 178 int i;
jebradshaw 0:fcc0eaeeb35c 179 uCAM_Command_Send(uCAM_INITIAL,0x00,0x01,0x01,0x00); // p2=0x01-2 bit GRAY (RAW)
jebradshaw 0:fcc0eaeeb35c 180 // p3=0x01-80 x 60 bit resolution
jebradshaw 0:fcc0eaeeb35c 181 // p4=0x01-JPEG res 80 x 64
jebradshaw 0:fcc0eaeeb35c 182 wait(.02);
jebradshaw 0:fcc0eaeeb35c 183
jebradshaw 0:fcc0eaeeb35c 184 for(i=0;i<7;i++) //clear the string
jebradshaw 0:fcc0eaeeb35c 185 ser_read[i] = 0;
jebradshaw 0:fcc0eaeeb35c 186
jebradshaw 0:fcc0eaeeb35c 187 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 0:fcc0eaeeb35c 188 uCAM_read(ser_read, 6, .1);
jebradshaw 0:fcc0eaeeb35c 189
jebradshaw 0:fcc0eaeeb35c 190 if((ser_read[0] == 0xAA) &&
jebradshaw 0:fcc0eaeeb35c 191 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 192 (ser_read[2] == 0x01))
jebradshaw 0:fcc0eaeeb35c 193 {
jebradshaw 3:85db6ea8c0a4 194 wait(.010);
jebradshaw 0:fcc0eaeeb35c 195 return 1;
jebradshaw 0:fcc0eaeeb35c 196 }
jebradshaw 0:fcc0eaeeb35c 197 else
jebradshaw 0:fcc0eaeeb35c 198 return 0;
jebradshaw 0:fcc0eaeeb35c 199 }
jebradshaw 0:fcc0eaeeb35c 200
jebradshaw 0:fcc0eaeeb35c 201 int uCAM_TTL120::uCAM_send_INITIAL_128x128_4RAW(void)
jebradshaw 0:fcc0eaeeb35c 202 {
jebradshaw 0:fcc0eaeeb35c 203 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 204 int i;
jebradshaw 0:fcc0eaeeb35c 205 uCAM_Command_Send(uCAM_INITIAL,0x00,0x02,0x09,0x00); // p2=0x02-4 bit GRAY (RAW)
jebradshaw 0:fcc0eaeeb35c 206 // p3=0x09- 128x128 bit resolution
jebradshaw 0:fcc0eaeeb35c 207 // p4=0x01-JPEG res 80 x 64
jebradshaw 0:fcc0eaeeb35c 208 wait(.02);
jebradshaw 0:fcc0eaeeb35c 209
jebradshaw 0:fcc0eaeeb35c 210 for(i=0;i<7;i++) //clear the string
jebradshaw 0:fcc0eaeeb35c 211 ser_read[i] = 0;
jebradshaw 0:fcc0eaeeb35c 212
jebradshaw 0:fcc0eaeeb35c 213 //read serial buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 214 uCAM_read(ser_read, 6, .100);
jebradshaw 0:fcc0eaeeb35c 215
jebradshaw 0:fcc0eaeeb35c 216 if((ser_read[0] == 0xAA) &&
jebradshaw 0:fcc0eaeeb35c 217 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 218 (ser_read[2] == 0x01))
jebradshaw 0:fcc0eaeeb35c 219 {
jebradshaw 3:85db6ea8c0a4 220 wait(.02);
jebradshaw 0:fcc0eaeeb35c 221 return 1;
jebradshaw 0:fcc0eaeeb35c 222 }
jebradshaw 0:fcc0eaeeb35c 223 else
jebradshaw 0:fcc0eaeeb35c 224 return 0;
jebradshaw 0:fcc0eaeeb35c 225 }
jebradshaw 0:fcc0eaeeb35c 226 int uCAM_TTL120::uCAM_send_SNAPSHOT(void)
jebradshaw 0:fcc0eaeeb35c 227 {
jebradshaw 2:f80257456c6e 228 uCAM_Command_Send(uCAM_SNAPSHOT,0x01,0x00,0x00,0x00); // p1=0x01-Uncompressed Image
jebradshaw 2:f80257456c6e 229 // p2 and p3 = 0, current frame
jebradshaw 3:85db6ea8c0a4 230 wait(.01);
jebradshaw 0:fcc0eaeeb35c 231
jebradshaw 2:f80257456c6e 232 if(uCAM_GetACK(uCAM_SNAPSHOT))
jebradshaw 0:fcc0eaeeb35c 233 return 1;
jebradshaw 2:f80257456c6e 234 else
jebradshaw 2:f80257456c6e 235 return 0;
jebradshaw 0:fcc0eaeeb35c 236 }
jebradshaw 0:fcc0eaeeb35c 237
jebradshaw 3:85db6ea8c0a4 238 int uCAM_TTL120::uCAM_send_GET_PICTURE_80x60_16COL_RAW(FILE *fp)
jebradshaw 0:fcc0eaeeb35c 239 {
jebradshaw 0:fcc0eaeeb35c 240 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 241 unsigned long pic_bytes;
jebradshaw 0:fcc0eaeeb35c 242 unsigned int i, j, k;
jebradshaw 0:fcc0eaeeb35c 243 unsigned int serbytes_read;
jebradshaw 3:85db6ea8c0a4 244 unsigned int pixel_col;
jebradshaw 0:fcc0eaeeb35c 245
jebradshaw 0:fcc0eaeeb35c 246 pic_bytes = 0;
jebradshaw 0:fcc0eaeeb35c 247 serbytes_read = 0;
jebradshaw 0:fcc0eaeeb35c 248
jebradshaw 0:fcc0eaeeb35c 249 for(i=0;i<100;i++)
jebradshaw 0:fcc0eaeeb35c 250 picture[i] = 0;
jebradshaw 0:fcc0eaeeb35c 251
jebradshaw 0:fcc0eaeeb35c 252 while(_cam.readable()){ //flush the buffer
jebradshaw 0:fcc0eaeeb35c 253 char c = _cam.getc();
jebradshaw 0:fcc0eaeeb35c 254 }
jebradshaw 0:fcc0eaeeb35c 255
jebradshaw 0:fcc0eaeeb35c 256 uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
jebradshaw 0:fcc0eaeeb35c 257 wait(.3);
jebradshaw 0:fcc0eaeeb35c 258
jebradshaw 3:85db6ea8c0a4 259 if(uCAM_GetACK(uCAM_GET_PICTURE)) //returned get pic
jebradshaw 3:85db6ea8c0a4 260 {
jebradshaw 3:85db6ea8c0a4 261 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 262 char c=uCAM_read(ser_read, 6, .1);
jebradshaw 0:fcc0eaeeb35c 263
jebradshaw 3:85db6ea8c0a4 264 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 3:85db6ea8c0a4 265 (ser_read[1] == 0x0A))
jebradshaw 3:85db6ea8c0a4 266 {
jebradshaw 3:85db6ea8c0a4 267 pic_bytes = (unsigned long)ser_read[3];
jebradshaw 3:85db6ea8c0a4 268 pic_bytes += (unsigned long)ser_read[4] << 8;
jebradshaw 3:85db6ea8c0a4 269 pic_bytes += (unsigned long)ser_read[5] << 16;
jebradshaw 0:fcc0eaeeb35c 270
jebradshaw 3:85db6ea8c0a4 271 serbytes_read = uCAM_read(picture, pic_bytes, .200);
jebradshaw 0:fcc0eaeeb35c 272
jebradshaw 3:85db6ea8c0a4 273 if(serbytes_read == pic_bytes)
jebradshaw 3:85db6ea8c0a4 274 {
jebradshaw 3:85db6ea8c0a4 275 k=0;
jebradshaw 3:85db6ea8c0a4 276 for(i=0;i<60;i++)
jebradshaw 3:85db6ea8c0a4 277 {
jebradshaw 3:85db6ea8c0a4 278 for(j=0;j<80;j++)
jebradshaw 3:85db6ea8c0a4 279 {
jebradshaw 3:85db6ea8c0a4 280 pixel_col = picture[k];
jebradshaw 3:85db6ea8c0a4 281 k++;
jebradshaw 3:85db6ea8c0a4 282 fputc(((picture[k] >> 8) & 0xff), fp); //write pixel high byte to file
jebradshaw 3:85db6ea8c0a4 283 fputc(picture[k] & 0xff, fp); //write low byte
jebradshaw 3:85db6ea8c0a4 284 // printf("%d ", pixel_col);
jebradshaw 3:85db6ea8c0a4 285 // TFT.pixel(j, i, pixel_col); //Do something with the pixel
jebradshaw 3:85db6ea8c0a4 286 }
jebradshaw 3:85db6ea8c0a4 287 }
jebradshaw 0:fcc0eaeeb35c 288
jebradshaw 3:85db6ea8c0a4 289 uCAM_Command_Send(uCAM_ACK, 0x0A, 0x00, 0x01, 0x00);
jebradshaw 0:fcc0eaeeb35c 290
jebradshaw 3:85db6ea8c0a4 291 return pic_bytes;
jebradshaw 3:85db6ea8c0a4 292 }
jebradshaw 3:85db6ea8c0a4 293 else
jebradshaw 3:85db6ea8c0a4 294 return -4;
jebradshaw 3:85db6ea8c0a4 295 }
jebradshaw 3:85db6ea8c0a4 296 }
jebradshaw 3:85db6ea8c0a4 297 else
jebradshaw 3:85db6ea8c0a4 298 return -1;
jebradshaw 0:fcc0eaeeb35c 299 }
jebradshaw 0:fcc0eaeeb35c 300
jebradshaw 0:fcc0eaeeb35c 301 int uCAM_TTL120::uCAM_send_GET_PICTURE_80x60_2GRAY_RAW(void)
jebradshaw 0:fcc0eaeeb35c 302 {
jebradshaw 0:fcc0eaeeb35c 303 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 304 char c;
jebradshaw 0:fcc0eaeeb35c 305 unsigned long pic_bytes;
jebradshaw 0:fcc0eaeeb35c 306 unsigned int pixel_col;
jebradshaw 0:fcc0eaeeb35c 307 unsigned int i, j, k;
jebradshaw 0:fcc0eaeeb35c 308 int m;
jebradshaw 0:fcc0eaeeb35c 309 unsigned int serbytes_read;
jebradshaw 0:fcc0eaeeb35c 310 int temp;
jebradshaw 0:fcc0eaeeb35c 311
jebradshaw 0:fcc0eaeeb35c 312 pic_bytes = 0;
jebradshaw 0:fcc0eaeeb35c 313 c=0;
jebradshaw 0:fcc0eaeeb35c 314 serbytes_read = 0;
jebradshaw 0:fcc0eaeeb35c 315
jebradshaw 0:fcc0eaeeb35c 316 for(i=0;i<100;i++)
jebradshaw 0:fcc0eaeeb35c 317 picture[i] = 0;
jebradshaw 0:fcc0eaeeb35c 318
jebradshaw 0:fcc0eaeeb35c 319 while(_cam.readable()){ //flush the buffer
jebradshaw 0:fcc0eaeeb35c 320 char c = _cam.getc();
jebradshaw 0:fcc0eaeeb35c 321 }
jebradshaw 0:fcc0eaeeb35c 322
jebradshaw 0:fcc0eaeeb35c 323 uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
jebradshaw 0:fcc0eaeeb35c 324 wait(.3);
jebradshaw 0:fcc0eaeeb35c 325
jebradshaw 0:fcc0eaeeb35c 326 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 0:fcc0eaeeb35c 327 c=uCAM_read(ser_read, 6, 1);
jebradshaw 0:fcc0eaeeb35c 328 wait(.2);
jebradshaw 0:fcc0eaeeb35c 329
jebradshaw 0:fcc0eaeeb35c 330 if(c==6) //received 6 bytes back
jebradshaw 0:fcc0eaeeb35c 331 {
jebradshaw 0:fcc0eaeeb35c 332 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 0:fcc0eaeeb35c 333 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 334 (ser_read[2] == 0x04)) //returned get pic
jebradshaw 0:fcc0eaeeb35c 335 {
jebradshaw 0:fcc0eaeeb35c 336 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 0:fcc0eaeeb35c 337 c=uCAM_read(ser_read, 6, 1);
jebradshaw 0:fcc0eaeeb35c 338
jebradshaw 0:fcc0eaeeb35c 339 if(c==6) //received 6 bytes back
jebradshaw 0:fcc0eaeeb35c 340 {
jebradshaw 0:fcc0eaeeb35c 341 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 0:fcc0eaeeb35c 342 (ser_read[1] == 0x0A))
jebradshaw 0:fcc0eaeeb35c 343 {
jebradshaw 0:fcc0eaeeb35c 344 pic_bytes = (unsigned long)ser_read[3];
jebradshaw 0:fcc0eaeeb35c 345 pic_bytes += (unsigned long)ser_read[4] << 8;
jebradshaw 0:fcc0eaeeb35c 346 pic_bytes += (unsigned long)ser_read[5] << 16;
jebradshaw 0:fcc0eaeeb35c 347
jebradshaw 0:fcc0eaeeb35c 348 serbytes_read = uCAM_read(picture, pic_bytes, 200);
jebradshaw 0:fcc0eaeeb35c 349
jebradshaw 0:fcc0eaeeb35c 350 if(serbytes_read == pic_bytes)
jebradshaw 0:fcc0eaeeb35c 351 {
jebradshaw 0:fcc0eaeeb35c 352 k=0;
jebradshaw 0:fcc0eaeeb35c 353 for(i=0;i<60;i++)
jebradshaw 0:fcc0eaeeb35c 354 {
jebradshaw 0:fcc0eaeeb35c 355 for(j=0;j<80;)
jebradshaw 0:fcc0eaeeb35c 356 {
jebradshaw 0:fcc0eaeeb35c 357 temp = picture[k];
jebradshaw 0:fcc0eaeeb35c 358 for(m=14;m>=0;m-=2)
jebradshaw 0:fcc0eaeeb35c 359 {
jebradshaw 0:fcc0eaeeb35c 360 pixel_col = (temp >> m) & 0x03;
jebradshaw 0:fcc0eaeeb35c 361 switch(pixel_col)
jebradshaw 0:fcc0eaeeb35c 362 {
jebradshaw 0:fcc0eaeeb35c 363 case 0:
jebradshaw 0:fcc0eaeeb35c 364 // uLCD144_Put_Pixel(j, i, 0x0000); //0x0000
jebradshaw 0:fcc0eaeeb35c 365 break;
jebradshaw 0:fcc0eaeeb35c 366 case 1:
jebradshaw 0:fcc0eaeeb35c 367 // uLCD144_Put_Pixel(j, i, 0x0180); //0x39e7
jebradshaw 0:fcc0eaeeb35c 368 break;
jebradshaw 0:fcc0eaeeb35c 369 case 2:
jebradshaw 0:fcc0eaeeb35c 370 // uLCD144_Put_Pixel(j, i, 0xc209); //0x7bef
jebradshaw 0:fcc0eaeeb35c 371 break;
jebradshaw 0:fcc0eaeeb35c 372 case 3:
jebradshaw 0:fcc0eaeeb35c 373 // uLCD144_Put_Pixel(j, i, 0xFFFF); //0xFFFF
jebradshaw 0:fcc0eaeeb35c 374 break;
jebradshaw 0:fcc0eaeeb35c 375 default:
jebradshaw 0:fcc0eaeeb35c 376 // uLCD144_Put_Pixel(j, i, 0x0000);
jebradshaw 0:fcc0eaeeb35c 377 break;
jebradshaw 0:fcc0eaeeb35c 378 }
jebradshaw 0:fcc0eaeeb35c 379 j++;
jebradshaw 0:fcc0eaeeb35c 380 }
jebradshaw 0:fcc0eaeeb35c 381 k++;
jebradshaw 0:fcc0eaeeb35c 382 }
jebradshaw 0:fcc0eaeeb35c 383 }
jebradshaw 0:fcc0eaeeb35c 384
jebradshaw 0:fcc0eaeeb35c 385 uCAM_Command_Send(uCAM_ACK, 0x0A, 0x00, 0x01, 0x00);
jebradshaw 0:fcc0eaeeb35c 386
jebradshaw 0:fcc0eaeeb35c 387 return pic_bytes;
jebradshaw 0:fcc0eaeeb35c 388 }
jebradshaw 0:fcc0eaeeb35c 389 else
jebradshaw 0:fcc0eaeeb35c 390 return -4;
jebradshaw 0:fcc0eaeeb35c 391 }
jebradshaw 0:fcc0eaeeb35c 392 else
jebradshaw 0:fcc0eaeeb35c 393 return -3;
jebradshaw 0:fcc0eaeeb35c 394 }
jebradshaw 0:fcc0eaeeb35c 395 }
jebradshaw 0:fcc0eaeeb35c 396 else
jebradshaw 0:fcc0eaeeb35c 397 return -2;
jebradshaw 0:fcc0eaeeb35c 398 }
jebradshaw 0:fcc0eaeeb35c 399 return -1;
jebradshaw 0:fcc0eaeeb35c 400 }
jebradshaw 0:fcc0eaeeb35c 401
jebradshaw 0:fcc0eaeeb35c 402 int uCAM_TTL120::uCAM_send_GET_PICTURE_128x128_4GRAY_RAW(void)
jebradshaw 0:fcc0eaeeb35c 403 {
jebradshaw 0:fcc0eaeeb35c 404 char ser_read[7];
jebradshaw 0:fcc0eaeeb35c 405 char c;
jebradshaw 0:fcc0eaeeb35c 406 unsigned long pic_bytes;
jebradshaw 0:fcc0eaeeb35c 407 unsigned int pixel_col;
jebradshaw 0:fcc0eaeeb35c 408 unsigned int i, j, k;
jebradshaw 0:fcc0eaeeb35c 409 unsigned int serbytes_read;
jebradshaw 0:fcc0eaeeb35c 410 int temp;
jebradshaw 0:fcc0eaeeb35c 411
jebradshaw 0:fcc0eaeeb35c 412 pic_bytes = 0;
jebradshaw 0:fcc0eaeeb35c 413 c=0;
jebradshaw 0:fcc0eaeeb35c 414 serbytes_read = 0;
jebradshaw 0:fcc0eaeeb35c 415
jebradshaw 0:fcc0eaeeb35c 416 for(i=0;i<100;i++)
jebradshaw 0:fcc0eaeeb35c 417 picture[i] = 0;
jebradshaw 0:fcc0eaeeb35c 418
jebradshaw 0:fcc0eaeeb35c 419 while(_cam.readable()){ //flush the buffer
jebradshaw 0:fcc0eaeeb35c 420 char c = _cam.getc();
jebradshaw 0:fcc0eaeeb35c 421 }
jebradshaw 0:fcc0eaeeb35c 422
jebradshaw 0:fcc0eaeeb35c 423 uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
jebradshaw 0:fcc0eaeeb35c 424 wait(.3);
jebradshaw 0:fcc0eaeeb35c 425
jebradshaw 0:fcc0eaeeb35c 426 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 427 c=uCAM_read(ser_read, 6, .1);
jebradshaw 0:fcc0eaeeb35c 428 wait(.2);
jebradshaw 0:fcc0eaeeb35c 429
jebradshaw 0:fcc0eaeeb35c 430 if(c==6) //received 6 bytes back
jebradshaw 0:fcc0eaeeb35c 431 {
jebradshaw 0:fcc0eaeeb35c 432 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 0:fcc0eaeeb35c 433 (ser_read[1] == 0x0E) &&
jebradshaw 0:fcc0eaeeb35c 434 (ser_read[2] == 0x04)) //returned get pic
jebradshaw 0:fcc0eaeeb35c 435 {
jebradshaw 0:fcc0eaeeb35c 436 //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 3:85db6ea8c0a4 437 c=uCAM_read(ser_read, 6, .1);
jebradshaw 0:fcc0eaeeb35c 438
jebradshaw 0:fcc0eaeeb35c 439 if(c==6) //received 6 bytes back
jebradshaw 0:fcc0eaeeb35c 440 {
jebradshaw 0:fcc0eaeeb35c 441 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 0:fcc0eaeeb35c 442 (ser_read[1] == 0x0A))
jebradshaw 0:fcc0eaeeb35c 443 {
jebradshaw 0:fcc0eaeeb35c 444 pic_bytes = (unsigned long)ser_read[3];
jebradshaw 0:fcc0eaeeb35c 445 pic_bytes += (unsigned long)ser_read[4] << 8;
jebradshaw 0:fcc0eaeeb35c 446 pic_bytes += (unsigned long)ser_read[5] << 16;
jebradshaw 0:fcc0eaeeb35c 447
jebradshaw 0:fcc0eaeeb35c 448 serbytes_read = uCAM_read(picture, pic_bytes, .2);
jebradshaw 0:fcc0eaeeb35c 449
jebradshaw 0:fcc0eaeeb35c 450 if(serbytes_read == pic_bytes)
jebradshaw 0:fcc0eaeeb35c 451 {
jebradshaw 0:fcc0eaeeb35c 452 k=0;
jebradshaw 0:fcc0eaeeb35c 453 for(i=0;i<128;i++)
jebradshaw 0:fcc0eaeeb35c 454 {
jebradshaw 0:fcc0eaeeb35c 455 for(j=0;j<128;)
jebradshaw 0:fcc0eaeeb35c 456 {
jebradshaw 0:fcc0eaeeb35c 457 temp = picture[k];
jebradshaw 0:fcc0eaeeb35c 458 pixel_col = (temp >> 12) & 0x000F;
jebradshaw 0:fcc0eaeeb35c 459 pixel_col |= ((temp >> 12) & 0x000F) << 6;
jebradshaw 0:fcc0eaeeb35c 460 pixel_col |= ((temp >> 12) & 0x000F) << 11;
jebradshaw 0:fcc0eaeeb35c 461 // uLCD144_Put_Pixel(j, i, pixel_col);
jebradshaw 0:fcc0eaeeb35c 462 printf("%c", pixel_col);
jebradshaw 0:fcc0eaeeb35c 463 j++;
jebradshaw 0:fcc0eaeeb35c 464
jebradshaw 0:fcc0eaeeb35c 465 pixel_col = (temp >> 8) & 0x000F;
jebradshaw 0:fcc0eaeeb35c 466 pixel_col |= ((temp >> 8) & 0x000F) << 6;
jebradshaw 0:fcc0eaeeb35c 467 pixel_col |= ((temp >> 8) & 0x000F) << 11;
jebradshaw 0:fcc0eaeeb35c 468 // uLCD144_Put_Pixel(j, i, pixel_col);
jebradshaw 0:fcc0eaeeb35c 469 printf("%c", pixel_col);
jebradshaw 0:fcc0eaeeb35c 470 j++;
jebradshaw 0:fcc0eaeeb35c 471
jebradshaw 0:fcc0eaeeb35c 472 pixel_col = (temp >> 4) & 0x000F;
jebradshaw 0:fcc0eaeeb35c 473 pixel_col |= ((temp >> 4) & 0x000F) << 6;
jebradshaw 0:fcc0eaeeb35c 474 pixel_col |= ((temp >> 4) & 0x000F) << 11;
jebradshaw 0:fcc0eaeeb35c 475 // uLCD144_Put_Pixel(j, i, pixel_col);
jebradshaw 0:fcc0eaeeb35c 476 printf("%c", pixel_col);
jebradshaw 0:fcc0eaeeb35c 477 j++;
jebradshaw 0:fcc0eaeeb35c 478
jebradshaw 0:fcc0eaeeb35c 479 pixel_col = temp & 0x000F;
jebradshaw 0:fcc0eaeeb35c 480 pixel_col |= (temp & 0x000F) << 6;
jebradshaw 0:fcc0eaeeb35c 481 pixel_col |= (temp & 0x000F) << 11;
jebradshaw 0:fcc0eaeeb35c 482 // uLCD144_Put_Pixel(j, i, pixel_col);
jebradshaw 0:fcc0eaeeb35c 483 printf("%c", pixel_col);
jebradshaw 0:fcc0eaeeb35c 484 j++;
jebradshaw 0:fcc0eaeeb35c 485
jebradshaw 0:fcc0eaeeb35c 486 k++;
jebradshaw 0:fcc0eaeeb35c 487 }
jebradshaw 0:fcc0eaeeb35c 488 }
jebradshaw 0:fcc0eaeeb35c 489
jebradshaw 0:fcc0eaeeb35c 490 uCAM_Command_Send(uCAM_ACK, 0x0A, 0x00, 0x01, 0x00);
jebradshaw 0:fcc0eaeeb35c 491
jebradshaw 0:fcc0eaeeb35c 492 return pic_bytes;
jebradshaw 0:fcc0eaeeb35c 493 }
jebradshaw 0:fcc0eaeeb35c 494 else
jebradshaw 0:fcc0eaeeb35c 495 return -4;
jebradshaw 0:fcc0eaeeb35c 496 }
jebradshaw 0:fcc0eaeeb35c 497 else
jebradshaw 0:fcc0eaeeb35c 498 return -3;
jebradshaw 0:fcc0eaeeb35c 499 }
jebradshaw 0:fcc0eaeeb35c 500 }
jebradshaw 0:fcc0eaeeb35c 501 else
jebradshaw 0:fcc0eaeeb35c 502 return -2;
jebradshaw 0:fcc0eaeeb35c 503 }
jebradshaw 0:fcc0eaeeb35c 504 return -1;
jebradshaw 0:fcc0eaeeb35c 505 }
jebradshaw 0:fcc0eaeeb35c 506
jebradshaw 0:fcc0eaeeb35c 507 void uCAM_TTL120::uCAM_set_baud(void)
jebradshaw 0:fcc0eaeeb35c 508 {
jebradshaw 2:f80257456c6e 509 uCAM_Command_Send(uCAM_SET_BAUD_RATE,0x03,0x00,0x00,0x00); // set baud to
jebradshaw 2:f80257456c6e 510 wait(.05);
jebradshaw 2:f80257456c6e 511
jebradshaw 2:f80257456c6e 512 if(uCAM_GetACK(uCAM_SET_BAUD_RATE)){
jebradshaw 2:f80257456c6e 513 printf("Baud rate sucessfully changed");
jebradshaw 2:f80257456c6e 514 }
jebradshaw 2:f80257456c6e 515 else{
jebradshaw 2:f80257456c6e 516 printf("Baud rate NOT sucessfully changed");
jebradshaw 2:f80257456c6e 517 }
jebradshaw 2:f80257456c6e 518
jebradshaw 2:f80257456c6e 519 _cam.baud(921600);
jebradshaw 2:f80257456c6e 520 // uCAM_Command_Send(uCAM_SET_BAUD_RATE,0x02,0x00,0x00,0x00); // set baud to
jebradshaw 2:f80257456c6e 521 // _cam.baud(1228800);
jebradshaw 0:fcc0eaeeb35c 522 }
jebradshaw 0:fcc0eaeeb35c 523
jebradshaw 3:85db6ea8c0a4 524 void uCAM_TTL120::uCAM_TakePic_RAW_16COLOR_80x60(FILE *fp)
jebradshaw 0:fcc0eaeeb35c 525 {
jebradshaw 0:fcc0eaeeb35c 526 uCAM_send_INITIAL_80x60_16RAW();
jebradshaw 0:fcc0eaeeb35c 527 wait(.1);
jebradshaw 0:fcc0eaeeb35c 528 uCAM_send_SNAPSHOT();
jebradshaw 0:fcc0eaeeb35c 529 wait(.1);
jebradshaw 3:85db6ea8c0a4 530 uCAM_send_GET_PICTURE_80x60_16COL_RAW(fp);
jebradshaw 0:fcc0eaeeb35c 531 }
jebradshaw 0:fcc0eaeeb35c 532
jebradshaw 0:fcc0eaeeb35c 533 void uCAM_TTL120::uCAM_TakePic_RAW_2GRAY_80x60(void)
jebradshaw 0:fcc0eaeeb35c 534 {
jebradshaw 0:fcc0eaeeb35c 535 uCAM_send_INITIAL_80x60_2RAW();
jebradshaw 0:fcc0eaeeb35c 536 wait(.1);
jebradshaw 0:fcc0eaeeb35c 537 uCAM_send_SNAPSHOT();
jebradshaw 0:fcc0eaeeb35c 538 wait(.1);
jebradshaw 0:fcc0eaeeb35c 539
jebradshaw 0:fcc0eaeeb35c 540 while(uCAM_send_GET_PICTURE_80x60_2GRAY_RAW() < 0){
jebradshaw 0:fcc0eaeeb35c 541 wait(.1);
jebradshaw 0:fcc0eaeeb35c 542 uCAM_send_SNAPSHOT();
jebradshaw 0:fcc0eaeeb35c 543 wait(.2);
jebradshaw 0:fcc0eaeeb35c 544 }
jebradshaw 0:fcc0eaeeb35c 545 }
jebradshaw 0:fcc0eaeeb35c 546
jebradshaw 0:fcc0eaeeb35c 547 void uCAM_TTL120::uCAM_TakePic_RAW_4GRAY_128x128(void)
jebradshaw 0:fcc0eaeeb35c 548 {
jebradshaw 0:fcc0eaeeb35c 549 uCAM_send_INITIAL_128x128_4RAW();
jebradshaw 0:fcc0eaeeb35c 550 wait(.100);
jebradshaw 0:fcc0eaeeb35c 551 uCAM_send_SNAPSHOT();
jebradshaw 0:fcc0eaeeb35c 552 wait(.100);
jebradshaw 0:fcc0eaeeb35c 553 while(uCAM_send_GET_PICTURE_128x128_4GRAY_RAW() < 0){
jebradshaw 0:fcc0eaeeb35c 554 wait(.100);
jebradshaw 0:fcc0eaeeb35c 555 uCAM_send_SNAPSHOT();
jebradshaw 0:fcc0eaeeb35c 556 wait(.200);
jebradshaw 0:fcc0eaeeb35c 557 }
jebradshaw 0:fcc0eaeeb35c 558 }
jebradshaw 0:fcc0eaeeb35c 559
jebradshaw 0:fcc0eaeeb35c 560 void uCAM_TTL120::uCAM_FlushBuffer(void){
jebradshaw 0:fcc0eaeeb35c 561 while(_cam.readable()){ //flush the buffer
jebradshaw 0:fcc0eaeeb35c 562 char c = _cam.getc();
jebradshaw 0:fcc0eaeeb35c 563 }
jebradshaw 0:fcc0eaeeb35c 564 }
jebradshaw 2:f80257456c6e 565
jebradshaw 3:85db6ea8c0a4 566 int uCAM_TTL120::uCAM_get_jpeg(FILE *fp){
jebradshaw 2:f80257456c6e 567
jebradshaw 2:f80257456c6e 568 char ser_read[7];
jebradshaw 2:f80257456c6e 569 unsigned long pic_bytes;
jebradshaw 2:f80257456c6e 570
jebradshaw 2:f80257456c6e 571 uCAM_FlushBuffer();
jebradshaw 2:f80257456c6e 572 uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x07); // JPEG,640 x 480,JPEG
jebradshaw 2:f80257456c6e 573 //cam.uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x03); // JPEG,160 x 120,JPEG
jebradshaw 2:f80257456c6e 574 wait(.05);
jebradshaw 2:f80257456c6e 575
jebradshaw 2:f80257456c6e 576 if(uCAM_GetACK(uCAM_INITIAL)){ //INITIAL ACK
jebradshaw 2:f80257456c6e 577 printf("ACK received on uCAM_INITIAL\r\n");
jebradshaw 2:f80257456c6e 578 }
jebradshaw 2:f80257456c6e 579 else{
jebradshaw 2:f80257456c6e 580 printf("Did not receive ACK on uCAM_INITIAL\r\n");
jebradshaw 2:f80257456c6e 581 }
jebradshaw 2:f80257456c6e 582
jebradshaw 2:f80257456c6e 583 uCAM_FlushBuffer();
jebradshaw 2:f80257456c6e 584 uCAM_Command_Send(uCAM_SET_PACKAGE_SIZE,0x08,0x00,0x02,0x00); //512 bytes
jebradshaw 2:f80257456c6e 585
jebradshaw 2:f80257456c6e 586 wait(.05);
jebradshaw 2:f80257456c6e 587
jebradshaw 2:f80257456c6e 588 if(uCAM_GetACK(uCAM_SET_PACKAGE_SIZE)){ //SET PACKAGE SIZE ACK
jebradshaw 2:f80257456c6e 589 printf("ACK received on uCAM_SET_PACKAGE_SIZE\r\n");
jebradshaw 2:f80257456c6e 590 }
jebradshaw 2:f80257456c6e 591 else{
jebradshaw 2:f80257456c6e 592 printf("Did not receive ACK on SET PACKAGE SIZE\r\n");
jebradshaw 2:f80257456c6e 593 }
jebradshaw 2:f80257456c6e 594
jebradshaw 2:f80257456c6e 595 uCAM_FlushBuffer();
jebradshaw 2:f80257456c6e 596 uCAM_Command_Send(uCAM_SNAPSHOT,0x00,0x00,0x00,0x00); //JPEG
jebradshaw 2:f80257456c6e 597
jebradshaw 2:f80257456c6e 598 if(uCAM_GetACK(uCAM_SNAPSHOT)){ //uCAM_SNAPSHOT ACK
jebradshaw 2:f80257456c6e 599 printf("ACK received on uCAM_SNAPSHOT\r\n");
jebradshaw 2:f80257456c6e 600 }
jebradshaw 2:f80257456c6e 601 else{
jebradshaw 2:f80257456c6e 602 printf("Did not receive ACK on uCAM_SNAPSHOT\r\n");
jebradshaw 2:f80257456c6e 603 }
jebradshaw 2:f80257456c6e 604
jebradshaw 2:f80257456c6e 605 pic_bytes = 0;
jebradshaw 2:f80257456c6e 606
jebradshaw 2:f80257456c6e 607 uCAM_FlushBuffer();
jebradshaw 2:f80257456c6e 608 uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
jebradshaw 2:f80257456c6e 609 wait(.1);
jebradshaw 2:f80257456c6e 610
jebradshaw 2:f80257456c6e 611 if(uCAM_GetACK(uCAM_GET_PICTURE)) //returned get pic
jebradshaw 2:f80257456c6e 612 {
jebradshaw 2:f80257456c6e 613 //read serial buffer and wait for ACK (0xAA0E0DXX0000)
jebradshaw 2:f80257456c6e 614 uCAM_read(ser_read, 6, 1);
jebradshaw 2:f80257456c6e 615
jebradshaw 2:f80257456c6e 616 if((ser_read[0] == 0xAA) && //first 2 bytes indicate it was a DATA packet
jebradshaw 2:f80257456c6e 617 (ser_read[1] == 0x0A) &&
jebradshaw 2:f80257456c6e 618 (ser_read[2] == 0x01)) //DATA from snapshot ACK
jebradshaw 2:f80257456c6e 619 {
jebradshaw 2:f80257456c6e 620 pic_bytes = (unsigned long)ser_read[3];
jebradshaw 2:f80257456c6e 621 pic_bytes += (unsigned long)ser_read[4] << 8;
jebradshaw 2:f80257456c6e 622 pic_bytes += (unsigned long)ser_read[5] << 16;
jebradshaw 2:f80257456c6e 623
jebradshaw 2:f80257456c6e 624 int packID=0;
jebradshaw 2:f80257456c6e 625 char packID_l, packID_h;
jebradshaw 2:f80257456c6e 626
jebradshaw 2:f80257456c6e 627 // pc.printf("\r\n");
jebradshaw 2:f80257456c6e 628 int numPackages = pic_bytes / (512 - 6);
jebradshaw 2:f80257456c6e 629
jebradshaw 2:f80257456c6e 630 while(numPackages>=0){
jebradshaw 2:f80257456c6e 631 packID_h = (packID >> 8) & 0xff;
jebradshaw 2:f80257456c6e 632 packID_l = packID & 0xff;
jebradshaw 2:f80257456c6e 633
jebradshaw 2:f80257456c6e 634 uCAM_FlushBuffer();
jebradshaw 2:f80257456c6e 635 uCAM_Command_Send(uCAM_ACK, 0x00, 0x00, packID_l, packID_h);
jebradshaw 2:f80257456c6e 636
jebradshaw 2:f80257456c6e 637 char ID_ret[2];
jebradshaw 2:f80257456c6e 638 uCAM_read(ID_ret, 2, .2);
jebradshaw 2:f80257456c6e 639
jebradshaw 2:f80257456c6e 640 char dataSize[2];
jebradshaw 2:f80257456c6e 641 uCAM_read(dataSize, 2, .2);
jebradshaw 2:f80257456c6e 642
jebradshaw 2:f80257456c6e 643 char imageData[506]; //512 - 6
jebradshaw 2:f80257456c6e 644 int imageDataSize = ((dataSize[1] & 0xff) << 8) + (dataSize[0] & 0xff);
jebradshaw 2:f80257456c6e 645
jebradshaw 2:f80257456c6e 646 //uCAM_read(imageData, imageDataSize, .2);
jebradshaw 2:f80257456c6e 647 for(int i=0;i<imageDataSize;i++)
jebradshaw 2:f80257456c6e 648 imageData[i] = _cam.getc();
jebradshaw 2:f80257456c6e 649
jebradshaw 2:f80257456c6e 650 char verifyCode[2];
jebradshaw 2:f80257456c6e 651 uCAM_read(verifyCode, 2, .2);
jebradshaw 2:f80257456c6e 652
jebradshaw 2:f80257456c6e 653 int vCodeCheck=0;
jebradshaw 2:f80257456c6e 654 vCodeCheck += ID_ret[0];
jebradshaw 2:f80257456c6e 655 vCodeCheck += ID_ret[1];
jebradshaw 2:f80257456c6e 656 vCodeCheck += dataSize[0];
jebradshaw 2:f80257456c6e 657 vCodeCheck += dataSize[1];
jebradshaw 2:f80257456c6e 658
jebradshaw 2:f80257456c6e 659 for(int i=0;i<imageDataSize;i++)
jebradshaw 2:f80257456c6e 660 vCodeCheck += imageData[i];
jebradshaw 2:f80257456c6e 661
jebradshaw 2:f80257456c6e 662 if((verifyCode[0] & 0xff) == (vCodeCheck & 0xff)){
jebradshaw 2:f80257456c6e 663 //pc.printf("\r\nPack ID = %d\r\n", packID);//debugging
jebradshaw 3:85db6ea8c0a4 664 for(int j=0;j<imageDataSize;j++){ //write image data to file pointer
jebradshaw 3:85db6ea8c0a4 665 fputc(imageData[j], fp);
jebradshaw 2:f80257456c6e 666 //pc.printf("%2X ", imageData[j]);
jebradshaw 3:85db6ea8c0a4 667 }
jebradshaw 2:f80257456c6e 668 packID++;
jebradshaw 2:f80257456c6e 669 numPackages--;
jebradshaw 2:f80257456c6e 670 }
jebradshaw 2:f80257456c6e 671 else{
jebradshaw 2:f80257456c6e 672 printf("\r\nBad Data in transfer. ReTransfer\r\n");
jebradshaw 2:f80257456c6e 673 return -2;
jebradshaw 2:f80257456c6e 674 }
jebradshaw 2:f80257456c6e 675 }
jebradshaw 2:f80257456c6e 676 uCAM_Command_Send(uCAM_ACK, 0x00, 0x00, 0xf0, 0xf0);
jebradshaw 2:f80257456c6e 677 return 0; //return 0 on success
jebradshaw 2:f80257456c6e 678 }
jebradshaw 2:f80257456c6e 679 }//data packet
jebradshaw 2:f80257456c6e 680 return -1;
jebradshaw 2:f80257456c6e 681 } //function