#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; /* Inheritance */
/* additional parameters */
int master_sensor_idx;
int slave_sensor_idx;
};
/* Interface of flow control (Abstration) */
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_main_sensor_idx)(struct isp_cam_flowctrl *self);
int (*get_sub_sensor_idx)(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 (Encapsulation)
*****************************************************************************/
struct isp_cam_flowctrl_singlecam
{
struct isp_cam_flowctrl base; /* Inheritance */
/* */
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_main_sensor_idx(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_singlecam *p_self =
(struct isp_cam_flowctrl_singlecam*)(self);
return p_self->sensor_id;
}
static int _singlecam_get_sub_sensor_idx(struct isp_cam_flowctrl *self)
{
printf("ERROR: singlecam has no sub sensor idx \n");
return -1;
}
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));
/* vtables */
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_main_sensor_idx = _singlecam_get_main_sensor_idx;
p_instance->base.get_sub_sensor_idx = _singlecam_get_sub_sensor_idx;
p_instance->base.release = _singlecam_release;
/* initialization */
p_instance->sensor_id = sensor_id;
return (struct isp_cam_flowctrl*)p_instance;
};
/******************************************************************************
* Implementation: isp_cam_flowctrl_dualcam.c (Encapsulation)
*****************************************************************************/
struct isp_cam_flowctrl_dualcam
{
struct isp_cam_flowctrl base; /* Inheritance */
/* */
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_main_sensor_idx(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_dualcam *p_self =
(struct isp_cam_flowctrl_dualcam*)self;
return p_self->sensor_idx1;
}
static int _dualcam_get_sub_sensor_idx(struct isp_cam_flowctrl *self)
{
struct isp_cam_flowctrl_dualcam *p_self =
(struct isp_cam_flowctrl_dualcam*)self;
return p_self->sensor_idx2;
}
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));
/* vtable */
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_main_sensor_idx = _dualcam_get_main_sensor_idx;
p_instance->base.get_sub_sensor_idx = _dualcam_get_sub_sensor_idx;
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); /* Polymorphism */
api2_flowctrl->init(api2_flowctrl, NULL); /* Polymorphism */
printf("single cam main sensor idx is: %d \n", api1_flowctrl->get_main_sensor_idx(api1_flowctrl));
printf("dual cam main sensor idx is: %d \n", api2_flowctrl->get_main_sensor_idx(api2_flowctrl));
printf("-----------\n");
printf("single cam sub sensor idx is: %d \n", api1_flowctrl->get_sub_sensor_idx(api1_flowctrl));
printf("dual cam sun sensor idx is: %d \n", api2_flowctrl->get_sub_sensor_idx(api2_flowctrl));
/* virtual release */
api1_flowctrl->release(api1_flowctrl);
api2_flowctrl->release(api2_flowctrl);
api1_flowctrl = NULL;
api2_flowctrl = NULL;
return 0;
}