VC0706 driver for radio shack camera shield

Dependencies:   MODSERIAL

Sample Code

#include "mbed.h"
#include "SDFileSystem.h"
#include "CameraShield.h"
#include <stdio.h>


unsigned char VC0706_rx_buffer[80];
    

SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd", PTE6, SDFileSystem::SWITCH_POS_NO, 25000000); // MOSI, MISO, SCLK, SSEL
CameraShield camera(PTC17, PTC16);


void CapturePhoto()
{
    uint32_t    frame_length = camera.VC0706_get_frame_buffer_length();        //get frame buffer length
    uint32_t    vc_frame_address = READ_DATA_BLOCK_NO;    
        
    FILE* camFile = fopen("/sd/temp.jpg", "w");
        
    while(vc_frame_address<frame_length)
    {   
        camera.VC0706_read_frame_buffer(vc_frame_address - READ_DATA_BLOCK_NO, READ_DATA_BLOCK_NO);
        wait_ms(9);

        //get the data with length=READ_DATA_BLOCK_NObytes 
        camera.buffer_read(VC0706_rx_buffer, 80);

        // write data to temp.jpg
        fwrite(VC0706_rx_buffer + 5, sizeof(char), READ_DATA_BLOCK_NO, camFile);
    
        //read next READ_DATA_BLOCK_NO bytes from frame buffer
        vc_frame_address = vc_frame_address + READ_DATA_BLOCK_NO;
    }

    // get the last data
    vc_frame_address = vc_frame_address - READ_DATA_BLOCK_NO;
    uint32_t last_data_length = frame_length - vc_frame_address;
    
    camera.VC0706_read_frame_buffer(vc_frame_address, last_data_length);
    wait_ms(9);
    //get the data 
    camera.buffer_read(VC0706_rx_buffer, 80);
            
    fwrite(VC0706_rx_buffer+5, sizeof(char), last_data_length, camFile);
    
    fclose(camFile);
}

 
int main (void) 
{                      
    // Check to see if the file exists: 
    // if exists,delete the file:
    sd.remove("/sd/temp.jpg");
    
    camera.Init();  
    camera.VC0706_image_size(VC0706_640x480);
    camera.ResumeVideo();   
    wait_ms(500);   
    
    
    while(1)
    {
        camera.ResumeVideo();   
        wait_ms(1000);
        
        camera.TakeSnapShot();
        CapturePhoto(); 
    }
}
Committer:
davidr99
Date:
Thu Dec 18 04:36:48 2014 +0000
Revision:
1:5cff9e627e06
Parent:
0:e5fc19091502
Added modserial to its dependency

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidr99 0:e5fc19091502 1 /*****************************************************************************************
davidr99 0:e5fc19091502 2 ** File: CameraShield.cpp **
davidr99 0:e5fc19091502 3 ** **
davidr99 0:e5fc19091502 4 ** For radio shack Camera Shield. **
davidr99 0:e5fc19091502 5 ** http://blog.radioshack.com/2013/01/radioshack-camera-shield-for-arduino-boards/ **
davidr99 0:e5fc19091502 6 *****************************************************************************************/
davidr99 0:e5fc19091502 7
davidr99 0:e5fc19091502 8 #include "CameraShield.h"
davidr99 0:e5fc19091502 9
davidr99 0:e5fc19091502 10
davidr99 0:e5fc19091502 11 CameraShield::CameraShield ( PinName tx, PinName rx, int speed ) : _serial(tx, rx)
davidr99 0:e5fc19091502 12 {
davidr99 0:e5fc19091502 13 _serial.baud(speed);
davidr99 0:e5fc19091502 14 }
davidr99 0:e5fc19091502 15
davidr99 0:e5fc19091502 16
davidr99 0:e5fc19091502 17 void CameraShield::Init()
davidr99 0:e5fc19091502 18 {
davidr99 0:e5fc19091502 19 VC0706_compression_ratio(63);
davidr99 0:e5fc19091502 20 wait_ms(100);
davidr99 0:e5fc19091502 21
davidr99 0:e5fc19091502 22 VC0706_frame_control(3);
davidr99 0:e5fc19091502 23 wait_ms(10);
davidr99 0:e5fc19091502 24 }
davidr99 0:e5fc19091502 25
davidr99 0:e5fc19091502 26
davidr99 0:e5fc19091502 27 void CameraShield::TakeSnapShot()
davidr99 0:e5fc19091502 28 {
davidr99 0:e5fc19091502 29 VC0706_frame_control(0);
davidr99 0:e5fc19091502 30 wait_ms(10);
davidr99 0:e5fc19091502 31 _serial.rxBufferFlush();
davidr99 0:e5fc19091502 32 }
davidr99 0:e5fc19091502 33
davidr99 0:e5fc19091502 34
davidr99 0:e5fc19091502 35 void CameraShield::ResumeVideo()
davidr99 0:e5fc19091502 36 {
davidr99 0:e5fc19091502 37 VC0706_frame_control(3);
davidr99 0:e5fc19091502 38 wait_ms(10);
davidr99 0:e5fc19091502 39 _serial.rxBufferFlush();
davidr99 0:e5fc19091502 40 }
davidr99 0:e5fc19091502 41
davidr99 0:e5fc19091502 42
davidr99 0:e5fc19091502 43 /*******************************************************************************
davidr99 0:e5fc19091502 44 * Function Name : VC0706_reset
davidr99 0:e5fc19091502 45 * Description : Reset VC0706
davidr99 0:e5fc19091502 46 *
davidr99 0:e5fc19091502 47 * Input : None
davidr99 0:e5fc19091502 48 *
davidr99 0:e5fc19091502 49 * Output : None
davidr99 0:e5fc19091502 50 * Return : None
davidr99 0:e5fc19091502 51 *******************************************************************************/
davidr99 0:e5fc19091502 52 void CameraShield::VC0706_reset(void)
davidr99 0:e5fc19091502 53 {
davidr99 0:e5fc19091502 54 unsigned char tx_vcbuffer[4];
davidr99 0:e5fc19091502 55
davidr99 0:e5fc19091502 56 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 57 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 58 tx_vcbuffer[2]=VC0706_COMMAND_RESET;
davidr99 0:e5fc19091502 59 tx_vcbuffer[3]=0x00;
davidr99 0:e5fc19091502 60
davidr99 0:e5fc19091502 61 buffer_send(tx_vcbuffer, 4);
davidr99 0:e5fc19091502 62 }
davidr99 0:e5fc19091502 63
davidr99 0:e5fc19091502 64
davidr99 0:e5fc19091502 65
davidr99 0:e5fc19091502 66 /*******************************************************************************
davidr99 0:e5fc19091502 67 * Function Name : VC0706_get_version
davidr99 0:e5fc19091502 68 * Description : Request version string from VC0706
davidr99 0:e5fc19091502 69 *
davidr99 0:e5fc19091502 70 * Input : None
davidr99 0:e5fc19091502 71 *
davidr99 0:e5fc19091502 72 * Output : None
davidr99 0:e5fc19091502 73 * Return : None
davidr99 0:e5fc19091502 74 *******************************************************************************/
davidr99 0:e5fc19091502 75 void CameraShield::VC0706_get_version()
davidr99 0:e5fc19091502 76 {
davidr99 0:e5fc19091502 77 unsigned char tx_vcbuffer[4];
davidr99 0:e5fc19091502 78
davidr99 0:e5fc19091502 79 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 80 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 81 tx_vcbuffer[2]=VC0706_COMMAND_GEN_VERSION;
davidr99 0:e5fc19091502 82 tx_vcbuffer[3]=0x00;
davidr99 0:e5fc19091502 83
davidr99 0:e5fc19091502 84 buffer_send(tx_vcbuffer, 4);
davidr99 0:e5fc19091502 85 }
davidr99 0:e5fc19091502 86
davidr99 0:e5fc19091502 87
davidr99 0:e5fc19091502 88 /*******************************************************************************
davidr99 0:e5fc19091502 89 * Function Name : VC0706_tv_out_control
davidr99 0:e5fc19091502 90 * Description : stop or start TV output from VC0706
davidr99 0:e5fc19091502 91 *
davidr99 0:e5fc19091502 92 * Input : on=0 stop tv output
davidr99 0:e5fc19091502 93 ; : on=1 start tv output
davidr99 0:e5fc19091502 94 *
davidr99 0:e5fc19091502 95 * Output : None
davidr99 0:e5fc19091502 96 * Return : None
davidr99 0:e5fc19091502 97 *******************************************************************************/
davidr99 0:e5fc19091502 98 void CameraShield::VC0706_tv_out_control(int on)
davidr99 0:e5fc19091502 99 {
davidr99 0:e5fc19091502 100 unsigned char tx_vcbuffer[5];
davidr99 0:e5fc19091502 101
davidr99 0:e5fc19091502 102 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 103 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 104 tx_vcbuffer[2]=VC0706_COMMAND_TV_OUT_CTRL;
davidr99 0:e5fc19091502 105 tx_vcbuffer[3]=0x01;
davidr99 0:e5fc19091502 106 tx_vcbuffer[4]=on;
davidr99 0:e5fc19091502 107
davidr99 0:e5fc19091502 108 buffer_send(tx_vcbuffer, 5);
davidr99 0:e5fc19091502 109 }
davidr99 0:e5fc19091502 110
davidr99 0:e5fc19091502 111 /*******************************************************************************
davidr99 0:e5fc19091502 112 * Function Name : VC0706_osd_add_char
davidr99 0:e5fc19091502 113 * Description : ADD OSD CHARACTERS TO CHANNELS(CHANNEL 1)
davidr99 0:e5fc19091502 114 *
davidr99 0:e5fc19091502 115 * Input : col : Display column
davidr99 0:e5fc19091502 116 * ` row: Display Row
davidr99 0:e5fc19091502 117 * osd_string : display string (max 14 characters)
davidr99 0:e5fc19091502 118 *
davidr99 0:e5fc19091502 119 * Output : None
davidr99 0:e5fc19091502 120 * Return : None
davidr99 0:e5fc19091502 121 *******************************************************************************/
davidr99 0:e5fc19091502 122 void CameraShield::VC0706_osd_add_char(int col, int row, char * osd_string)
davidr99 0:e5fc19091502 123 {
davidr99 0:e5fc19091502 124 unsigned char tx_vcbuffer[80];
davidr99 0:e5fc19091502 125 unsigned char col_row;
davidr99 0:e5fc19091502 126 int string_length;
davidr99 0:e5fc19091502 127 int i;
davidr99 0:e5fc19091502 128
davidr99 0:e5fc19091502 129 col&=0x0f;
davidr99 0:e5fc19091502 130 row&=0x0f;
davidr99 0:e5fc19091502 131 col_row=(unsigned char)(col<<4 | row);
davidr99 0:e5fc19091502 132
davidr99 0:e5fc19091502 133 string_length=strlen(osd_string);
davidr99 0:e5fc19091502 134 if (string_length>14)
davidr99 0:e5fc19091502 135 string_length=14; // max 14 osd characters
davidr99 0:e5fc19091502 136
davidr99 0:e5fc19091502 137 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 138 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 139 tx_vcbuffer[2]=VC0706_COMMAND_OSD_ADD_CHAR;
davidr99 0:e5fc19091502 140 tx_vcbuffer[3]=string_length+2;
davidr99 0:e5fc19091502 141 tx_vcbuffer[4]=string_length; // character number
davidr99 0:e5fc19091502 142 tx_vcbuffer[5]=col_row;
davidr99 0:e5fc19091502 143
davidr99 0:e5fc19091502 144 for (i=0;i<string_length;i++)
davidr99 0:e5fc19091502 145 {
davidr99 0:e5fc19091502 146 tx_vcbuffer[i+6]=osd_string[i];
davidr99 0:e5fc19091502 147 }
davidr99 0:e5fc19091502 148
davidr99 0:e5fc19091502 149
davidr99 0:e5fc19091502 150 buffer_send(tx_vcbuffer, string_length+6);
davidr99 0:e5fc19091502 151 }
davidr99 0:e5fc19091502 152
davidr99 0:e5fc19091502 153
davidr99 0:e5fc19091502 154 /*******************************************************************************
davidr99 0:e5fc19091502 155 * Function Name : VC0706_w_h_downsize
davidr99 0:e5fc19091502 156 * Description : control width and height downsize attribute
davidr99 0:e5fc19091502 157 *
davidr99 0:e5fc19091502 158 * Input : scale_width = 0 1:1
davidr99 0:e5fc19091502 159 * = 1 1:2
davidr99 0:e5fc19091502 160 * = 2 1:4
davidr99 0:e5fc19091502 161 * scale_height= 0 1:1
davidr99 0:e5fc19091502 162 * = 1 1:2
davidr99 0:e5fc19091502 163 * = 2 1:4
davidr99 0:e5fc19091502 164 *
davidr99 0:e5fc19091502 165 * Output : None
davidr99 0:e5fc19091502 166 * Return : None
davidr99 0:e5fc19091502 167 *******************************************************************************/
davidr99 0:e5fc19091502 168 void CameraShield::VC0706_w_h_downsize(int scale_width, int scale_height)
davidr99 0:e5fc19091502 169 {
davidr99 0:e5fc19091502 170 int scale;
davidr99 0:e5fc19091502 171 unsigned char tx_vcbuffer[5];
davidr99 0:e5fc19091502 172
davidr99 0:e5fc19091502 173 if (scale_width>=2) scale_width=2;
davidr99 0:e5fc19091502 174 if (scale_height>scale_width) scale_height=scale_width;
davidr99 0:e5fc19091502 175 scale=(unsigned char)(scale_height<<2 | scale_width);
davidr99 0:e5fc19091502 176
davidr99 0:e5fc19091502 177
davidr99 0:e5fc19091502 178 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 179 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 180 tx_vcbuffer[2]=VC0706_COMMAND_DOWNSIZE_SIZE;
davidr99 0:e5fc19091502 181 tx_vcbuffer[3]=0x01;
davidr99 0:e5fc19091502 182
davidr99 0:e5fc19091502 183 tx_vcbuffer[4]=scale; //bit[1:0] width zooming proportion
davidr99 0:e5fc19091502 184 //bit[3:2] height zooming proportion
davidr99 0:e5fc19091502 185
davidr99 0:e5fc19091502 186 buffer_send(tx_vcbuffer, 5);
davidr99 0:e5fc19091502 187 }
davidr99 0:e5fc19091502 188
davidr99 0:e5fc19091502 189 /*******************************************************************************
davidr99 0:e5fc19091502 190 * Function Name : VC0706_read_frame_buffer
davidr99 0:e5fc19091502 191 * Description : read image data from FBUF
davidr99 0:e5fc19091502 192 *
davidr99 0:e5fc19091502 193 * Input : buffer_address(4 bytes); buffer_length(4 bytes)
davidr99 0:e5fc19091502 194 *
davidr99 0:e5fc19091502 195 * Output : None
davidr99 0:e5fc19091502 196 * Return : None
davidr99 0:e5fc19091502 197 *******************************************************************************/
davidr99 0:e5fc19091502 198 void CameraShield::VC0706_read_frame_buffer(unsigned long buffer_address, unsigned long buffer_length)
davidr99 0:e5fc19091502 199 {
davidr99 0:e5fc19091502 200 unsigned char tx_vcbuffer[16];
davidr99 0:e5fc19091502 201
davidr99 0:e5fc19091502 202 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 203 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 204 tx_vcbuffer[2]=VC0706_COMMAND_READ_FBUF;
davidr99 0:e5fc19091502 205 tx_vcbuffer[3]=0x0c;
davidr99 0:e5fc19091502 206 tx_vcbuffer[4]=FBUF_CURRENT_FRAME;
davidr99 0:e5fc19091502 207 tx_vcbuffer[5]=0x0a; // 0x0a=data transfer by MCU mode; 0x0f=data transfer by SPI interface
davidr99 0:e5fc19091502 208 tx_vcbuffer[6]=buffer_address>>24; //starting address
davidr99 0:e5fc19091502 209 tx_vcbuffer[7]=buffer_address>>16;
davidr99 0:e5fc19091502 210 tx_vcbuffer[8]=buffer_address>>8;
davidr99 0:e5fc19091502 211 tx_vcbuffer[9]=buffer_address&0x0ff;
davidr99 0:e5fc19091502 212
davidr99 0:e5fc19091502 213 tx_vcbuffer[10]=buffer_length>>24; // data length
davidr99 0:e5fc19091502 214 tx_vcbuffer[11]=buffer_length>>16;
davidr99 0:e5fc19091502 215 tx_vcbuffer[12]=buffer_length>>8;
davidr99 0:e5fc19091502 216 tx_vcbuffer[13]=buffer_length&0x0ff;
davidr99 0:e5fc19091502 217 tx_vcbuffer[14]=0x00; // delay time
davidr99 0:e5fc19091502 218 tx_vcbuffer[15]=0x0a;
davidr99 0:e5fc19091502 219
davidr99 0:e5fc19091502 220
davidr99 0:e5fc19091502 221 buffer_send(tx_vcbuffer, 16);
davidr99 0:e5fc19091502 222 }
davidr99 0:e5fc19091502 223
davidr99 0:e5fc19091502 224
davidr99 0:e5fc19091502 225 /*******************************************************************************
davidr99 0:e5fc19091502 226 * Function Name : VC0706_get_frame_buffer_length
davidr99 0:e5fc19091502 227 * Description : Get frame buffer length
davidr99 0:e5fc19091502 228 *
davidr99 0:e5fc19091502 229 * Input : None
davidr99 0:e5fc19091502 230 * Output : Frame Length
davidr99 0:e5fc19091502 231 * Return : None
davidr99 0:e5fc19091502 232 *******************************************************************************/
davidr99 0:e5fc19091502 233 uint32_t CameraShield::VC0706_get_frame_buffer_length()
davidr99 0:e5fc19091502 234 {
davidr99 0:e5fc19091502 235 unsigned char tx_vcbuffer[20];
davidr99 0:e5fc19091502 236 uint32_t frame_length;
davidr99 0:e5fc19091502 237
davidr99 0:e5fc19091502 238 _serial.rxBufferFlush();
davidr99 0:e5fc19091502 239
davidr99 0:e5fc19091502 240 //get frame buffer length
davidr99 0:e5fc19091502 241 VC0706_get_framebuffer_length(0);
davidr99 0:e5fc19091502 242 wait_ms(10);
davidr99 0:e5fc19091502 243 buffer_read(tx_vcbuffer, sizeof(tx_vcbuffer));
davidr99 0:e5fc19091502 244
davidr99 0:e5fc19091502 245 // store frame buffer length for coming reading
davidr99 0:e5fc19091502 246 frame_length = (tx_vcbuffer[5]<<8) + tx_vcbuffer[6];
davidr99 0:e5fc19091502 247 frame_length = frame_length << 16;
davidr99 0:e5fc19091502 248 frame_length = frame_length + (0x0ff00 & (tx_vcbuffer[7]<<8)) + tx_vcbuffer[8];
davidr99 0:e5fc19091502 249
davidr99 0:e5fc19091502 250 return frame_length;
davidr99 0:e5fc19091502 251 }
davidr99 0:e5fc19091502 252
davidr99 0:e5fc19091502 253
davidr99 0:e5fc19091502 254
davidr99 0:e5fc19091502 255 /*******************************************************************************
davidr99 0:e5fc19091502 256 * Function Name : VC0706_frame_control
davidr99 0:e5fc19091502 257 * Description : control frame buffer register
davidr99 0:e5fc19091502 258 *
davidr99 0:e5fc19091502 259 * Input : frame_control=control flag(1byte)
davidr99 0:e5fc19091502 260 * : 0 = stop current frame ; 1= stop next frame;2=step frame;3 =resume frame;
davidr99 0:e5fc19091502 261 *
davidr99 0:e5fc19091502 262 * Output : None
davidr99 0:e5fc19091502 263 * Return : None
davidr99 0:e5fc19091502 264 *******************************************************************************/
davidr99 0:e5fc19091502 265 void CameraShield::VC0706_frame_control(char frame_control)
davidr99 0:e5fc19091502 266 {
davidr99 0:e5fc19091502 267 unsigned char tx_vcbuffer[5];
davidr99 0:e5fc19091502 268
davidr99 0:e5fc19091502 269 if(frame_control>3)frame_control=3;
davidr99 0:e5fc19091502 270 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 271 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 272 tx_vcbuffer[2]=VC0706_COMMAND_FBUF_CTRL;
davidr99 0:e5fc19091502 273 tx_vcbuffer[3]=0x01;
davidr99 0:e5fc19091502 274 tx_vcbuffer[4]=frame_control;
davidr99 0:e5fc19091502 275
davidr99 0:e5fc19091502 276 buffer_send(tx_vcbuffer, 5);
davidr99 0:e5fc19091502 277 }
davidr99 0:e5fc19091502 278
davidr99 0:e5fc19091502 279
davidr99 0:e5fc19091502 280 /*******************************************************************************
davidr99 0:e5fc19091502 281 * Function Name : VC0706_motion_detection
davidr99 0:e5fc19091502 282 * Description : get motion monitoring status in communication interface.
davidr99 0:e5fc19091502 283 *
davidr99 0:e5fc19091502 284 * Input : control_flag = 0 stop motion monitoring
davidr99 0:e5fc19091502 285 * = 1 start motion monitoring
davidr99 0:e5fc19091502 286 *
davidr99 0:e5fc19091502 287 * Output : None
davidr99 0:e5fc19091502 288 * Return : None
davidr99 0:e5fc19091502 289 *******************************************************************************/
davidr99 0:e5fc19091502 290 void CameraShield::VC0706_motion_detection(int control_flag)
davidr99 0:e5fc19091502 291 {
davidr99 0:e5fc19091502 292 unsigned char tx_vcbuffer[5];
davidr99 0:e5fc19091502 293
davidr99 0:e5fc19091502 294
davidr99 0:e5fc19091502 295 if(control_flag>1)control_flag=1;
davidr99 0:e5fc19091502 296 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 297 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 298 tx_vcbuffer[2]=VC0706_COMMAND_COMM_MOTION_CTRL;
davidr99 0:e5fc19091502 299 tx_vcbuffer[3]=0x01;
davidr99 0:e5fc19091502 300 tx_vcbuffer[4]=control_flag;
davidr99 0:e5fc19091502 301
davidr99 0:e5fc19091502 302 buffer_send(tx_vcbuffer, 5);
davidr99 0:e5fc19091502 303 }
davidr99 0:e5fc19091502 304
davidr99 0:e5fc19091502 305 /*******************************************************************************
davidr99 0:e5fc19091502 306 * Function Name : VC0706_motion_control
davidr99 0:e5fc19091502 307 * Description : motion control
davidr99 0:e5fc19091502 308 *
davidr99 0:e5fc19091502 309 * Input : control_flag = 0 forbid motion monitoring
davidr99 0:e5fc19091502 310 * = 1 enable motion monitoring
davidr99 0:e5fc19091502 311 *
davidr99 0:e5fc19091502 312 * Output : None
davidr99 0:e5fc19091502 313 * Return : None
davidr99 0:e5fc19091502 314 *******************************************************************************/
davidr99 0:e5fc19091502 315 void CameraShield::VC0706_motion_control(int control_flag)
davidr99 0:e5fc19091502 316 {
davidr99 0:e5fc19091502 317 unsigned char tx_vcbuffer[7];
davidr99 0:e5fc19091502 318
davidr99 0:e5fc19091502 319
davidr99 0:e5fc19091502 320 if(control_flag>1)control_flag=1;
davidr99 0:e5fc19091502 321 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 322 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 323 tx_vcbuffer[2]=VC0706_COMMAND_MOTION_CTRL;
davidr99 0:e5fc19091502 324 tx_vcbuffer[3]=0x03;
davidr99 0:e5fc19091502 325 tx_vcbuffer[4]=0x00; //motion control attribute
davidr99 0:e5fc19091502 326 tx_vcbuffer[5]=0x01; //mcu uart control
davidr99 0:e5fc19091502 327 tx_vcbuffer[6]=control_flag;
davidr99 0:e5fc19091502 328
davidr99 0:e5fc19091502 329 buffer_send(tx_vcbuffer, 7);
davidr99 0:e5fc19091502 330 }
davidr99 0:e5fc19091502 331
davidr99 0:e5fc19091502 332
davidr99 0:e5fc19091502 333
davidr99 0:e5fc19091502 334
davidr99 0:e5fc19091502 335
davidr99 0:e5fc19091502 336
davidr99 0:e5fc19091502 337 /*******************************************************************************
davidr99 0:e5fc19091502 338 * Function Name : VC0706_get_framebuffer_length
davidr99 0:e5fc19091502 339 * Description : get byte-lengths in FBUF
davidr99 0:e5fc19091502 340 *
davidr99 0:e5fc19091502 341 * Input : fbuf_type =current or next frame
davidr99 0:e5fc19091502 342 * 0 = current frame
davidr99 0:e5fc19091502 343 * 1 = next frame
davidr99 0:e5fc19091502 344 *
davidr99 0:e5fc19091502 345 * Output : None
davidr99 0:e5fc19091502 346 * Return : None
davidr99 0:e5fc19091502 347 *******************************************************************************/
davidr99 0:e5fc19091502 348 void CameraShield::VC0706_get_framebuffer_length(char fbuf_type)
davidr99 0:e5fc19091502 349 {
davidr99 0:e5fc19091502 350 unsigned char tx_vcbuffer[5];
davidr99 0:e5fc19091502 351
davidr99 0:e5fc19091502 352 if(fbuf_type>1)fbuf_type=1;
davidr99 0:e5fc19091502 353 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 354 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 355 tx_vcbuffer[2]=VC0706_COMMAND_GET_FBUF_LEN;
davidr99 0:e5fc19091502 356 tx_vcbuffer[3]=0x01;
davidr99 0:e5fc19091502 357 tx_vcbuffer[4]=fbuf_type;
davidr99 0:e5fc19091502 358
davidr99 0:e5fc19091502 359 buffer_send(tx_vcbuffer, 5);
davidr99 0:e5fc19091502 360 }
davidr99 0:e5fc19091502 361
davidr99 0:e5fc19091502 362
davidr99 0:e5fc19091502 363
davidr99 0:e5fc19091502 364 /*******************************************************************************
davidr99 0:e5fc19091502 365 * Function Name : VC0706_uart_power_save
davidr99 0:e5fc19091502 366 * Description : stop current frame for reading
davidr99 0:e5fc19091502 367 *
davidr99 0:e5fc19091502 368 * Input : power_on =1 start power-save
davidr99 0:e5fc19091502 369 * = 0 stop power-save
davidr99 0:e5fc19091502 370 *
davidr99 0:e5fc19091502 371 * Output : None
davidr99 0:e5fc19091502 372 * Return : None
davidr99 0:e5fc19091502 373 *******************************************************************************/
davidr99 0:e5fc19091502 374 void CameraShield::VC0706_uart_power_save(char power_save_on)
davidr99 0:e5fc19091502 375 {
davidr99 0:e5fc19091502 376 unsigned char tx_vcbuffer[7];
davidr99 0:e5fc19091502 377
davidr99 0:e5fc19091502 378 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 379 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 380 tx_vcbuffer[2]=VC0706_COMMAND_POWER_SAVE_CTRL;
davidr99 0:e5fc19091502 381 tx_vcbuffer[3]=0x03;
davidr99 0:e5fc19091502 382 tx_vcbuffer[4]=00; //power save control mode
davidr99 0:e5fc19091502 383 tx_vcbuffer[5]=01; // control by UART
davidr99 0:e5fc19091502 384 tx_vcbuffer[6]=power_save_on; //start power save
davidr99 0:e5fc19091502 385
davidr99 0:e5fc19091502 386
davidr99 0:e5fc19091502 387 buffer_send(tx_vcbuffer, 7);
davidr99 0:e5fc19091502 388 }
davidr99 0:e5fc19091502 389
davidr99 0:e5fc19091502 390
davidr99 0:e5fc19091502 391 /*******************************************************************************
davidr99 0:e5fc19091502 392 * Function Name : VC0706_uart_color_control
davidr99 0:e5fc19091502 393 * Description : stop current frame for reading
davidr99 0:e5fc19091502 394 *
davidr99 0:e5fc19091502 395 * Input : show_mode = 0 automatically step black-white and colour
davidr99 0:e5fc19091502 396 * 1 manually step color, select colour
davidr99 0:e5fc19091502 397 * 2 manually step color, select black-white
davidr99 0:e5fc19091502 398 *
davidr99 0:e5fc19091502 399 * Output : None
davidr99 0:e5fc19091502 400 * Return : None
davidr99 0:e5fc19091502 401 *******************************************************************************/
davidr99 0:e5fc19091502 402 void CameraShield::VC0706_uart_color_control(char show_mode)
davidr99 0:e5fc19091502 403 {
davidr99 0:e5fc19091502 404 unsigned char tx_vcbuffer[6];
davidr99 0:e5fc19091502 405
davidr99 0:e5fc19091502 406 if(show_mode>2) show_mode=2;
davidr99 0:e5fc19091502 407 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 408 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 409 tx_vcbuffer[2]=VC0706_COMMAND_COLOR_CTRL;
davidr99 0:e5fc19091502 410 tx_vcbuffer[3]=0x02;
davidr99 0:e5fc19091502 411 tx_vcbuffer[4]=01; //control by UART
davidr99 0:e5fc19091502 412 tx_vcbuffer[5]=show_mode; // automatically step black-white and colour
davidr99 0:e5fc19091502 413
davidr99 0:e5fc19091502 414 buffer_send(tx_vcbuffer, 6);
davidr99 0:e5fc19091502 415 }
davidr99 0:e5fc19091502 416
davidr99 0:e5fc19091502 417
davidr99 0:e5fc19091502 418 /*******************************************************************************
davidr99 0:e5fc19091502 419 * Function Name : VC0706_image_size
davidr99 0:e5fc19091502 420 * Description : resizing the image
davidr99 0:e5fc19091502 421 *
davidr99 0:e5fc19091502 422 * Input : VC0706_640x480
davidr99 0:e5fc19091502 423 * VC0706_320x240
davidr99 0:e5fc19091502 424 * VC0706_160x120
davidr99 0:e5fc19091502 425 *
davidr99 0:e5fc19091502 426 * Output : None
davidr99 0:e5fc19091502 427 * Return : None
davidr99 0:e5fc19091502 428 *******************************************************************************/
davidr99 0:e5fc19091502 429 void CameraShield::VC0706_image_size(int ratio)
davidr99 0:e5fc19091502 430 {
davidr99 0:e5fc19091502 431 unsigned char tx_vcbuffer[9];
davidr99 0:e5fc19091502 432
davidr99 0:e5fc19091502 433 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 434 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 435 tx_vcbuffer[2]=VC0706_COMMAND_WRITE_DATA;
davidr99 0:e5fc19091502 436 tx_vcbuffer[3]=0x05;
davidr99 0:e5fc19091502 437 tx_vcbuffer[4]=0x04;
davidr99 0:e5fc19091502 438 tx_vcbuffer[5]=0x01;
davidr99 0:e5fc19091502 439 tx_vcbuffer[6]=0x00;
davidr99 0:e5fc19091502 440 tx_vcbuffer[7]=0x19;
davidr99 0:e5fc19091502 441 tx_vcbuffer[8]=ratio; //data
davidr99 0:e5fc19091502 442
davidr99 0:e5fc19091502 443 buffer_send(tx_vcbuffer, 9);
davidr99 0:e5fc19091502 444 }
davidr99 0:e5fc19091502 445
davidr99 0:e5fc19091502 446
davidr99 0:e5fc19091502 447
davidr99 0:e5fc19091502 448 /*******************************************************************************
davidr99 0:e5fc19091502 449 * Function Name : VC0706_compression_ratio
davidr99 0:e5fc19091502 450 * Description : stop current frame for reading
davidr99 0:e5fc19091502 451 *
davidr99 0:e5fc19091502 452 * Input : ration >13(minimum)
davidr99 0:e5fc19091502 453 * <63(max)
davidr99 0:e5fc19091502 454 *
davidr99 0:e5fc19091502 455 * Output : None
davidr99 0:e5fc19091502 456 * Return : None
davidr99 0:e5fc19091502 457 *******************************************************************************/
davidr99 0:e5fc19091502 458 void CameraShield::VC0706_compression_ratio(int ratio)
davidr99 0:e5fc19091502 459 {
davidr99 0:e5fc19091502 460 unsigned char tx_vcbuffer[9];
davidr99 0:e5fc19091502 461
davidr99 0:e5fc19091502 462 if(ratio>63)ratio=63;
davidr99 0:e5fc19091502 463 if(ratio<13)ratio=13;
davidr99 0:e5fc19091502 464 int vc_comp_ratio=(ratio-13)*4+53;
davidr99 0:e5fc19091502 465 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 466 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 467 tx_vcbuffer[2]=VC0706_COMMAND_WRITE_DATA;
davidr99 0:e5fc19091502 468 tx_vcbuffer[3]=0x05;
davidr99 0:e5fc19091502 469 tx_vcbuffer[4]=01; //chip register
davidr99 0:e5fc19091502 470 tx_vcbuffer[5]=0x01; //data num ready to write
davidr99 0:e5fc19091502 471 tx_vcbuffer[6]=0x12; //register address
davidr99 0:e5fc19091502 472 tx_vcbuffer[7]=0x04;
davidr99 0:e5fc19091502 473 tx_vcbuffer[8]=vc_comp_ratio; //data
davidr99 0:e5fc19091502 474
davidr99 0:e5fc19091502 475 buffer_send(tx_vcbuffer, 9);
davidr99 0:e5fc19091502 476 }
davidr99 0:e5fc19091502 477
davidr99 0:e5fc19091502 478
davidr99 0:e5fc19091502 479 /*******************************************************************************
davidr99 0:e5fc19091502 480 * Function Name : VC0706_motion_windows_setting
davidr99 0:e5fc19091502 481 * Description : motion windows setting
davidr99 0:e5fc19091502 482 *
davidr99 0:e5fc19091502 483 * Input : register_address(2 bytes);
davidr99 0:e5fc19091502 484 * data(4 bytes)= data ready to write
davidr99 0:e5fc19091502 485 *
davidr99 0:e5fc19091502 486 * Output : None
davidr99 0:e5fc19091502 487 * Return : None
davidr99 0:e5fc19091502 488 *******************************************************************************/
davidr99 0:e5fc19091502 489 void CameraShield::VC0706_motion_windows_setting(unsigned int register_address, unsigned long data)
davidr99 0:e5fc19091502 490 {
davidr99 0:e5fc19091502 491 unsigned char tx_vcbuffer[12];
davidr99 0:e5fc19091502 492
davidr99 0:e5fc19091502 493 tx_vcbuffer[0]=VC0706_PROTOCOL_SIGN;
davidr99 0:e5fc19091502 494 tx_vcbuffer[1]=VC0706_SERIAL_NUMBER;
davidr99 0:e5fc19091502 495 tx_vcbuffer[2]=VC0706_COMMAND_WRITE_DATA;
davidr99 0:e5fc19091502 496 tx_vcbuffer[3]=0x08;
davidr99 0:e5fc19091502 497 tx_vcbuffer[4]=01; //chip register
davidr99 0:e5fc19091502 498 tx_vcbuffer[5]=0x04; //data num ready to write
davidr99 0:e5fc19091502 499 tx_vcbuffer[6]=register_address>>8; //register address
davidr99 0:e5fc19091502 500 tx_vcbuffer[7]=register_address&0x0ff;;
davidr99 0:e5fc19091502 501
davidr99 0:e5fc19091502 502 tx_vcbuffer[8]=data>>24; // data ready to write
davidr99 0:e5fc19091502 503 tx_vcbuffer[9]=data>>16;
davidr99 0:e5fc19091502 504 tx_vcbuffer[10]=data>>8;
davidr99 0:e5fc19091502 505 tx_vcbuffer[11]=data&0x0ff;
davidr99 0:e5fc19091502 506
davidr99 0:e5fc19091502 507 buffer_send(tx_vcbuffer, 12);
davidr99 0:e5fc19091502 508 }
davidr99 0:e5fc19091502 509
davidr99 0:e5fc19091502 510
davidr99 0:e5fc19091502 511
davidr99 0:e5fc19091502 512 /*******************************************************************************
davidr99 0:e5fc19091502 513 * Function Name : buffer_send
davidr99 0:e5fc19091502 514 * Description : Transmit buffer to VC0706
davidr99 0:e5fc19091502 515 *
davidr99 0:e5fc19091502 516 * Input : buff pointer
davidr99 0:e5fc19091502 517 * : buffer length
davidr99 0:e5fc19091502 518 *
davidr99 0:e5fc19091502 519 * Output : None
davidr99 0:e5fc19091502 520 * Return : None
davidr99 0:e5fc19091502 521 *******************************************************************************/
davidr99 0:e5fc19091502 522 void CameraShield::buffer_send(unsigned char *buff, int buffSize)
davidr99 0:e5fc19091502 523 {
davidr99 0:e5fc19091502 524 int i=0;
davidr99 0:e5fc19091502 525
davidr99 0:e5fc19091502 526 for (i=0;i<buffSize;i++)
davidr99 0:e5fc19091502 527 _serial.putc(buff[i]);
davidr99 0:e5fc19091502 528
davidr99 0:e5fc19091502 529 // Wait for buffer to send
davidr99 0:e5fc19091502 530 while(_serial.txIsBusy())
davidr99 0:e5fc19091502 531 {
davidr99 0:e5fc19091502 532 wait_us(1);
davidr99 0:e5fc19091502 533 }
davidr99 0:e5fc19091502 534 }
davidr99 0:e5fc19091502 535
davidr99 0:e5fc19091502 536
davidr99 0:e5fc19091502 537
davidr99 0:e5fc19091502 538 /*******************************************************************************
davidr99 0:e5fc19091502 539 * Function Name : buffer_read
davidr99 0:e5fc19091502 540 * Description : Receive buffer from VC0706
davidr99 0:e5fc19091502 541 *
davidr99 0:e5fc19091502 542 * Input : buffer pointer
davidr99 0:e5fc19091502 543 * : buffer size
davidr99 0:e5fc19091502 544 *
davidr99 0:e5fc19091502 545 * Output : length of buffer read
davidr99 0:e5fc19091502 546 * Return : None
davidr99 0:e5fc19091502 547 *******************************************************************************/
davidr99 0:e5fc19091502 548 int CameraShield::buffer_read(unsigned char *buff, int buffSize)
davidr99 0:e5fc19091502 549 {
davidr99 0:e5fc19091502 550 bool validity=true;
davidr99 0:e5fc19091502 551 int rx_counter = 0;
davidr99 0:e5fc19091502 552
davidr99 0:e5fc19091502 553 buff[0]=0;
davidr99 0:e5fc19091502 554 while (_serial.readable() > 0 && rx_counter < buffSize)
davidr99 0:e5fc19091502 555 {
davidr99 0:e5fc19091502 556 buff[rx_counter++]= _serial.getc();
davidr99 0:e5fc19091502 557 }
davidr99 0:e5fc19091502 558
davidr99 0:e5fc19091502 559 if (buff[0]!=0x76)
davidr99 0:e5fc19091502 560 validity=false;
davidr99 0:e5fc19091502 561 if (buff[1]!=VC0706_SERIAL_NUMBER)
davidr99 0:e5fc19091502 562 validity=false;
davidr99 0:e5fc19091502 563
davidr99 0:e5fc19091502 564 if (validity)
davidr99 0:e5fc19091502 565 return 0;
davidr99 0:e5fc19091502 566
davidr99 0:e5fc19091502 567 return rx_counter;
davidr99 0:e5fc19091502 568 }