1 /* 2 * Author: Jon Trulson <jtrulson@ics.com> 3 * Copyright (c) 2015 Intel Corporation. 4 * 5 * Thanks to Seeed Studio for a working arduino sketch 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining 8 * a copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sublicense, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be 16 * included in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 #pragma once 27 28 #include <string> 29 #include <iostream> 30 31 #include <stdint.h> 32 #include <stdlib.h> 33 #include <unistd.h> 34 #include <string.h> 35 #include <fcntl.h> 36 #include <errno.h> 37 #include <termios.h> 38 #include <sys/time.h> 39 #include <sys/select.h> 40 #include <sys/types.h> 41 #include <sys/stat.h> 42 43 #include <mraa/uart.h> 44 45 #define GROVESCAM_DEFAULT_UART 0 46 47 #define GROVESCAM_DEFAULT_CAMERA_ADDR 0 48 49 namespace upm { 50 /** 51 * @brief Grove Serial Camera library 52 * @defgroup grovescam libupm-grovescam 53 * @ingroup seeed uart other 54 */ 55 56 /** 57 * @library grovescam 58 * @sensor grovescam 59 * @comname Grove Serial Camera 60 * @type other 61 * @man seeed 62 * @con uart 63 * @web http://www.seeedstudio.com/wiki/Grove_-_Serial_Camera_Kit 64 * 65 * @brief API for the Grove Serial Camera 66 * 67 * The driver was tested with the Grove Serial Camera. There is 68 * no protocol documentation currently available, so this module 69 * was developed based completely on the Seeed Studio* Arduino* 70 * sketch. 71 * 72 * It is connected via a UART at 115,200 baud. 73 * 74 * @image html grovescam.jpg 75 * @snippet grovescam.cxx Interesting 76 */ 77 78 class GROVESCAM { 79 public: 80 81 static const unsigned int MAX_PKT_LEN = 128; 82 83 typedef enum { 84 FORMAT_VGA = 7, // 640x480 85 FORMAT_CIF = 5, // 352×288 86 FORMAT_OCIF = 3 // ??? (maybe they meant QCIF?) 87 } PIC_FORMATS_T; 88 89 /** 90 * Grove Serial Camera constructor 91 * 92 * @param uart Default UART to use (0 or 1) 93 * @param camAddr 3-bit address identifier of the camera; default is 0 94 */ 95 GROVESCAM(int uart, uint8_t camAddr=GROVESCAM_DEFAULT_CAMERA_ADDR); 96 97 /** 98 * GROVESCAM destructor 99 */ 100 ~GROVESCAM(); 101 102 /** 103 * Checks to see if there is data available for reading 104 * 105 * @param millis Number of milliseconds to wait; 0 means no waiting. 106 * @return True if there is data available for reading 107 */ 108 bool dataAvailable(unsigned int millis); 109 110 /** 111 * Reads any available data into a user-supplied buffer. Note: the 112 * call blocks until data is available to be read. Use 113 * dataAvailable() to determine whether there is data available 114 * beforehand, to avoid blocking. 115 * 116 * @param buffer Buffer to hold the data read 117 * @param len Length of the buffer 118 * @return Number of bytes read 119 */ 120 int readData(uint8_t *buffer, int len); 121 122 /** 123 * Writes the data in the buffer to the device 124 * 125 * @param buffer Buffer to hold the data read 126 * @param len Length of the buffer 127 * @return Number of bytes written 128 */ 129 int writeData(uint8_t *buffer, int len); 130 131 /** 132 * Sets up proper tty I/O modes and the baud rate. For this device, the default 133 * baud rate is 9,600 (B9600). 134 * 135 * @param baud Desired baud rate 136 * @return True if successful 137 */ 138 bool setupTty(speed_t baud=B115200); 139 140 /** 141 * Reads serial input and discards until no more characters are available 142 * 143 */ 144 void drainInput(); 145 146 /** 147 * Initializes the camera 148 * 149 */ 150 bool init(); 151 152 /** 153 * Tells the camera to prepare for a capture 154 * 155 * @param fmt One of the PIC_FORMATS_T values 156 */ 157 bool preCapture(PIC_FORMATS_T fmt=FORMAT_VGA); 158 159 /** 160 * Starts the capture 161 * 162 * @return True if successful 163 */ 164 bool doCapture(); 165 166 /** 167 * Stores the captured image in a file 168 * 169 * @param fname Name of the file to write 170 * @return True if successful 171 */ 172 bool storeImage(const char *fname); 173 174 /** 175 * Returns the picture length. Note: this is only valid after 176 * doCapture() has run successfully. 177 * 178 * @return Image length 179 */ getImageSize()180 int getImageSize() { return m_picTotalLen; }; 181 182 protected: ttyFd()183 int ttyFd() { return m_ttyFd; }; 184 185 private: 186 mraa_uart_context m_uart; 187 int m_ttyFd; 188 189 uint8_t m_camAddr; 190 int m_picTotalLen; 191 }; 192 } 193 194 195