OOC Example

Run Settings
LanguageC
Language Version
Run Command
#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; }
Editor Settings
Theme
Key bindings
Full width
Lines