A Telegram BOT for this awesome all-in-one board.

Dependencies:   BSP_B-L475E-IOT01 mbed es_wifi jsmn

Telegram Bot for DISCO_L475VG_IOT01

This application embeds aTelegram chatbot into the DISCO_L475VG_IOT01 board.

The Bot answers to the users queries about:

  • Real time environmental data taken from the on board sensors.
  • Environmental data history of the latest 24 hours stored on board.
  • Camera images taken from the Arducam-mini-2mp (optional).

This software uses:

Compilation

Import in your compiler and modify the following defines:

  • WIFI_SSID
  • WIFI_PASSWORD
  • TELEGRAM_BOT_APIKEY

Please follow the Telegram bots documentation (https://core.telegram.org/bots) to better understand how the Telegram API works and how to create your bot.

In order to support the Arducam-Mini-2MP set WITH_ARDUCAM_2640 #define to 1.

Screenshots

/media/uploads/dvddnr/screenshot_20180130-073732.png /media/uploads/dvddnr/screenshot_20180130-073703.png /media/uploads/dvddnr/arducam.jpeg /media/uploads/dvddnr/screenshot_20180216-102601.png

Security

The Inventek wifi module creates the ssl connection but does not authenticate the server's certificate ( AT cmd P9=0 ).

For more details http://www.inventeksys.com/IWIN/programming-certificates-tcp-ssltls/

Committer:
dvddnr
Date:
Fri Feb 16 09:17:47 2018 +0000
Revision:
10:28cf58359411
Parent:
8:89fe332bc412
WITH_ARDUCAM_2640 default value to 0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dvddnr 8:89fe332bc412 1 /*
dvddnr 8:89fe332bc412 2 ArduCAM.h - Arduino library support for CMOS Image Sensor
dvddnr 8:89fe332bc412 3 Copyright (C)2011-2015 ArduCAM.com. All right reserved
dvddnr 8:89fe332bc412 4
dvddnr 8:89fe332bc412 5 Basic functionality of this library are based on the demo-code provided by
dvddnr 8:89fe332bc412 6 ArduCAM.com. You can find the latest version of the library at
dvddnr 8:89fe332bc412 7 http://www.ArduCAM.com
dvddnr 8:89fe332bc412 8
dvddnr 8:89fe332bc412 9 Now supported controllers:
dvddnr 8:89fe332bc412 10 - OV7670
dvddnr 8:89fe332bc412 11 - MT9D111
dvddnr 8:89fe332bc412 12 - OV7675
dvddnr 8:89fe332bc412 13 - OV2640
dvddnr 8:89fe332bc412 14 - OV3640
dvddnr 8:89fe332bc412 15 - OV5642
dvddnr 8:89fe332bc412 16 - OV7660
dvddnr 8:89fe332bc412 17 - OV7725
dvddnr 8:89fe332bc412 18 - MT9M112
dvddnr 8:89fe332bc412 19 - MT9V111
dvddnr 8:89fe332bc412 20 - OV5640
dvddnr 8:89fe332bc412 21 - MT9M001
dvddnr 8:89fe332bc412 22
dvddnr 8:89fe332bc412 23 We will add support for many other sensors in next release.
dvddnr 8:89fe332bc412 24
dvddnr 8:89fe332bc412 25 Supported MCU platform
dvddnr 8:89fe332bc412 26 - Theoretically support all Arduino families
dvddnr 8:89fe332bc412 27 - Arduino UNO R3 (Tested)
dvddnr 8:89fe332bc412 28 - Arduino MEGA2560 R3 (Tested)
dvddnr 8:89fe332bc412 29 - Arduino Leonardo R3 (Tested)
dvddnr 8:89fe332bc412 30 - Arduino Nano (Tested)
dvddnr 8:89fe332bc412 31 - Arduino DUE (Tested)
dvddnr 8:89fe332bc412 32 - Arduino Yun (Tested)
dvddnr 8:89fe332bc412 33 - Raspberry Pi (Tested)
dvddnr 8:89fe332bc412 34
dvddnr 8:89fe332bc412 35
dvddnr 8:89fe332bc412 36 If you make any modifications or improvements to the code, I would appreciate
dvddnr 8:89fe332bc412 37 that you share the code with me so that I might include it in the next release.
dvddnr 8:89fe332bc412 38 I can be contacted through http://www.ArduCAM.com
dvddnr 8:89fe332bc412 39
dvddnr 8:89fe332bc412 40 This library is free software; you can redistribute it and/or
dvddnr 8:89fe332bc412 41 modify it under the terms of the GNU Lesser General Public
dvddnr 8:89fe332bc412 42 License as published by the Free Software Foundation; either
dvddnr 8:89fe332bc412 43 version 2.1 of the License, or (at your option) any later version.
dvddnr 8:89fe332bc412 44
dvddnr 8:89fe332bc412 45 This library is distributed in the hope that it will be useful,
dvddnr 8:89fe332bc412 46 but WITHOUT ANY WARRANTY; without even the implied warranty of
dvddnr 8:89fe332bc412 47 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dvddnr 8:89fe332bc412 48 Lesser General Public License for more details.
dvddnr 8:89fe332bc412 49
dvddnr 8:89fe332bc412 50 You should have received a copy of the GNU Lesser General Public
dvddnr 8:89fe332bc412 51 License along with this library; if not, write to the Free Software
dvddnr 8:89fe332bc412 52 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
dvddnr 8:89fe332bc412 53 */
dvddnr 8:89fe332bc412 54
dvddnr 8:89fe332bc412 55 /*------------------------------------
dvddnr 8:89fe332bc412 56 Revision History:
dvddnr 8:89fe332bc412 57 2012/09/20 V1.0.0 by Lee first release
dvddnr 8:89fe332bc412 58 2012/10/23 V1.0.1 by Lee Resolved some timing issue for the Read/Write Register
dvddnr 8:89fe332bc412 59 2012/11/29 V1.1.0 by Lee Add support for MT9D111 sensor
dvddnr 8:89fe332bc412 60 2012/12/13 V1.2.0 by Lee Add support for OV7675 sensor
dvddnr 8:89fe332bc412 61 2012/12/28 V1.3.0 by Lee Add support for OV2640,OV3640,OV5642 sensors
dvddnr 8:89fe332bc412 62 2013/02/26 V2.0.0 by Lee New Rev.B shield hardware, add support for FIFO control
dvddnr 8:89fe332bc412 63 and support Mega1280/2560 boards
dvddnr 8:89fe332bc412 64 2013/05/28 V2.1.0 by Lee Add support all drawing functions derived from UTFT library
dvddnr 8:89fe332bc412 65 2013/08/24 V3.0.0 by Lee Support ArudCAM shield Rev.C hardware, features SPI interface and low power mode.
dvddnr 8:89fe332bc412 66 Support almost all series of Arduino boards including DUE.
dvddnr 8:89fe332bc412 67 2014/03/09 V3.1.0 by Lee Add the more impressive example sketches.
dvddnr 8:89fe332bc412 68 Optimise the OV5642 settings, improve image quality.
dvddnr 8:89fe332bc412 69 Add live preview before JPEG capture.
dvddnr 8:89fe332bc412 70 Add play back photos one by one after BMP capture.
dvddnr 8:89fe332bc412 71 2014/05/01 V3.1.1 by Lee Minor changes to add support Arduino IDE for linux distributions.
dvddnr 8:89fe332bc412 72 2014/09/30 V3.2.0 by Lee Improvement on OV5642 camera dirver.
dvddnr 8:89fe332bc412 73 2014/10/06 V3.3.0 by Lee Add OV7660,OV7725 camera support.
dvddnr 8:89fe332bc412 74 2015/02/27 V3.4.0 by Lee Add the support for Arduino Yun board, update the latest UTFT library for ArduCAM.
dvddnr 8:89fe332bc412 75 2015/06/09 V3.4.1 by Lee Minor changes and add some comments
dvddnr 8:89fe332bc412 76 2015/06/19 V3.4.2 by Lee Add support for MT9M112 camera.
dvddnr 8:89fe332bc412 77 2015/06/20 V3.4.3 by Lee Add support for MT9V111 camera.
dvddnr 8:89fe332bc412 78 2015/06/22 V3.4.4 by Lee Add support for OV5640 camera.
dvddnr 8:89fe332bc412 79 2015/06/22 V3.4.5 by Lee Add support for MT9M001 camera.
dvddnr 8:89fe332bc412 80 --------------------------------------*/
dvddnr 8:89fe332bc412 81
dvddnr 8:89fe332bc412 82 /*
dvddnr 8:89fe332bc412 83 Parts of this software is related to https://os.mbed.com/users/dflet/ work.
dvddnr 8:89fe332bc412 84 */
dvddnr 8:89fe332bc412 85
dvddnr 8:89fe332bc412 86
dvddnr 8:89fe332bc412 87 #pragma once
dvddnr 8:89fe332bc412 88
dvddnr 8:89fe332bc412 89 #include <mbed.h>
dvddnr 8:89fe332bc412 90 #include "arducam_regs.h"
dvddnr 8:89fe332bc412 91
dvddnr 8:89fe332bc412 92 /****************************************************/
dvddnr 8:89fe332bc412 93 /* Sensor related definition */
dvddnr 8:89fe332bc412 94 /****************************************************/
dvddnr 8:89fe332bc412 95 /****************************************************/
dvddnr 8:89fe332bc412 96 /* ArduChip related definition */
dvddnr 8:89fe332bc412 97 /****************************************************/
dvddnr 8:89fe332bc412 98 #define RWBIT 0x80 //READ AND WRITE BIT IS BIT[7]
dvddnr 8:89fe332bc412 99
dvddnr 8:89fe332bc412 100 #define ARDUCHIP_TEST1 0x00 //TEST register
dvddnr 8:89fe332bc412 101 #define ARDUCHIP_TEST2 0x01 //TEST register
dvddnr 8:89fe332bc412 102
dvddnr 8:89fe332bc412 103 #define ARDUCHIP_FRAMES 0x01 //Bit[2:0]Number of frames to be captured
dvddnr 8:89fe332bc412 104
dvddnr 8:89fe332bc412 105 #define ARDUCHIP_MODE 0x02 //Mode register
dvddnr 8:89fe332bc412 106 #define MCU2LCD_MODE 0x00
dvddnr 8:89fe332bc412 107 #define CAM2LCD_MODE 0x01
dvddnr 8:89fe332bc412 108 #define LCD2MCU_MODE 0x02
dvddnr 8:89fe332bc412 109
dvddnr 8:89fe332bc412 110 #define ARDUCHIP_TIM 0x03 //Timming control
dvddnr 8:89fe332bc412 111 #define HREF_LEVEL_MASK 0x01 //0 = High active , 1 = Low active
dvddnr 8:89fe332bc412 112 #define VSYNC_LEVEL_MASK 0x02 //0 = High active , 1 = Low active
dvddnr 8:89fe332bc412 113 #define LCD_BKEN_MASK 0x04 //0 = Enable, 1 = Disable
dvddnr 8:89fe332bc412 114 #define DELAY_MASK 0x08 //0 = no delay, 1 = delay one clock
dvddnr 8:89fe332bc412 115 #define MODE_MASK 0x10 //0 = LCD mode, 1 = FIFO mode
dvddnr 8:89fe332bc412 116 #define FIFO_PWRDN_MASK 0x20 //0 = Normal operation, 1 = FIFO power down
dvddnr 8:89fe332bc412 117 #define LOW_POWER_MODE 0x40 //0 = Normal mode, 1 = Low power mode
dvddnr 8:89fe332bc412 118
dvddnr 8:89fe332bc412 119 #define ARDUCHIP_FIFO 0x04 //FIFO and I2C control
dvddnr 8:89fe332bc412 120 #define FIFO_CLEAR_MASK 0x01
dvddnr 8:89fe332bc412 121 #define FIFO_START_MASK 0x02
dvddnr 8:89fe332bc412 122 #define FIFO_RDPTR_RST_MASK 0x10
dvddnr 8:89fe332bc412 123 #define FIFO_WRPTR_RST_MASK 0x20
dvddnr 8:89fe332bc412 124
dvddnr 8:89fe332bc412 125 #define ARDUCHIP_GPIO 0x06 //GPIO Write Register
dvddnr 8:89fe332bc412 126 #define GPIO_RESET_MASK 0x01 //0 = default state, 1 = Sensor reset IO value
dvddnr 8:89fe332bc412 127 #define GPIO_PWDN_MASK 0x02 //0 = Sensor power down IO value, 1 = Sensor power enable IO value
dvddnr 8:89fe332bc412 128
dvddnr 8:89fe332bc412 129 #define BURST_FIFO_READ 0x3C //Burst FIFO read operation
dvddnr 8:89fe332bc412 130 #define SINGLE_FIFO_READ 0x3D //Single FIFO read operation
dvddnr 8:89fe332bc412 131
dvddnr 8:89fe332bc412 132 #define ARDUCHIP_REV 0x40 //ArduCHIP revision
dvddnr 8:89fe332bc412 133 #define VER_LOW_MASK 0x3F
dvddnr 8:89fe332bc412 134 #define VER_HIGH_MASK 0xC0
dvddnr 8:89fe332bc412 135
dvddnr 8:89fe332bc412 136 #define ARDUCHIP_TRIG 0x41 //Trigger source
dvddnr 8:89fe332bc412 137 #define VSYNC_MASK 0x01
dvddnr 8:89fe332bc412 138 #define SHUTTER_MASK 0x02
dvddnr 8:89fe332bc412 139 #define CAP_DONE_MASK 0x08
dvddnr 8:89fe332bc412 140
dvddnr 8:89fe332bc412 141 #define FIFO_SIZE1 0x42 //Camera write FIFO size[7:0] for burst to read
dvddnr 8:89fe332bc412 142 #define FIFO_SIZE2 0x43 //Camera write FIFO size[15:8]
dvddnr 8:89fe332bc412 143 #define FIFO_SIZE3 0x44 //Camera write FIFO size[18:16]
dvddnr 8:89fe332bc412 144
dvddnr 8:89fe332bc412 145 #define OV2640_CHIPID_HIGH 0x0A
dvddnr 8:89fe332bc412 146 #define OV2640_CHIPID_LOW 0x0B
dvddnr 8:89fe332bc412 147 #define OV2640_CHIPID_HIGH_VALUE 0x26
dvddnr 8:89fe332bc412 148 #define OV2640_CHIPID_LOW_VALUE 0x42
dvddnr 8:89fe332bc412 149
dvddnr 8:89fe332bc412 150 /****************************************************/
dvddnr 8:89fe332bc412 151
dvddnr 8:89fe332bc412 152
dvddnr 8:89fe332bc412 153 #define OV_RESOLUTION_VGA 1
dvddnr 8:89fe332bc412 154 #define OV_RESOLUTION_QVGA 2
dvddnr 8:89fe332bc412 155 #define OV_RESOLUTION_CIF 3
dvddnr 8:89fe332bc412 156 #define OV_RESOLUTION_QQVGA 4
dvddnr 8:89fe332bc412 157
dvddnr 8:89fe332bc412 158 #define OV2640_I2C_ADDR_W 0x0060
dvddnr 8:89fe332bc412 159 #define OV2640_I2C_ADDR_R 0x0061
dvddnr 8:89fe332bc412 160
dvddnr 8:89fe332bc412 161 class ArduCAM2640
dvddnr 8:89fe332bc412 162 {
dvddnr 8:89fe332bc412 163 public:
dvddnr 8:89fe332bc412 164
dvddnr 8:89fe332bc412 165 // ctor dtor
dvddnr 8:89fe332bc412 166 ArduCAM2640(){};
dvddnr 8:89fe332bc412 167 ~ArduCAM2640(){};
dvddnr 8:89fe332bc412 168
dvddnr 8:89fe332bc412 169 // setup
dvddnr 8:89fe332bc412 170 bool Setup(int resolution,int jpeg_quality,DigitalOut *cam_cs, SPI *cam_spi, I2C *cam_i2c)
dvddnr 8:89fe332bc412 171 {
dvddnr 8:89fe332bc412 172 uint8_t vid = 0;
dvddnr 8:89fe332bc412 173 uint8_t pid = 0;
dvddnr 8:89fe332bc412 174 const struct sensor_reg8 *pivot;
dvddnr 8:89fe332bc412 175
dvddnr 8:89fe332bc412 176 _cam_cs = cam_cs;
dvddnr 8:89fe332bc412 177 _cam_spi = cam_spi;
dvddnr 8:89fe332bc412 178 _cam_i2c = cam_i2c;
dvddnr 8:89fe332bc412 179
dvddnr 8:89fe332bc412 180 _cam_spi->format(8,0);
dvddnr 8:89fe332bc412 181 _cam_spi->frequency(8000000);
dvddnr 8:89fe332bc412 182 _cam_i2c->frequency(100000);
dvddnr 8:89fe332bc412 183 *_cam_cs = 1;
dvddnr 8:89fe332bc412 184
dvddnr 8:89fe332bc412 185 /* check spi i2c */
dvddnr 8:89fe332bc412 186 wrSensorReg8_8(0xFF,0x01);
dvddnr 8:89fe332bc412 187 rdSensorReg8_8(OV2640_CHIPID_HIGH,&vid);
dvddnr 8:89fe332bc412 188 rdSensorReg8_8(OV2640_CHIPID_LOW,&pid);
dvddnr 8:89fe332bc412 189 if ((vid != OV2640_CHIPID_HIGH_VALUE) || (pid != OV2640_CHIPID_LOW_VALUE))
dvddnr 8:89fe332bc412 190 {
dvddnr 8:89fe332bc412 191 printf("Can't find OV2640 module! vid = 0x%x pid = 0x%x\r\n", vid, pid);
dvddnr 8:89fe332bc412 192 return false;
dvddnr 8:89fe332bc412 193 }
dvddnr 8:89fe332bc412 194
dvddnr 8:89fe332bc412 195 /* setup resolution and jpeg quality */
dvddnr 8:89fe332bc412 196 wrSensorReg8_8(0xFF,0x01);
dvddnr 8:89fe332bc412 197 wrSensorReg8_8(0x12,0x80);
dvddnr 8:89fe332bc412 198 wait_ms(200);
dvddnr 8:89fe332bc412 199
dvddnr 8:89fe332bc412 200 pivot = &OV2640_JPEG_INIT[0];
dvddnr 8:89fe332bc412 201 while(1)
dvddnr 8:89fe332bc412 202 {
dvddnr 8:89fe332bc412 203 if(pivot->reg == 0xff && pivot->val == 0xff) break;
dvddnr 8:89fe332bc412 204 // quality register
dvddnr 8:89fe332bc412 205 if(pivot->reg == 0x44)
dvddnr 8:89fe332bc412 206 {
dvddnr 8:89fe332bc412 207 wrSensorReg8_8(pivot->reg,(uint8_t)100-jpeg_quality);
dvddnr 8:89fe332bc412 208 }
dvddnr 8:89fe332bc412 209 else
dvddnr 8:89fe332bc412 210 wrSensorReg8_8(pivot->reg,pivot->val);
dvddnr 8:89fe332bc412 211 pivot++;
dvddnr 8:89fe332bc412 212 }
dvddnr 8:89fe332bc412 213
dvddnr 8:89fe332bc412 214 pivot = &OV2640_YUV422[0];
dvddnr 8:89fe332bc412 215 while(1)
dvddnr 8:89fe332bc412 216 {
dvddnr 8:89fe332bc412 217 if(pivot->reg == 0xff && pivot->val == 0xff) break;
dvddnr 8:89fe332bc412 218 wrSensorReg8_8(pivot->reg,pivot->val);
dvddnr 8:89fe332bc412 219 pivot++;
dvddnr 8:89fe332bc412 220 }
dvddnr 8:89fe332bc412 221
dvddnr 8:89fe332bc412 222 pivot = &OV2640_JPEG[0];
dvddnr 8:89fe332bc412 223 while(1)
dvddnr 8:89fe332bc412 224 {
dvddnr 8:89fe332bc412 225 if(pivot->reg == 0xff && pivot->val == 0xff) break;
dvddnr 8:89fe332bc412 226 wrSensorReg8_8(pivot->reg,pivot->val);
dvddnr 8:89fe332bc412 227 pivot++;
dvddnr 8:89fe332bc412 228 }
dvddnr 8:89fe332bc412 229
dvddnr 8:89fe332bc412 230 wrSensorReg8_8(0xFF,0x01);
dvddnr 8:89fe332bc412 231 wrSensorReg8_8(0x15,0x00);
dvddnr 8:89fe332bc412 232
dvddnr 8:89fe332bc412 233 switch(resolution)
dvddnr 8:89fe332bc412 234 {
dvddnr 8:89fe332bc412 235 case OV_RESOLUTION_VGA:
dvddnr 8:89fe332bc412 236 pivot = &OV2640_640x480_JPEG[0];
dvddnr 8:89fe332bc412 237 break;
dvddnr 8:89fe332bc412 238 case OV_RESOLUTION_QVGA:
dvddnr 8:89fe332bc412 239 pivot = &OV2640_320x240_JPEG[0];
dvddnr 8:89fe332bc412 240 break;
dvddnr 8:89fe332bc412 241 case OV_RESOLUTION_QQVGA:
dvddnr 8:89fe332bc412 242 pivot = &OV2640_160x120_JPEG[0];
dvddnr 8:89fe332bc412 243 break;
dvddnr 8:89fe332bc412 244 case OV_RESOLUTION_CIF:
dvddnr 8:89fe332bc412 245 pivot = &OV2640_352x288_JPEG[0];
dvddnr 8:89fe332bc412 246 break;
dvddnr 8:89fe332bc412 247 default:
dvddnr 8:89fe332bc412 248 printf("Wrong resolution\r\n");
dvddnr 8:89fe332bc412 249 return false;
dvddnr 8:89fe332bc412 250 };
dvddnr 8:89fe332bc412 251
dvddnr 8:89fe332bc412 252 while(1)
dvddnr 8:89fe332bc412 253 {
dvddnr 8:89fe332bc412 254 if(pivot->reg == 0xff && pivot->val == 0xff) break;
dvddnr 8:89fe332bc412 255 wrSensorReg8_8(pivot->reg,pivot->val);
dvddnr 8:89fe332bc412 256 pivot++;
dvddnr 8:89fe332bc412 257 }
dvddnr 8:89fe332bc412 258
dvddnr 8:89fe332bc412 259 wait_ms(2000);
dvddnr 8:89fe332bc412 260
dvddnr 8:89fe332bc412 261 return true;
dvddnr 8:89fe332bc412 262 };
dvddnr 8:89fe332bc412 263
dvddnr 8:89fe332bc412 264 uint32_t CaptureImage(uint8_t *image_buffer, uint32_t image_buffer_size,uint32_t *jpeg_start_index)
dvddnr 8:89fe332bc412 265 {
dvddnr 8:89fe332bc412 266 uint32_t fifolen = 0;
dvddnr 8:89fe332bc412 267 uint32_t jpeg_start,jpeg_end;
dvddnr 8:89fe332bc412 268
dvddnr 8:89fe332bc412 269 flush_fifo();
dvddnr 8:89fe332bc412 270 start_capture();
dvddnr 8:89fe332bc412 271 while (!(get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)))
dvddnr 8:89fe332bc412 272 {
dvddnr 8:89fe332bc412 273 wait_ms(30);
dvddnr 8:89fe332bc412 274 }
dvddnr 8:89fe332bc412 275
dvddnr 8:89fe332bc412 276 fifolen = read_fifo_length() + 2;
dvddnr 8:89fe332bc412 277 if(fifolen>image_buffer_size)
dvddnr 8:89fe332bc412 278 {
dvddnr 8:89fe332bc412 279 printf("Arducam::CaptureImage fifo_len %d exceeds image_buffer_size %d\r\n",fifolen,image_buffer_size);
dvddnr 8:89fe332bc412 280 return 0;
dvddnr 8:89fe332bc412 281 }
dvddnr 8:89fe332bc412 282 printf("fifo len %d\r\n",fifolen);
dvddnr 8:89fe332bc412 283
dvddnr 8:89fe332bc412 284 image_buffer[0]=BURST_FIFO_READ;
dvddnr 8:89fe332bc412 285 *_cam_cs = 0;
dvddnr 8:89fe332bc412 286 _cam_spi->write((char*)image_buffer,fifolen,(char*)image_buffer,fifolen);
dvddnr 8:89fe332bc412 287 *_cam_cs = 1;
dvddnr 8:89fe332bc412 288
dvddnr 8:89fe332bc412 289 jpeg_start = image_buffer_size;
dvddnr 8:89fe332bc412 290 jpeg_end = 0;
dvddnr 8:89fe332bc412 291 for(int i=0;i<fifolen-1;i++)
dvddnr 8:89fe332bc412 292 {
dvddnr 8:89fe332bc412 293 if(image_buffer[i] == 0xFF)
dvddnr 8:89fe332bc412 294 {
dvddnr 8:89fe332bc412 295 if(image_buffer[i+1] == 0xD8 && jpeg_start == image_buffer_size)
dvddnr 8:89fe332bc412 296 {
dvddnr 8:89fe332bc412 297 jpeg_start = i;
dvddnr 8:89fe332bc412 298 }
dvddnr 8:89fe332bc412 299 else if(image_buffer[i+1] == 0xD9 && jpeg_end == 0)
dvddnr 8:89fe332bc412 300 {
dvddnr 8:89fe332bc412 301 jpeg_end = i+1;
dvddnr 8:89fe332bc412 302 break;
dvddnr 8:89fe332bc412 303 }
dvddnr 8:89fe332bc412 304 }
dvddnr 8:89fe332bc412 305 }
dvddnr 8:89fe332bc412 306
dvddnr 8:89fe332bc412 307 if( jpeg_start != image_buffer_size && jpeg_end != 0 )
dvddnr 8:89fe332bc412 308 {
dvddnr 8:89fe332bc412 309 *jpeg_start_index = jpeg_start;
dvddnr 8:89fe332bc412 310 return (jpeg_end - jpeg_start + 1);
dvddnr 8:89fe332bc412 311 }
dvddnr 8:89fe332bc412 312
dvddnr 8:89fe332bc412 313 return 0;
dvddnr 8:89fe332bc412 314 };
dvddnr 8:89fe332bc412 315
dvddnr 8:89fe332bc412 316 private:
dvddnr 8:89fe332bc412 317 DigitalOut *_cam_cs;
dvddnr 8:89fe332bc412 318 SPI *_cam_spi;
dvddnr 8:89fe332bc412 319 I2C *_cam_i2c;
dvddnr 8:89fe332bc412 320
dvddnr 8:89fe332bc412 321 //Low level SPI write operation
dvddnr 8:89fe332bc412 322 int bus_write(int address, int value)
dvddnr 8:89fe332bc412 323 {
dvddnr 8:89fe332bc412 324 // take the SS pin low to select the chip:
dvddnr 8:89fe332bc412 325 *_cam_cs = 0;
dvddnr 8:89fe332bc412 326 // send in the address and value via SPI:
dvddnr 8:89fe332bc412 327 _cam_spi->write(address);
dvddnr 8:89fe332bc412 328 _cam_spi->write(value);
dvddnr 8:89fe332bc412 329 // take the SS pin high to de-select the chip:
dvddnr 8:89fe332bc412 330 *_cam_cs = 1;
dvddnr 8:89fe332bc412 331
dvddnr 8:89fe332bc412 332 return 0;
dvddnr 8:89fe332bc412 333 };
dvddnr 8:89fe332bc412 334
dvddnr 8:89fe332bc412 335 //Low level SPI read operation
dvddnr 8:89fe332bc412 336 uint8_t bus_read(int address)
dvddnr 8:89fe332bc412 337 {
dvddnr 8:89fe332bc412 338 uint8_t value = 0;
dvddnr 8:89fe332bc412 339 // take the SS pin low to select the chip:
dvddnr 8:89fe332bc412 340 *_cam_cs = 0;
dvddnr 8:89fe332bc412 341 // send in the address and value via SPI:
dvddnr 8:89fe332bc412 342 // printf("addr = 0x%x\r\n",address);
dvddnr 8:89fe332bc412 343 _cam_spi->write(address);
dvddnr 8:89fe332bc412 344 value = _cam_spi->write(0x00);
dvddnr 8:89fe332bc412 345 // take the SS pin high to de-select the chip:
dvddnr 8:89fe332bc412 346 *_cam_cs = 1;
dvddnr 8:89fe332bc412 347 return value;
dvddnr 8:89fe332bc412 348 };
dvddnr 8:89fe332bc412 349
dvddnr 8:89fe332bc412 350 //Write ArduChip internal registers
dvddnr 8:89fe332bc412 351 void write_reg(uint8_t addr, uint8_t data)
dvddnr 8:89fe332bc412 352 {
dvddnr 8:89fe332bc412 353 bus_write(addr | 0x80, data);
dvddnr 8:89fe332bc412 354 };
dvddnr 8:89fe332bc412 355
dvddnr 8:89fe332bc412 356 //Read ArduChip internal registers
dvddnr 8:89fe332bc412 357 uint8_t read_reg(uint8_t addr)
dvddnr 8:89fe332bc412 358 {
dvddnr 8:89fe332bc412 359 uint8_t data;
dvddnr 8:89fe332bc412 360 data = bus_read(addr);
dvddnr 8:89fe332bc412 361 return data;
dvddnr 8:89fe332bc412 362 };
dvddnr 8:89fe332bc412 363
dvddnr 8:89fe332bc412 364 //Reset the FIFO pointer to ZERO
dvddnr 8:89fe332bc412 365 void flush_fifo(void)
dvddnr 8:89fe332bc412 366 {
dvddnr 8:89fe332bc412 367 write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK);
dvddnr 8:89fe332bc412 368 };
dvddnr 8:89fe332bc412 369
dvddnr 8:89fe332bc412 370 //Send capture command
dvddnr 8:89fe332bc412 371 void start_capture(void)
dvddnr 8:89fe332bc412 372 {
dvddnr 8:89fe332bc412 373 write_reg(ARDUCHIP_FIFO, FIFO_START_MASK);
dvddnr 8:89fe332bc412 374 };
dvddnr 8:89fe332bc412 375
dvddnr 8:89fe332bc412 376 //Clear FIFO Complete flag
dvddnr 8:89fe332bc412 377 void clear_fifo_flag(void)
dvddnr 8:89fe332bc412 378 {
dvddnr 8:89fe332bc412 379 write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK);
dvddnr 8:89fe332bc412 380 };
dvddnr 8:89fe332bc412 381
dvddnr 8:89fe332bc412 382
dvddnr 8:89fe332bc412 383 //Read Write FIFO length
dvddnr 8:89fe332bc412 384 //Support ArduCAM Mini only
dvddnr 8:89fe332bc412 385 uint32_t read_fifo_length(void)
dvddnr 8:89fe332bc412 386 {
dvddnr 8:89fe332bc412 387 uint32_t len1,len2,len3=0;
dvddnr 8:89fe332bc412 388 uint32_t length=0;
dvddnr 8:89fe332bc412 389 len1 = read_reg(FIFO_SIZE1);
dvddnr 8:89fe332bc412 390 len2 = read_reg(FIFO_SIZE2);
dvddnr 8:89fe332bc412 391 len3 = read_reg(FIFO_SIZE3) & 0x07;
dvddnr 8:89fe332bc412 392 length = ((len3 << 16) | (len2 << 8) | len1);// & 0x07ffff;
dvddnr 8:89fe332bc412 393 return length;
dvddnr 8:89fe332bc412 394 };
dvddnr 8:89fe332bc412 395
dvddnr 8:89fe332bc412 396 //I2C Write 8bit address, 8bit data
dvddnr 8:89fe332bc412 397 uint8_t wrSensorReg8_8(int regID, int regDat)
dvddnr 8:89fe332bc412 398 {
dvddnr 8:89fe332bc412 399 uint8_t buff[2];
dvddnr 8:89fe332bc412 400 buff[0] = regID;
dvddnr 8:89fe332bc412 401 buff[1] = regDat;
dvddnr 8:89fe332bc412 402 _cam_i2c->write(OV2640_I2C_ADDR_W,(char*)buff,2);
dvddnr 8:89fe332bc412 403 return(1);
dvddnr 8:89fe332bc412 404 };
dvddnr 8:89fe332bc412 405
dvddnr 8:89fe332bc412 406 //I2C Read 8bit address, 8bit data
dvddnr 8:89fe332bc412 407 uint8_t rdSensorReg8_8(uint8_t regID, uint8_t* regDat)
dvddnr 8:89fe332bc412 408 {
dvddnr 8:89fe332bc412 409 _cam_i2c->write(OV2640_I2C_ADDR_W,(char*)&regID,1);
dvddnr 8:89fe332bc412 410 _cam_i2c->read(OV2640_I2C_ADDR_R,(char*)regDat,1);
dvddnr 8:89fe332bc412 411 return(1);
dvddnr 8:89fe332bc412 412 };
dvddnr 8:89fe332bc412 413
dvddnr 8:89fe332bc412 414 //Get corresponding bit status
dvddnr 8:89fe332bc412 415 uint8_t get_bit(uint8_t addr, uint8_t bit)
dvddnr 8:89fe332bc412 416 {
dvddnr 8:89fe332bc412 417 uint8_t temp;
dvddnr 8:89fe332bc412 418 temp = read_reg(addr);
dvddnr 8:89fe332bc412 419 temp = temp & bit;
dvddnr 8:89fe332bc412 420 return temp;
dvddnr 8:89fe332bc412 421 };
dvddnr 8:89fe332bc412 422
dvddnr 8:89fe332bc412 423 };
dvddnr 8:89fe332bc412 424