#include <stdio.h>
#include <stdlib.h>
/******************************************************************************
* Header: isp_cam_flowctrl.h
*****************************************************************************/
struct isp_cam_flowctrl_init_param
{
/* ... */
};
struct isp_cam_flowctrl_init_param_dualcam
{
struct isp_cam_flowctrl_init_param base_param;
/* additional parameters */
int master_sensor_idx;
int slave_sensor_idx;
};
/* Interface of flow control */
struct isp_cam_flowctrl
{
/* APIs */
int (*init)(
struct isp_cam_flowctrl *self,
struct isp_cam_flowctrl_init_param *param
);
int (*uninit)(struct isp_cam_flowctrl *self);
int (*start)(struct isp_cam_flowctrl *self);
int (*stop)(struct isp_cam_flowctrl *self);
int (*get_sensor_id)(struct isp_cam_flowctrl *self);
void (*release)(struct isp_cam_flowctrl *self);
/* shared attributes */
int attr1;
int attr2;
};
/* Flow control factory */
extern struct isp_cam_flowctrl* create_singlecam_flow_control(
int sensor_id);
extern struct isp_cam_flowctrl* create_dualcam_flow_control(
int sensor_idx1, int sensor_idx2);
/******************************************************************************
* Implementation: isp_cam_flowctrl_singlecam.c
*****************************************************************************/
struct isp_cam_flowctrl_singlecam
{
struct isp_cam_flowctrl base;
/* */
int sensor_id;
};
static int _singlecam_init(
struct isp_cam_flowctrl *self,
struct isp_cam_flowctrl_init_param *param
)
{
printf("singlecam init \n");
return 0;
}
static int _singlecam_get_sensor_id(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_singlecam *p_self =
(struct isp_cam_flowctrl_singlecam*)(self);
return p_self->sensor_id;
}
static void _singlecam_release(struct isp_cam_flowctrl *self)
{
free((void*)self);
printf("isp_cam_flowctrl_singlecam has been released \n");
}
struct isp_cam_flowctrl* create_singlecam_flow_control(int sensor_id)
{
/* create instance */
struct isp_cam_flowctrl_singlecam *p_instance =
malloc(sizeof(struct isp_cam_flowctrl_singlecam));
/* link ops */
p_instance->base.init = _singlecam_init;
p_instance->base.uninit = NULL;
p_instance->base.start = NULL;
p_instance->base.stop = NULL;
p_instance->base.get_sensor_id = _singlecam_get_sensor_id;
p_instance->base.release = _singlecam_release;
p_instance->sensor_id = sensor_id;
return (struct isp_cam_flowctrl*)p_instance;
};
/******************************************************************************
* Implementation: isp_cam_flowctrl_dualcam.c
*****************************************************************************/
struct isp_cam_flowctrl_dualcam
{
struct isp_cam_flowctrl base;
/* */
int sensor_idx1;
int sensor_idx2;
char *cached_buf; /* two level buffers */
};
static int _dualcam_init(
struct isp_cam_flowctrl *self,
struct isp_cam_flowctrl_init_param *param
)
{
printf("dualcam init \n");
return 0;
}
static int _dualcam_get_sensor_id(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_dualcam *p_self =
(struct isp_cam_flowctrl_dualcam*)self;
return p_self->sensor_idx1;
}
static void _dualcam_release(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_dualcam *p_self =
(struct isp_cam_flowctrl_dualcam*)self;
/* release cached buffer first */
free(p_self->cached_buf);
/* release self */
free((void*)self);
printf("isp_cam_flowctrl_dualcam has been released \n");
}
struct isp_cam_flowctrl* create_dualcam_flow_control(
int sensor_idx1, int sensor_idx2)
{
/* create instance */
struct isp_cam_flowctrl_dualcam *p_instance =
malloc(sizeof(struct isp_cam_flowctrl_dualcam));
/* link ops */
p_instance->base.init = _dualcam_init;
p_instance->base.uninit = NULL;
p_instance->base.start = NULL;
p_instance->base.stop = NULL;
p_instance->base.get_sensor_id = _dualcam_get_sensor_id;
p_instance->base.release = _dualcam_release;
/* init attributes */
p_instance->sensor_idx1 = sensor_idx1;
p_instance->sensor_idx2 = sensor_idx2;
p_instance->cached_buf = malloc(128);
return (struct isp_cam_flowctrl*)p_instance;
}
/******************************************************************************
main.c, main.c didn't see any implementation detail from
isp_cam_flowctrl_singlecam.c and
isp_cam_flowctrl_dualcam.c.
******************************************************************************/
/* #include "isp_cam_flowctrl.h" */
int main(void) {
struct isp_cam_flowctrl *api1_flowctrl;
struct isp_cam_flowctrl *api2_flowctrl;
/* dynamic create related flow control */
api1_flowctrl = create_singlecam_flow_control(0);
api2_flowctrl = create_dualcam_flow_control(3, 5);
/* invoke APIs */
api1_flowctrl->init(api1_flowctrl, NULL);
api2_flowctrl->init(api2_flowctrl, NULL);
printf("single cam opened sensor id is: %d \n", api1_flowctrl->get_sensor_id(api1_flowctrl));
printf("dual cam opened sensor id is: %d \n", api2_flowctrl->get_sensor_id(api2_flowctrl));
/* virtual release */
api1_flowctrl->release(api1_flowctrl);
api2_flowctrl->release(api2_flowctrl);
api1_flowctrl = NULL;
api2_flowctrl = NULL;
return 0;
}