1 #include "sensor_static_calibrate.h"
2 
3 #define DST_X 0
4 #define DST_Y 1
5 #define DST_Z 2
6 #define SRC_X 0
7 #define SRC_Y 0
8 #define SRC_Z 0
9 #define MAX_SRNSOR_NUM 10
10 
11 typedef struct _dev_3axis_data_t
12 {
13     uint64_t timestamp;
14     int32_t  data[3];
15 }dev_3axis_data_t;
16 
17 typedef struct _dev_1axis_data_t
18 {
19     uint64_t timestamp;
20     int32_t  data;
21 }dev_1axis_data_t;
22 
23 typedef struct _sensor_1axis_para_t
24 {
25     int offset;
26 }sensor_1axis_para_t;
27 
28 typedef struct _sensor_3axis_para_t
29 {
30     int remap_x_coeff;
31     int remap_y_coeff;
32     int remap_z_coeff;
33     int offset;
34 }sensor_3axis_para_t;
35 
36 typedef struct _sensor_static_obj_t
37 {
38     int in_use;
39     sensor_tag_e tag;
40     int sensor_index;
41     int axis;
42     void* para;
43 }sensor_static_obj_t;
44 
45 sensor_static_obj_t g_sensor_static_para[MAX_SRNSOR_NUM] =  {0};
46 
47 
48 sensor_3axis_para_t default_3axis_para[] ={
49 1,   0,  0,        0,
50 0,   1,  0,        0,
51 0,   0,  1,        0,
52 };
53 
54 sensor_1axis_para_t default_1axis_para ={0};
55 
findindex(sensor_tag_e tag,int index)56 int findindex(sensor_tag_e tag ,int index)
57 {
58 }
59 
sensor_static_calibrate_3axis_default(void * buf)60 void sensor_static_calibrate_3axis_default(void *buf)
61 {
62     dev_3axis_data_t* pdata=(dev_3axis_data_t*)buf;
63     dev_3axis_data_t datatmp;
64     memcpy(&datatmp,pdata,sizeof(dev_3axis_data_t));
65 
66     pdata->data[DST_X] = datatmp.data[SRC_X]* default_3axis_para[DST_X].remap_x_coeff ;
67     pdata->data[DST_X] += datatmp.data[SRC_Y]* default_3axis_para[DST_X].remap_y_coeff;
68     pdata->data[DST_X] += datatmp.data[SRC_Z]* default_3axis_para[DST_X].remap_z_coeff;
69     pdata->data[DST_X] += default_3axis_para[DST_X].offset;
70 
71     pdata->data[DST_Y] = datatmp.data[SRC_X]* default_3axis_para[DST_Y].remap_x_coeff;
72     pdata->data[DST_Y] += datatmp.data[SRC_Y]* default_3axis_para[DST_Y].remap_y_coeff;
73     pdata->data[DST_Y] += datatmp.data[SRC_Z]* default_3axis_para[DST_Y].remap_z_coeff;
74     pdata->data[DST_Y] += default_3axis_para[DST_Y].offset;
75 
76     pdata->data[DST_Z] = datatmp.data[SRC_X]* default_3axis_para[DST_Z].remap_x_coeff ;
77     pdata->data[DST_Z] += datatmp.data[SRC_Y]* default_3axis_para[DST_Z].remap_y_coeff;
78     pdata->data[DST_Z] += datatmp.data[SRC_Z]* default_3axis_para[DST_Z].remap_z_coeff;
79     pdata->data[DST_Z] += default_3axis_para[DST_Z].offset;
80 }
81 
82 
sensor_static_calibrate_3axis(void * buf,void * para)83 void sensor_static_calibrate_3axis(void *buf,void* para)
84 {
85     dev_3axis_data_t* pdata=(dev_3axis_data_t*)buf;
86     dev_3axis_data_t datatmp;
87     sensor_3axis_para_t* ppara=(sensor_3axis_para_t*)para;
88     memcpy(&datatmp,pdata,sizeof(dev_3axis_data_t));
89 
90     pdata->data[DST_X] = datatmp.data[SRC_X]* ppara->remap_x_coeff ;
91     pdata->data[DST_X] += datatmp.data[SRC_Y]* ppara->remap_y_coeff;
92     pdata->data[DST_X] += datatmp.data[SRC_Z]* ppara->remap_z_coeff;
93     pdata->data[DST_X] += ppara->offset;
94     ppara++;
95 
96     pdata->data[DST_Y] = datatmp.data[SRC_X]* ppara->remap_x_coeff;
97     pdata->data[DST_Y] += datatmp.data[SRC_Y]* ppara->remap_y_coeff;
98     pdata->data[DST_Y] += datatmp.data[SRC_Z]* ppara->remap_z_coeff;
99     pdata->data[DST_Y] += ppara->offset;
100     ppara++;
101 
102     pdata->data[DST_Z] = datatmp.data[SRC_X]* ppara->remap_x_coeff ;
103     pdata->data[DST_Z] += datatmp.data[SRC_Y]* ppara->remap_y_coeff;
104     pdata->data[DST_Z] += datatmp.data[SRC_Z]* ppara->remap_z_coeff;
105     pdata->data[DST_Z] += ppara->offset;
106 }
107 
sensor_static_calibrate_1axis_default(void * buf)108 void sensor_static_calibrate_1axis_default(void *buf)
109 {
110     dev_1axis_data_t* pdata=(dev_1axis_data_t*)buf;
111     pdata->data += default_1axis_para.offset;
112 }
113 
sensor_static_calibrate_1axis(void * buf,void * para)114 void sensor_static_calibrate_1axis(void *buf,void* para)
115 {
116     dev_1axis_data_t* pdata=(dev_1axis_data_t*)buf;
117     sensor_1axis_para_t* ppara=(sensor_1axis_para_t*)para;
118     pdata->data += ppara->offset;
119 }
120 
sensor_static_calibrate_acc_default(int sensor_index,int axis,void * buf)121 ssize_t sensor_static_calibrate_acc_default(int sensor_index, int axis,void* buf)
122 {
123     if(axis == 3)
124     {
125         sensor_static_calibrate_3axis_default(buf);
126     }
127     else if(axis == 1)
128     {
129         sensor_static_calibrate_1axis_default(buf);
130     }
131     else
132     {
133         return -1;
134     }
135 
136     return 0;
137 }
138 
139 
sensor_static_calibrate_acc(int axis,void * buf,void * para)140 ssize_t sensor_static_calibrate_acc(int axis, void *buf,void* para)
141 {
142     if(axis == 3)
143     {
144         sensor_static_calibrate_3axis(buf,para);
145     }
146     else if(axis == 1)
147     {
148         sensor_static_calibrate_1axis(buf,para);
149     }
150     else
151     {
152         return -1;
153     }
154 
155     return 0;
156 }
157 /*
158 int sensor_static_calibrate(int axis, void *buf,void *para)
159 {
160     int ret =-1;
161     if(buf == NULL||para == NULL) return -1;
162     if(tag == TAG_DEV_ACC)
163     {
164         ret = sensor_static_calibrate_acc(axis,buf,para);
165     }
166     else
167     {
168     }
169     return ret;
170 }
171 */
find_empty_obj()172 int find_empty_obj()
173 {
174     for(int i = 0;i < MAX_SRNSOR_NUM; i++)
175     {
176         if(g_sensor_static_para[i].in_use==0)
177             return i;
178     }
179     return -1;
180 }
181 
sensor_obj_init_para(sensor_tag_e tag,int sensor_index,int axis,void * para)182 int sensor_obj_init_para(sensor_tag_e tag,int sensor_index,int axis,void* para)
183 {
184     int index = find_empty_obj();
185     if(index < 0) return -1;
186     g_sensor_static_para[index].sensor_index = sensor_index;
187     g_sensor_static_para[index].tag = tag;
188     g_sensor_static_para[index].para = para;
189     g_sensor_static_para[index].axis = axis;
190     g_sensor_static_para[index].in_use = 1;
191     return 0;
192 }
193 
find_sensor_index(sensor_tag_e tag,int sensor_index,int axis)194 int find_sensor_index(sensor_tag_e tag,int sensor_index,int axis)
195 {
196     for(int i = 0;i < MAX_SRNSOR_NUM; i++)
197     {
198         if(g_sensor_static_para[i].tag==tag
199             &&g_sensor_static_para[i].sensor_index==sensor_index
200             &&g_sensor_static_para[i].axis == axis
201             &&g_sensor_static_para[i].in_use == 1
202             &&g_sensor_static_para[i].para != NULL)
203             return i;
204     }
205     return -1;
206 }
207 
sensor_calibrate_entry(sensor_tag_e tag,int sensor_index,int axis,void * buf)208 int sensor_calibrate_entry(sensor_tag_e tag,int sensor_index,int axis, void *buf)
209 {
210     int ret = 0;
211     if(buf == NULL) return -1;
212     int index = find_sensor_index(tag,sensor_index,axis);
213     if(index < 0) return -1;
214 
215     if(tag == TAG_DEV_ACC)
216     {
217         ret = sensor_static_calibrate_acc(axis,buf,g_sensor_static_para[index].para);
218     }
219     else
220     {
221         return -1;
222     }
223     return ret;
224 }
225 
sensor_calibrate_entry_default(sensor_tag_e tag,int sensor_index,int axis,void * buf)226 int sensor_calibrate_entry_default(sensor_tag_e tag,int sensor_index,int axis, void *buf)
227 {
228     int ret = 0;
229     if(buf == NULL) return -1;
230 
231     if(tag == TAG_DEV_ACC)
232     {
233         ret = sensor_static_calibrate_acc_default(sensor_index,axis,buf);
234     }
235     else
236     {
237         return -1;
238     }
239     return ret;
240 }
241 
242 
243