Skip to content

File ArducamCamera.h

File List > includes-api > ArducamCamera.h

Go to the documentation of this file

/*
 * This file is part of the Arducam SPI Camera project.
 *
 * Copyright 2021 Arducam Technology co., Ltd. All Rights Reserved.
 *
 * This work is licensed under the MIT license, see the file LICENSE for
 * details.
 *
 */

#ifndef __ARDUCAM_H
#define __ARDUCAM_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif

#define TRUE 1
#define FALSE 0
// #ifndef Bool
// #define Bool char
// #endif
// typedef enum { FALSE = 0, TRUE = !FALSE } bool;


struct SdkDate {
    uint8_t year;
    uint8_t month;
    uint8_t day;
    uint16_t version;
} __attribute__((packed)); // 8bit align

union SdkInfo {
    uint8_t sdkVersion[5]; 
    struct SdkDate sdkInfo;
};

struct CameraInfo {
    char *cameraId;                 
    int supportResolution;          
    int supportSpecialEffects;      
    unsigned long exposureValueMax; 
    unsigned int exposureValueMin;  
    unsigned int gainValueMax;      
    unsigned int gainValueMin;      
    unsigned char supportFocus;     
    unsigned char supportSharpness; 
    unsigned char deviceAddress;
};

typedef enum {
    CAM_ERR_SUCCESS = 0,      
    CAM_ERR_NO_CALLBACK = -1, 
} CamStatus;

typedef enum {
    CAM_IMAGE_MODE_QQVGA = 0x00,   
    CAM_IMAGE_MODE_QVGA = 0x01,    
    CAM_IMAGE_MODE_VGA = 0x02,     
    CAM_IMAGE_MODE_SVGA = 0x03,    
    CAM_IMAGE_MODE_HD = 0x04,      
    CAM_IMAGE_MODE_SXGAM = 0x05,   
    CAM_IMAGE_MODE_UXGA = 0x06,    
    CAM_IMAGE_MODE_FHD = 0x07,     
    CAM_IMAGE_MODE_QXGA = 0x08,    
    CAM_IMAGE_MODE_WQXGA2 = 0x09,  
    CAM_IMAGE_MODE_96X96 = 0x0a,   
    CAM_IMAGE_MODE_128X128 = 0x0b, 
    CAM_IMAGE_MODE_320X320 = 0x0c, 
    CAM_IMAGE_MODE_12 = 0x0d, 
    CAM_IMAGE_MODE_13 = 0x0e, 
    CAM_IMAGE_MODE_14 = 0x0f, 
    CAM_IMAGE_MODE_15 = 0x10, 
    CAM_IMAGE_MODE_NONE,
} CAM_IMAGE_MODE;

typedef enum {
    CAM_CONTRAST_LEVEL_MINUS_3 = 6, 
    CAM_CONTRAST_LEVEL_MINUS_2 = 4, 
    CAM_CONTRAST_LEVEL_MINUS_1 = 2, 
    CAM_CONTRAST_LEVEL_DEFAULT = 0, 
    CAM_CONTRAST_LEVEL_1 = 1,       
    CAM_CONTRAST_LEVEL_2 = 3,       
    CAM_CONTRAST_LEVEL_3 = 5,       
} CAM_CONTRAST_LEVEL;

typedef enum {
    CAM_EV_LEVEL_MINUS_3 = 6, 
    CAM_EV_LEVEL_MINUS_2 = 4, 
    CAM_EV_LEVEL_MINUS_1 = 2, 
    CAM_EV_LEVEL_DEFAULT = 0, 
    CAM_EV_LEVEL_1 = 1,       
    CAM_EV_LEVEL_2 = 3,       
    CAM_EV_LEVEL_3 = 5,       
} CAM_EV_LEVEL;

typedef enum {
    CAM_STAURATION_LEVEL_MINUS_3 = 6, 
    CAM_STAURATION_LEVEL_MINUS_2 = 4, 
    CAM_STAURATION_LEVEL_MINUS_1 = 2, 
    CAM_STAURATION_LEVEL_DEFAULT = 0, 
    CAM_STAURATION_LEVEL_1 = 1,       
    CAM_STAURATION_LEVEL_2 = 3,       
    CAM_STAURATION_LEVEL_3 = 5,       
} CAM_STAURATION_LEVEL;

typedef enum {
    CAM_BRIGHTNESS_LEVEL_MINUS_4 = 8, 
    CAM_BRIGHTNESS_LEVEL_MINUS_3 = 6, 
    CAM_BRIGHTNESS_LEVEL_MINUS_2 = 4, 
    CAM_BRIGHTNESS_LEVEL_MINUS_1 = 2, 
    CAM_BRIGHTNESS_LEVEL_DEFAULT = 0, 
    CAM_BRIGHTNESS_LEVEL_1 = 1,       
    CAM_BRIGHTNESS_LEVEL_2 = 3,       
    CAM_BRIGHTNESS_LEVEL_3 = 5,       
    CAM_BRIGHTNESS_LEVEL_4 = 7,       
} CAM_BRIGHTNESS_LEVEL;

typedef enum {
    CAM_SHARPNESS_LEVEL_AUTO = 0, 
    CAM_SHARPNESS_LEVEL_1,        
    CAM_SHARPNESS_LEVEL_2,        
    CAM_SHARPNESS_LEVEL_3,        
    CAM_SHARPNESS_LEVEL_4,        
    CAM_SHARPNESS_LEVEL_5,        
    CAM_SHARPNESS_LEVEL_6,        
    CAM_SHARPNESS_LEVEL_7,        
    CAM_SHARPNESS_LEVEL_8,        
} CAM_SHARPNESS_LEVEL;

typedef enum {
    CAM_VIDEO_MODE_0 = 1, 
    CAM_VIDEO_MODE_1 = 2, 
} CAM_VIDEO_MODE;

typedef enum {
    CAM_IMAGE_PIX_FMT_RGB565 = 0x02, 
    CAM_IMAGE_PIX_FMT_JPG = 0x01,    
    CAM_IMAGE_PIX_FMT_YUV = 0x03,    
    CAM_IMAGE_PIX_FMT_NONE,          
} CAM_IMAGE_PIX_FMT;

typedef enum {
    CAM_WHITE_BALANCE_MODE_DEFAULT = 0, 
    CAM_WHITE_BALANCE_MODE_SUNNY,       
    CAM_WHITE_BALANCE_MODE_OFFICE,      
    CAM_WHITE_BALANCE_MODE_CLOUDY,      
    CAM_WHITE_BALANCE_MODE_HOME,        
} CAM_WHITE_BALANCE;

typedef enum {
    CAM_COLOR_FX_NONE = 0,      
    CAM_COLOR_FX_BLUEISH,       
    CAM_COLOR_FX_REDISH,        
    CAM_COLOR_FX_BW,            
    CAM_COLOR_FX_SEPIA,         
    CAM_COLOR_FX_NEGATIVE,      
    CAM_COLOR_FX_GRASS_GREEN,   
    CAM_COLOR_FX_OVER_EXPOSURE, 
    CAM_COLOR_FX_SOLARIZE,      
} CAM_COLOR_FX;

typedef enum {
    HIGH_QUALITY = 0,
    DEFAULT_QUALITY = 1,
    LOW_QUALITY = 2,
} IMAGE_QUALITY;

enum {
    SENSOR_5MP_1 = 0x81,
    SENSOR_3MP_1 = 0x82,
    SENSOR_5MP_2 = 0x83, /* 2592x1936 */
    SENSOR_3MP_2 = 0x84,
};

typedef uint8_t (*BUFFER_CALLBACK)(
    uint8_t *buffer, uint8_t lenght); 
typedef void (*STOP_HANDLE)(void);    
typedef struct {
    int csPin;               
    uint32_t totalLength;    
    uint32_t receivedLength; 
    uint8_t blockSize;       
    uint8_t cameraId;        
    // uint8_t cameraDataFormat;                       /**< The currently set image pixel format */
    uint8_t burstFirstFlag;         
    uint8_t previewMode;            
    uint8_t currentPixelFormat;     
    uint8_t currentPictureMode;     
    struct CameraInfo myCameraInfo; 
    const struct CameraOperations *arducamCameraOp; 
    BUFFER_CALLBACK callBackFunction;               
    STOP_HANDLE handle;
    uint8_t verDateAndNumber[4]; 
    union SdkInfo *currentSDK;   
} ArducamCamera;

struct CameraOperations {
    CamStatus (*reset)(ArducamCamera *);
    CamStatus (*begin)(ArducamCamera *);
    CamStatus (*takePicture)(ArducamCamera *, CAM_IMAGE_MODE, CAM_IMAGE_PIX_FMT);
    CamStatus (*takeMultiPictures)(ArducamCamera *, CAM_IMAGE_MODE, CAM_IMAGE_PIX_FMT, uint8_t);
    CamStatus (*startPreview)(ArducamCamera *, CAM_VIDEO_MODE);
    void (*captureThread)(ArducamCamera *);
    CamStatus (*stopPreview)(ArducamCamera *);
    CamStatus (*setAutoExposure)(ArducamCamera *, uint8_t);
    CamStatus (*setAbsoluteExposure)(ArducamCamera *, uint32_t);
    CamStatus (*setAutoISOSensitive)(ArducamCamera *, uint8_t);
    CamStatus (*setISOSensitivity)(ArducamCamera *, int);
    CamStatus (*setAutoWhiteBalance)(ArducamCamera *, uint8_t);
    CamStatus (*setAutoWhiteBalanceMode)(ArducamCamera *, CAM_WHITE_BALANCE);
    CamStatus (*setColorEffect)(ArducamCamera *, CAM_COLOR_FX);
    CamStatus (*setAutoFocus)(ArducamCamera *, uint8_t);
    uint8_t (*getAutoFocusSta)(ArducamCamera *);
    CamStatus (*setManualFocus)(ArducamCamera *, uint16_t);
    CamStatus (*setSaturation)(ArducamCamera *, CAM_STAURATION_LEVEL);
    CamStatus (*setEV)(ArducamCamera *, CAM_EV_LEVEL);
    CamStatus (*setContrast)(ArducamCamera *, CAM_CONTRAST_LEVEL);
    CamStatus (*setBrightness)(ArducamCamera *, CAM_BRIGHTNESS_LEVEL);
    CamStatus (*setSharpness)(ArducamCamera *, CAM_SHARPNESS_LEVEL);
    CamStatus (*setImageQuality)(ArducamCamera *camera, IMAGE_QUALITY qualtiy);
    uint32_t (*imageAvailable)(ArducamCamera *);
    void (*csHigh)(ArducamCamera *);
    void (*csLow)(ArducamCamera *);
    uint32_t (*readBuff)(ArducamCamera *, uint8_t *, uint32_t);
    uint8_t (*readByte)(ArducamCamera *);
    void (*debugWriteRegister)(ArducamCamera *, uint8_t *);
    void (*writeReg)(ArducamCamera *, uint8_t, uint8_t);
    uint8_t (*readReg)(ArducamCamera *, uint8_t);
    uint8_t (*busRead)(ArducamCamera *, int);
    uint8_t (*busWrite)(ArducamCamera *, int, int);
    void (*flushFifo)(ArducamCamera *);
    void (*startCapture)(ArducamCamera *);
    void (*clearFifoFlag)(ArducamCamera *);
    uint32_t (*readFifoLength)(ArducamCamera *);
    uint8_t (*getBit)(ArducamCamera *, uint8_t, uint8_t);
    void (*setFifoBurst)(ArducamCamera *);
    void (*setCapture)(ArducamCamera *);
    uint32_t (*waitI2cIdle)(ArducamCamera *);
    void (*lowPowerOn)(ArducamCamera *);
    void (*lowPowerOff)(ArducamCamera *);
    void (*registerCallback)(ArducamCamera *, BUFFER_CALLBACK, uint8_t, STOP_HANDLE);
};


//**********************************************
//**********************************************
ArducamCamera createArducamCamera(int cs);

//**********************************************
//**********************************************
CamStatus reset(ArducamCamera *camera);

//**********************************************
//**********************************************

CamStatus begin(ArducamCamera *camera);

//**********************************************
CamStatus takePicture(ArducamCamera *camera, CAM_IMAGE_MODE mode, CAM_IMAGE_PIX_FMT pixel_format);

//**********************************************
//**********************************************
CamStatus takeMultiPictures(
    ArducamCamera *camera, CAM_IMAGE_MODE mode, CAM_IMAGE_PIX_FMT pixel_format, uint8_t number);

//**********************************************
//**********************************************
CamStatus startPreview(ArducamCamera *camera, CAM_VIDEO_MODE mode);

void captureThread(ArducamCamera *camera);

//**********************************************
//**********************************************
CamStatus stopPreview(ArducamCamera *camera);

//**********************************************
//**********************************************
CamStatus setAutoExposure(ArducamCamera *camera, uint8_t val);

//**********************************************
//**********************************************
CamStatus setAbsoluteExposure(ArducamCamera *camera, uint32_t val);

//**********************************************
//**********************************************
CamStatus setAutoISOSensitive(ArducamCamera *camera, uint8_t val);

//**********************************************
//**********************************************
CamStatus setISOSensitivity(ArducamCamera *camera, int iso_sense);

//**********************************************
//**********************************************
CamStatus setAutoWhiteBalance(ArducamCamera *camera, uint8_t val);

//**********************************************
//**********************************************
CamStatus setAutoWhiteBalanceMode(ArducamCamera *camera, CAM_WHITE_BALANCE mode);

//**********************************************
//**********************************************
CamStatus setColorEffect(ArducamCamera *camera, CAM_COLOR_FX effect);

//**********************************************
//**********************************************
CamStatus setAutoFocus(ArducamCamera *camera, uint8_t val);

//**********************************************
//**********************************************
uint8_t getAutoFocusSta(ArducamCamera *camera);

//**********************************************
//**********************************************
CamStatus setManualFocus(ArducamCamera *camera, uint16_t val);

//**********************************************
//**********************************************
CamStatus setSaturation(ArducamCamera *camera, CAM_STAURATION_LEVEL level);

//**********************************************
//**********************************************
CamStatus setEV(ArducamCamera *camera, CAM_EV_LEVEL level);

//**********************************************
//********************************************
CamStatus setContrast(ArducamCamera *camera, CAM_CONTRAST_LEVEL level);

//**********************************************
//**********************************************
CamStatus setBrightness(ArducamCamera *camera, CAM_BRIGHTNESS_LEVEL level);

//**********************************************
//**********************************************
CamStatus setSharpness(ArducamCamera *camera, CAM_SHARPNESS_LEVEL level);

//**********************************************
//**********************************************
CamStatus setImageQuality(ArducamCamera *camera, IMAGE_QUALITY qualtiy);

//**********************************************
//**********************************************
uint32_t readBuff(ArducamCamera *camera, uint8_t *buff, uint32_t length);

//**********************************************
//**********************************************
uint8_t readByte(ArducamCamera *camera);

//**********************************************
//**********************************************
void debugWriteRegister(ArducamCamera *camera, uint8_t *buff);

//**********************************************
//**********************************************
void registerCallback(
    ArducamCamera *camera, BUFFER_CALLBACK function, uint8_t blockSize, STOP_HANDLE handle);

//**********************************************
//**********************************************
void lowPowerOn(ArducamCamera *camera);

//**********************************************
//**********************************************
void lowPowerOff(ArducamCamera *camera);

//**********************************************
//**********************************************
uint8_t cameraHeartBeat(ArducamCamera *camera);

typedef enum { Camera_uninit = 0, Camera_init, Camera_open, Camera_close } CameraStatus;

struct ClassCamera {
    ArducamCamera cam;
    CameraStatus status;
};

uint8_t cameraReadReg(ArducamCamera *camera, uint8_t addr);
uint32_t cameraImageAvailable(ArducamCamera *camera);
uint32_t cameraReadFifoLength(ArducamCamera *camera);
uint8_t getBit(ArducamCamera *camera, uint8_t addr, uint8_t bit);
void writeReg(ArducamCamera *camera, uint8_t addr, uint8_t val);
uint32_t waitI2cIdle(ArducamCamera *camera);
void clearFifoFlag(ArducamCamera *camera);
void startCapture(ArducamCamera *camera);

#ifdef __cplusplus
}
#endif
#endif /*__ARDUCAM_H*/