FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/services/dar/dar_msg_ft.c @ 305:4dccc9d3305f
gsm-fw: checking in DAR from Leonardo source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 16 Mar 2014 05:48:58 +0000 |
parents | |
children | a7087f91c752 |
comparison
equal
deleted
inserted
replaced
304:e0ca3ca46a06 | 305:4dccc9d3305f |
---|---|
1 /****************************************************************************/ | |
2 /* */ | |
3 /* File Name: dar_msg_ft.c */ | |
4 /* */ | |
5 /* Purpose: This function is called when the DAR entity receives a new */ | |
6 /* message in its mailbox and wants to process the message. */ | |
7 /* */ | |
8 /* */ | |
9 /* Version 0.1 */ | |
10 /* */ | |
11 /* Date Modification */ | |
12 /* ------------------------------------ */ | |
13 /* 17 October 2001 Create */ | |
14 /* */ | |
15 /* Author Stephanie Gerthoux */ | |
16 /* */ | |
17 /* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/ | |
18 /****************************************************************************/ | |
19 | |
20 #include "rv/rv_defined_swe.h" | |
21 #ifdef RVM_DAR_SWE | |
22 #ifndef _WINDOWS | |
23 #include "config/swconfig.cfg" | |
24 #include "config/sys.cfg" | |
25 #include "config/chipset.cfg" | |
26 #endif | |
27 | |
28 #include <string.h> | |
29 #include "rvm/rvm_gen.h" | |
30 #include "dar/dar_api.h" | |
31 #include "dar/dar_macro_i.h" | |
32 #include "dar/dar_messages_i.h" | |
33 #include "dar/dar_const_i.h" | |
34 #include "dar/dar_diagnose_i.h" | |
35 #include "dar/dar_error_hdlr_i.h" | |
36 | |
37 #ifndef _WINDOWS | |
38 #include "timer/timer.h" | |
39 #endif | |
40 | |
41 /**** Global variable ****/ | |
42 /* index used in the circular buffer*/ | |
43 UINT16 dar_current_index = 0; | |
44 /* Write buffer*/ | |
45 extern char dar_write_buffer[DAR_MAX_BUFFER_SIZE]; | |
46 | |
47 /* Get the dar_current status */ | |
48 extern T_DAR_RECOVERY_STATUS dar_current_status; | |
49 | |
50 /* Define a pointer to the Global Environment Control block */ | |
51 extern T_DAR_ENV_CTRL_BLK *dar_gbl_var_p; | |
52 | |
53 /* Define the recovery buffer */ | |
54 extern UINT8 dar_recovery_buffer[DAR_RECOVERY_DATA_MAX_BUFFER_SIZE]; | |
55 | |
56 /**** Extern functions ****/ | |
57 extern void * dar_read_mbox (UINT8 mbox); | |
58 | |
59 extern void exception(void); | |
60 | |
61 /********************************************************************************/ | |
62 /* Function dar_filter_request */ | |
63 /* */ | |
64 /* Description This function checks if the use_id group_nb exists: */ | |
65 /* - if the group_nb exists, it adds the warning and debug */ | |
66 /* masks in the dar_array_filter */ | |
67 /* - otherwise, this function add the new group_nb and the */ | |
68 /* masks in the dar_array_filter */ | |
69 /* */ | |
70 /********************************************************************************/ | |
71 | |
72 T_RV_RET dar_filter_request (T_DAR_FILTER_START *msg_p) | |
73 { | |
74 /* Declare local variables*/ | |
75 UINT8 index = 0; | |
76 | |
77 /* check if the DAR entity is started */ | |
78 if (dar_gbl_var_p == NULL ) | |
79 { | |
80 dar_error_trace(DAR_ENTITY_NOT_START); | |
81 return(RV_NOT_READY); | |
82 } | |
83 | |
84 /*** check if the group exists ****/ | |
85 /* If the group exists... */ | |
86 if(dar_search_group(msg_p->use_msg_parameter.group_nb,&index)== RV_OK) | |
87 { | |
88 /* Check the Dar level */ | |
89 switch(msg_p->use_msg_parameter.level) | |
90 { | |
91 case DAR_WARNING: | |
92 { /* The DAR entity wants to process Warning messages */ | |
93 /* add the mask_warning in the dar_filter array */ | |
94 dar_gbl_var_p ->dar_filter_array[index].mask_warning |= | |
95 msg_p->use_msg_parameter.mask; | |
96 dar_gbl_var_p ->dar_filter_array[index].mask_debug = 0x00; | |
97 | |
98 break; | |
99 } | |
100 | |
101 case DAR_DEBUG: | |
102 { | |
103 /* The DAR entity wants to process Debug messages */ | |
104 /* As the Warning messages are more important than debug messages, */ | |
105 /* it processes warning message too */ | |
106 | |
107 /* add the mask_debug in the dar_filter array */ | |
108 dar_gbl_var_p ->dar_filter_array[index].mask_debug |= | |
109 msg_p->use_msg_parameter.mask; | |
110 | |
111 /* add the mask_warning in the dar_filter array */ | |
112 dar_gbl_var_p ->dar_filter_array[index].mask_warning |= | |
113 msg_p->use_msg_parameter.mask; | |
114 break; | |
115 } | |
116 | |
117 case DAR_NO_DIAGNOSE: | |
118 { | |
119 /* The DAR entity doesn't want to process Diagnose messages */ | |
120 | |
121 /* delete the mask_debug in the dar_filter array */ | |
122 dar_gbl_var_p ->dar_filter_array[index].mask_debug = 0x00; | |
123 | |
124 /* delete the mask_warning in the dar_filter array */ | |
125 dar_gbl_var_p ->dar_filter_array[index].mask_warning = 0x00; | |
126 break; | |
127 } | |
128 | |
129 default: | |
130 { | |
131 /* Unknow level has been received */ | |
132 DAR_TRACE_WARNING("A DAR unknow level has been received "); | |
133 break; | |
134 } | |
135 } /* switch(msg_p->use_msg_parameter.level) */ | |
136 } /* if (search_group(msg_p->use_msg_parameter.group_nb,*index_gbl_p)== RV_OK) */ | |
137 | |
138 else | |
139 { | |
140 /* if the group doesn't exist and if there is enough space in the dar_filter_array */ | |
141 if ( dar_add_group(&index)== RV_OK) | |
142 { | |
143 /* ... add the group in the dar_array_filter */ | |
144 dar_gbl_var_p ->dar_filter_array[index].group_nb |= msg_p->use_msg_parameter.group_nb; | |
145 /* Check the Dar level */ | |
146 switch(msg_p->use_msg_parameter.level) | |
147 { | |
148 case DAR_WARNING: | |
149 { /* The DAR entity wants to process Warning messages */ | |
150 /* add the mask_warning in the dar_filter array */ | |
151 dar_gbl_var_p ->dar_filter_array[index].mask_warning |= | |
152 msg_p->use_msg_parameter.mask; | |
153 break; | |
154 } | |
155 | |
156 case DAR_DEBUG: | |
157 { | |
158 /* The DAR entity wants to process Debug messages */ | |
159 /* As the Warning messages are more important than debug messages, */ | |
160 /* it processes warning message too */ | |
161 | |
162 /* add the mask_debug in the dar_filter array */ | |
163 dar_gbl_var_p ->dar_filter_array[index].mask_debug |= | |
164 msg_p->use_msg_parameter.mask; | |
165 | |
166 /* add the mask_warning in the dar_filter array */ | |
167 dar_gbl_var_p ->dar_filter_array[index].mask_warning |= | |
168 msg_p->use_msg_parameter.mask; | |
169 break; | |
170 } | |
171 | |
172 default: | |
173 { | |
174 /* Unknow level has been received */ | |
175 DAR_TRACE_WARNING("A DAR unknow level has been received "); | |
176 break; | |
177 }; | |
178 } /* switch */ | |
179 }/* if ( add_group(msg_p->use_msg_parameter.group_nb,*index_gbl_p)== RV_OK)) */ | |
180 | |
181 else | |
182 { | |
183 /* There is not enough space in the dar_array_filter */ | |
184 DAR_TRACE_WARNING("Not enough space in the dar_array_filter for adding a new group "); | |
185 } | |
186 } | |
187 return(RV_OK); | |
188 }/* dar_filter_request */ | |
189 | |
190 | |
191 /********************************************************************************/ | |
192 /* */ | |
193 /* Function Name: dar_write_data_in_buffer */ | |
194 /* */ | |
195 /* Purpose: This function is called to store diagnose data in RAM buffer */ | |
196 /* */ | |
197 /* note: In order to separate the different string, the data are */ | |
198 /* ---- stored as follows: */ | |
199 /* */ | |
200 /* Input Parameters: */ | |
201 /* Pointer to the message to store */ | |
202 /* Data Format, */ | |
203 /* Data level, */ | |
204 /* Data Use Id, */ | |
205 /* */ | |
206 /* Output Parameters: */ | |
207 /* Validation of the diagnose execution. */ | |
208 /* */ | |
209 /* */ | |
210 /* */ | |
211 /* Revision History: */ | |
212 /* None. */ | |
213 /* */ | |
214 /********************************************************************************/ | |
215 T_RV_RET dar_write_data_in_buffer( T_DAR_WRITE_START *msg_p) | |
216 { | |
217 /* Local variables */ | |
218 UINT8 i = 0; | |
219 UINT8 length = 0; | |
220 | |
221 /* Diagnose string length */ | |
222 length = (UINT16) strlen(msg_p->data_write.char_p); | |
223 | |
224 /*** Circular buffer to store data ***/ | |
225 /* Add 0xFF to separate 2 strings */ | |
226 dar_write_buffer[dar_current_index] = 0xF; | |
227 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */ | |
228 dar_write_buffer[dar_current_index] = 0xF; | |
229 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */ | |
230 | |
231 | |
232 /* The group_nb is 16 bit length, and the buffer is an UINT8 length */ | |
233 /* So the group_nb must be stocked by dividing it in 2 parts */ | |
234 dar_write_buffer[dar_current_index] = (msg_p->data_write.use_id.group_nb)>>8; | |
235 /*add the 8 first bits of the Use id group*/ | |
236 DAR_PLUS_PLUS(dar_current_index); | |
237 dar_write_buffer[dar_current_index] = msg_p->data_write.use_id.group_nb; | |
238 /*add the 8 last bits of the Use id group*/ | |
239 DAR_PLUS_PLUS(dar_current_index); | |
240 /* The mask is 16 bit length, and the buffer is an UINT8 length */ | |
241 /* So the mask must be stocked by dividing it in 2 parts */ | |
242 dar_write_buffer[dar_current_index] = (msg_p->data_write.use_id.mask)>>8; | |
243 /* add the 8 first bits of the Use id mask */ | |
244 DAR_PLUS_PLUS(dar_current_index); | |
245 dar_write_buffer[dar_current_index] = msg_p->data_write.use_id.mask; | |
246 /* add the 8 last bits of the Use id mask */ | |
247 DAR_PLUS_PLUS(dar_current_index); | |
248 | |
249 /* Add the dar_level data */ | |
250 dar_write_buffer[dar_current_index] = msg_p->data_write.level; | |
251 DAR_PLUS_PLUS(dar_current_index); | |
252 | |
253 /* circular buffer to store diagnose data in RAM buffer */ | |
254 for (i=0; i < length; i++ ) | |
255 { | |
256 /* copy string in the RAM char by char*/ | |
257 dar_write_buffer[dar_current_index]=msg_p->data_write.char_p[i]; | |
258 | |
259 /* detection of the end of the buffer */ | |
260 /* When current = DAR_MAX_BUFFER_SIZE , current = 0 */ | |
261 DAR_PLUS_PLUS(dar_current_index); | |
262 } | |
263 | |
264 /* DAR information is redirected to standard trace */ | |
265 //DAR_SEND_TRACE("circular buffer : ",RV_TRACE_LEVEL_DEBUG_HIGH); | |
266 //rvf_send_trace(msg_p->data_write.char_p, length, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, DAR_USE_ID); | |
267 | |
268 return(RV_OK); | |
269 | |
270 } /* dar_send_write_data */ | |
271 | |
272 /********************************************************************************/ | |
273 /* Function dar_empty_mb_and_save_data */ | |
274 /* */ | |
275 /* Description This function is used to empty the mailbox and save data in */ | |
276 /* the RAM buffer */ | |
277 /* */ | |
278 /* Input Parameters: */ | |
279 /* Pointer to the message to store */ | |
280 /* */ | |
281 /* Output Parameters: */ | |
282 /* Validation of the function execution. */ | |
283 /* */ | |
284 /* Note: */ | |
285 /* None */ | |
286 /* */ | |
287 /********************************************************************************/ | |
288 T_RV_RET dar_empty_mb_and_save_data( T_DAR_INFO *buffer_p) | |
289 { | |
290 /* Declare local variables */ | |
291 UINT8 i = 0; | |
292 UINT16 length = 0; | |
293 T_RV_HDR *msg_p = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX); | |
294 | |
295 /**** Empty the mail box ****/ | |
296 while(msg_p != NULL) | |
297 { | |
298 /* If it's a Write message, store it in the Ram */ | |
299 /* ( it is not interesting to store filter message ) */ | |
300 if ((msg_p->msg_id) == DAR_WRITE_REQ) | |
301 { | |
302 /* store themessage in the RAM*/ | |
303 dar_write_data_in_buffer((T_DAR_WRITE_START *)msg_p); | |
304 } | |
305 /* free the Header of the message */ | |
306 rvf_free_buf((T_RVF_BUFFER *) msg_p); | |
307 | |
308 /* Read the next message */ | |
309 msg_p = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX); | |
310 } /* while (msg_p != NULL) */ | |
311 | |
312 /**** Store data in RAM buffer ****/ | |
313 /* Diagnose string length */ | |
314 length = (UINT16) strlen(buffer_p); | |
315 | |
316 /** Circular buffer to store data **/ | |
317 /* Add 0xFF to separate 2 strings */ | |
318 dar_write_buffer[dar_current_index] = 0xF; | |
319 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */ | |
320 dar_write_buffer[dar_current_index] = 0xF; | |
321 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */ | |
322 | |
323 /* Add the dar_level data */ | |
324 dar_write_buffer[dar_current_index] = DAR_EXCEPTION; | |
325 DAR_PLUS_PLUS(dar_current_index); | |
326 /* circular buffer to store diagnose data in RAM buffer */ | |
327 for (i=0; i < length; i++ ) | |
328 { | |
329 /* copy string in the RAM char by char*/ | |
330 dar_write_buffer[dar_current_index]=buffer_p[i]; | |
331 | |
332 /* detection of the end of the buffer */ | |
333 /* When current = DAR_MAX_BUFFER_SIZE , current = 0 */ | |
334 DAR_PLUS_PLUS(dar_current_index); | |
335 } | |
336 | |
337 return(RV_OK); | |
338 | |
339 }/* dar_empty_mb_and_save_data*/ | |
340 | |
341 | |
342 #endif /* #ifdef RVM_DAR_SWE */ | |
343 | |
344 | |
345 | |
346 /********************************************************************************/ | |
347 /* */ | |
348 /* ------------------------------------------------ */ | |
349 /* | WARNING - IMPORTANT | */ | |
350 /* ------------------------------------------------ */ | |
351 /* */ | |
352 /* */ | |
353 /* Function Name: dar_lib */ | |
354 /* */ | |
355 /* Purpose: This function is only used in order to have a function in the */ | |
356 /* dar_lib when the DAR is NOT_COMPILED */ | |
357 /* */ | |
358 /* Input Parameters: */ | |
359 /* None */ | |
360 /* */ | |
361 /* Output Parameters: */ | |
362 /* NONE */ | |
363 /* */ | |
364 /********************************************************************************/ | |
365 void dar_lib(void) | |
366 { | |
367 } |