#include <stdio.h>
#include <stdlib.h>
#define STR "string_test"
struct inv_ixm42xxx_serif {
int (*read_reg)(struct inv_ixm42xxx_serif * serif, int reg, int * buf, int len);
int (*write_reg)(struct inv_ixm42xxx_serif * serif, int reg, const int * buf, int len);
int (*configure)(struct inv_ixm42xxx_serif * serif);
int max_read;
int max_write;
char str[20];
};
struct inv_ixm42xxx_transport {
char str[20];
int gr;
struct inv_ixm42xxx_serif *serif;//pointer
struct inv_ixm42xxx_serif serif1;//instance
};
static int iim_42652_read_reg(struct inv_ixm42xxx_serif *serif, int reg, int *buf, int len)
{
printf("read_reg test");
return 1;
}
static int iim_42652_write_reg(struct inv_ixm42xxx_serif *serif, int reg, const int *buf, int len)
{
printf("write_reg test");
return 2;
}
struct inv_ixm42xxx_serif my_serif = {
.read_reg = iim_42652_read_reg,
.write_reg = iim_42652_write_reg,
.max_read = 1,
.max_write = 2,
.str = STR,
};
//struct inv_ixm42xxx_serif *p_my_serif = &my_serif;
struct inv_ixm42xxx_transport trans_const = {
.str = STR,
.gr = 70,
.serif = &my_serif,
.serif1 = {
.read_reg = iim_42652_read_reg,
.write_reg = iim_42652_write_reg,
.max_read = 12,
.max_write = 23,
},
};
//struct inv_ixm42xxx_transport *p_g_trans = &trans_const;
struct inv_ixm42xxx_transport *get_inv_ixm42xxx_trans(struct inv_ixm42xxx_transport *p_trans)
{
return p_trans;
}
struct inv_ixm42xxx_serif *get_inv_ixm42xxx_serif(struct inv_ixm42xxx_transport *p_trans)
{
return p_trans->serif;
}
struct inv_ixm42xxx_serif *get_inv_ixm42xxx_serif1(struct inv_ixm42xxx_serif *p_serif)
{
return p_serif;
}
struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1(struct inv_ixm42xxx_transport *p_trans)
{
return p_trans->serif1;
}
static void p_func_run(struct inv_ixm42xxx_serif (*pfunc_run)(struct inv_ixm42xxx_serif *serif), struct inv_ixm42xxx_serif *serif_a)
{
pfunc_run(serif_a);
}
struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1_1(struct inv_ixm42xxx_serif *p_serif)
{
int ret = -1;
printf("p_func: serif->max_read = %d\n", p_serif->max_read);
printf("p_finc: serif->max_write = %d\n", p_serif->max_write);
printf("p_finc: serif->str = %s\n", p_serif->str);
return *p_serif;
}
#if 0
static void p_func_run(struct inv_ixm42xxx_serif *(*pfunc_run)(struct inv_ixm42xxx_transport *serif), struct inv_ixm42xxx_transport *trans_a)
{
pfunc_run(trans_a);
}
//struct nv_ixm42xxx_serif (*p_func_serif)(struct inv_ixm42xxx_serif *);
struct inv_ixm42xxx_serif get_inv_ixm42xxx_serif1_1_1(struct inv_ixm42xxx_serif *p_serif)
{
int ret = -1;
printf("p_func: serif->max_read = %d\n", p_serif->max_read);
printf("p_finc: serif->max_write = %d\n", p_serif->max_write);
return *p_serif;
}
#endif
int main()
{
struct inv_ixm42xxx_transport *trans;
struct inv_ixm42xxx_transport trans1;
struct inv_ixm42xxx_serif *serif;
struct inv_ixm42xxx_serif serif1;
int ret = 10;
int buf[2];
int i = 0;
struct inv_ixm42xxx_serif *(*_pfunc_run)(struct inv_ixm42xxx_serif *serif);//func pointer, and return struct pointer
i++;
//return pointer <*>
printf("%d\n", i++);
//trans = get_inv_ixm42xxx_trans(p_g_trans);
trans = get_inv_ixm42xxx_trans(&trans_const);
printf("trans->serif->max_read = %d\n", trans->serif->max_read);
printf("trans->serif->max_write = %d, trans->str = %s\n", trans->serif->max_write, trans->str);
ret = trans->serif->write_reg(serif, 32, buf, 1);
printf("ret = %d\n", ret);
printf("%d\n", i++);
//serif = get_inv_ixm42xxx_serif(p_g_trans);
serif = get_inv_ixm42xxx_serif(&trans_const);
printf("serif->max_read = %d\n", serif->max_read);
printf("serif->max_write = %d\n", serif->max_write);
ret = serif->read_reg(serif, 32, buf, 1);
printf("ret = %d\n", ret);
printf("%d\n", i++);
//serif = get_inv_ixm42xxx_serif1(p_my_serif);
serif = get_inv_ixm42xxx_serif1(&my_serif);
printf("serif->max_read = %d\n", serif->max_read);
printf("serif->max_write = %d\n", serif->max_write);
//return instance <struct xxx>
#if 1 //Usful for G-sensor
printf("%d\n", i++);
serif1 = get_inv_ixm42xxx_serif1_1(&trans_const);
//serif1 = get_inv_ixm42xxx_serif1_1(p_g_trans); //Test OK
printf("serif->max_read = %d\n", serif1.max_read);
printf("serif->max_write = %d\n", serif1.max_write);
ret = serif1.read_reg(&serif1, 32, buf, 1);
printf("ret = %d\n", ret);
#endif
#if 1
p_func_run(get_inv_ixm42xxx_serif1_1_1, &my_serif);
#endif
printf("test done\n");
return 0;
}
结构体常见操作
最新推荐文章于 2024-10-03 20:14:40 发布