FreeCalypso > hg > fc-magnetite
comparison src/g23m-aci/aci/ati_src_psi_io.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Tue, 11 Oct 2016 02:02:43 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 161:4557e2a9c18e | 162:53929b40109c |
|---|---|
| 1 /* | |
| 2 +----------------------------------------------------------------------------- | |
| 3 | Project : | |
| 4 | Modul : | |
| 5 +----------------------------------------------------------------------------- | |
| 6 | Copyright 2002 Texas Instruments Berlin, AG | |
| 7 | All rights reserved. | |
| 8 | | |
| 9 | This file is confidential and a trade secret of Texas | |
| 10 | Instruments Berlin, AG | |
| 11 | The receipt of or possession of this file does not convey | |
| 12 | any rights to reproduce or disclose its contents or to | |
| 13 | manufacture, use, or sell anything it may describe, in | |
| 14 | whole, or in part, without the specific written consent of | |
| 15 | Texas Instruments Berlin, AG. | |
| 16 +----------------------------------------------------------------------------- | |
| 17 | Purpose : | |
| 18 +----------------------------------------------------------------------------- | |
| 19 */ | |
| 20 #ifdef FF_PSI | |
| 21 | |
| 22 #define ATI_SRC_PSI_IO_C | |
| 23 | |
| 24 #include "aci_all.h" | |
| 25 /*==== INCLUDES ===================================================*/ | |
| 26 #include "aci_cmh.h" | |
| 27 #include "ati_cmd.h" | |
| 28 #include "aci_cmd.h" | |
| 29 | |
| 30 #include "aci_lst.h" | |
| 31 | |
| 32 #include "dti.h" /* functionality of the dti library */ | |
| 33 #include "dti_conn_mng.h" | |
| 34 | |
| 35 #include "psa_psi.h" | |
| 36 #include "cmh_psi.h" | |
| 37 | |
| 38 #ifdef _SIMULATION_ | |
| 39 #include "aci.h" | |
| 40 #include "ati_src_tst.h" | |
| 41 | |
| 42 # ifdef SMI | |
| 43 # undef hCommMMI | |
| 44 # define hCommMMI hCommSMI | |
| 45 # endif | |
| 46 | |
| 47 EXTERN T_ACI_LIST *ati_src_list; | |
| 48 #endif | |
| 49 | |
| 50 | |
| 51 #include "aci_io.h" | |
| 52 #include "ati_io.h" | |
| 53 #include "aci_mem.h" | |
| 54 #include "ati_src_psi.h" | |
| 55 | |
| 56 #include "aci.h" | |
| 57 #include "sap_dti.h" | |
| 58 | |
| 59 /*==== CONSTANTS ==================================================*/ | |
| 60 #define MAX_NORMAL_BUFFER_LEN (100-4) // Since Malloc uses 4 additional internal bytes of the Blocks | |
| 61 #ifdef GPRS | |
| 62 #define MAX_LARGE_BUFFER_LEN (600-4) | |
| 63 #else | |
| 64 #define MAX_LARGE_BUFFER_LEN (400-4) | |
| 65 #endif | |
| 66 /*==== TYPES ======================================================*/ | |
| 67 | |
| 68 /*==== EXPORT =====================================================*/ | |
| 69 | |
| 70 /*==== VARIABLES ==================================================*/ | |
| 71 /*==== FUNCTIONS ==================================================*/ | |
| 72 LOCAL void io_DTIPSIsendString (UBYTE *string, USHORT string_len, | |
| 73 T_ACI_DTI_PRC_PSI *src_infos, | |
| 74 T_ATI_OUTPUT_TYPE output_type); | |
| 75 | |
| 76 #ifdef _SIMULATION_ | |
| 77 LOCAL BOOL get_source_type( UBYTE src_id, T_ATI_SRC_TYPE *src_type ); | |
| 78 #endif | |
| 79 /*=================================================================*/ | |
| 80 | |
| 81 GLOBAL void psi_src_result_cb (UBYTE src_id, | |
| 82 T_ATI_OUTPUT_TYPE output_type, | |
| 83 UBYTE *output, | |
| 84 USHORT output_len) | |
| 85 { | |
| 86 T_ACI_DTI_PRC_PSI *src_infos; | |
| 87 TRACE_FUNCTION("psi_src_result_cb()"); | |
| 88 | |
| 89 src_infos = find_element (psi_src_params, (UBYTE)src_id, cmhPSItest_srcId); | |
| 90 if (src_infos EQ NULL) | |
| 91 { | |
| 92 TRACE_EVENT_P1("[ERR] psi_src_result_cb: src_id=%d not found", src_id) ; | |
| 93 return ; | |
| 94 } | |
| 95 | |
| 96 switch (src_infos->LineState) | |
| 97 { | |
| 98 case LINE_CONNECTING: | |
| 99 case LINE_CONNECTED: | |
| 100 case LINE_TMP_CONNECTED: | |
| 101 break; | |
| 102 | |
| 103 case LINE_TMP_DISCONNECTING: | |
| 104 case LINE_TMP_DISCONNECTED: | |
| 105 if (IS_FORCED_OUTPUT (output_type) || IS_CONFIRM_OUTPUT (output_type)) | |
| 106 { | |
| 107 break; | |
| 108 } | |
| 109 return; | |
| 110 | |
| 111 case LINE_DISCONNECTED: | |
| 112 return; | |
| 113 } | |
| 114 | |
| 115 if (src_infos->first_output EQ TRUE) | |
| 116 { | |
| 117 src_infos->first_output = FALSE; | |
| 118 output_type |= ATI_BEGIN_CRLF_OUTPUT; | |
| 119 } | |
| 120 io_DTIPSIsendString (output, output_len, src_infos, output_type); | |
| 121 } | |
| 122 | |
| 123 | |
| 124 GLOBAL void psi_src_line_state_cb (UBYTE src_id, | |
| 125 T_ATI_LINE_STATE_TYPE line_state_type, | |
| 126 ULONG line_state_param) | |
| 127 { | |
| 128 T_ACI_DTI_PRC_PSI *src_infos; | |
| 129 | |
| 130 TRACE_FUNCTION("psi_src_line_state_cb()"); | |
| 131 | |
| 132 src_infos = find_element (psi_src_params, (UBYTE)src_id, cmhPSItest_srcId); | |
| 133 if (src_infos EQ NULL) | |
| 134 { | |
| 135 TRACE_EVENT ("[ERR] psi_src_line_state_cb: src_id not found"); | |
| 136 return; | |
| 137 } | |
| 138 | |
| 139 switch (line_state_type) | |
| 140 { | |
| 141 case ATI_LINE_STATE_OUTPUT_TYPE: | |
| 142 TRACE_EVENT_P1 ("output type: %d",line_state_param); | |
| 143 src_infos->run_cmd = TRUE; | |
| 144 src_infos->first_output = TRUE; | |
| 145 | |
| 146 if( line_state_param EQ ATI_OUTPUT_TYPE_LARGE ) | |
| 147 { | |
| 148 src_infos->large_type = TRUE; | |
| 149 } | |
| 150 else | |
| 151 { | |
| 152 src_infos->large_type = FALSE; | |
| 153 } | |
| 154 break; | |
| 155 | |
| 156 case ATI_LINE_STATE_DCD: | |
| 157 | |
| 158 if(line_state_param EQ IO_DCD_ON) | |
| 159 { | |
| 160 BITFIELD_SET (src_infos->data_cntr, PSI_DTI_SB_BIT); | |
| 161 } | |
| 162 else | |
| 163 { | |
| 164 BITFIELD_CLEAR (src_infos->data_cntr, PSI_DTI_SB_BIT); | |
| 165 } | |
| 166 | |
| 167 psaPSI_DCDreq( src_id, (UBYTE)line_state_param ); | |
| 168 | |
| 169 break; | |
| 170 | |
| 171 case ATI_LINE_STATE_RNG: | |
| 172 { | |
| 173 T_IO_RING_PARAMS rng_params; | |
| 174 memcpy (&rng_params, (T_IO_RING_PARAMS*)line_state_param, | |
| 175 sizeof(T_IO_RING_PARAMS)); | |
| 176 psaPSI_RINGreq( src_id, (UBYTE)rng_params.ring_stat ); | |
| 177 break; | |
| 178 } | |
| 179 | |
| 180 case ATI_LINE_STATE_START: | |
| 181 break; | |
| 182 | |
| 183 case ATI_LINE_STATE_END: | |
| 184 src_infos->run_cmd = FALSE; | |
| 185 break; | |
| 186 | |
| 187 default: | |
| 188 { | |
| 189 TRACE_EVENT_P1("[WRN] psi_src_line_state_cb (): "\ | |
| 190 "UNKNOWN line_state_type = %d", line_state_type); | |
| 191 break; | |
| 192 } | |
| 193 } | |
| 194 } | |
| 195 | |
| 196 LOCAL T_desc2 *get_last_buffer (T_desc2 *data_head) | |
| 197 { | |
| 198 T_desc2 *next_data; | |
| 199 | |
| 200 if (data_head EQ NULL) | |
| 201 { | |
| 202 return (NULL); | |
| 203 } | |
| 204 | |
| 205 next_data = data_head; | |
| 206 while ((T_desc2*)next_data->next NEQ NULL) | |
| 207 { | |
| 208 next_data = (T_desc2*)next_data->next; | |
| 209 } | |
| 210 | |
| 211 return (next_data); | |
| 212 } | |
| 213 | |
| 214 | |
| 215 LOCAL T_desc2 *get_new_buffer (BOOL large_type, USHORT *max_buffer_size) | |
| 216 { | |
| 217 T_desc2 *new_buffer; | |
| 218 | |
| 219 if (large_type EQ TRUE) | |
| 220 *max_buffer_size = MAX_LARGE_BUFFER_LEN; | |
| 221 else | |
| 222 *max_buffer_size = MAX_NORMAL_BUFFER_LEN; | |
| 223 | |
| 224 ACI_MALLOC (new_buffer, *max_buffer_size); | |
| 225 *max_buffer_size -= (sizeof(T_desc2) - 1); | |
| 226 | |
| 227 new_buffer->next = (ULONG)NULL; | |
| 228 new_buffer->len = 0; | |
| 229 new_buffer->size = *max_buffer_size; | |
| 230 new_buffer->offset = 0; | |
| 231 | |
| 232 return (new_buffer); | |
| 233 } | |
| 234 | |
| 235 LOCAL void free_data_buffer (T_ACI_DTI_DATA_BUF *data_buffer) | |
| 236 { | |
| 237 T_desc2 *p_desc, *p_desc_next=NULL; | |
| 238 | |
| 239 if (data_buffer->data_list EQ NULL) | |
| 240 { | |
| 241 return; | |
| 242 } | |
| 243 | |
| 244 p_desc = data_buffer->data_list; | |
| 245 if (p_desc NEQ NULL) | |
| 246 { | |
| 247 p_desc_next = (T_desc2 *)p_desc->next; | |
| 248 } | |
| 249 | |
| 250 while (p_desc NEQ NULL) | |
| 251 { | |
| 252 ACI_MFREE (p_desc); | |
| 253 | |
| 254 p_desc = p_desc_next; | |
| 255 if (p_desc NEQ NULL) | |
| 256 { | |
| 257 p_desc_next = (T_desc2 *)p_desc->next; | |
| 258 } | |
| 259 } | |
| 260 | |
| 261 data_buffer->data_list = NULL; | |
| 262 data_buffer->max_buffer_size = 0; | |
| 263 data_buffer->create_time = 0; | |
| 264 } | |
| 265 | |
| 266 | |
| 267 GLOBAL void psi_buffer_data (T_ACI_DTI_PRC_PSI *src_infos, T_desc2 *send_data) | |
| 268 { | |
| 269 T_desc2 *active_buffer, *last_buffer; | |
| 270 USHORT i, j; | |
| 271 T_TIME current_time; | |
| 272 TRACE_FUNCTION("psi_buffer_data()"); | |
| 273 | |
| 274 last_buffer = get_last_buffer(src_infos->data_buffer.data_list); | |
| 275 active_buffer = last_buffer; | |
| 276 | |
| 277 if (last_buffer EQ NULL) | |
| 278 { | |
| 279 active_buffer = get_new_buffer (src_infos->large_type, | |
| 280 &src_infos->data_buffer.max_buffer_size); | |
| 281 src_infos->data_buffer.data_list = active_buffer; | |
| 282 last_buffer = active_buffer; | |
| 283 /* store the creation time for the data buffer */ | |
| 284 vsi_t_time (VSI_CALLER &src_infos->data_buffer.create_time); | |
| 285 } | |
| 286 else | |
| 287 { | |
| 288 /* | |
| 289 If no device is connected to PSI it is possible that the buffer | |
| 290 use all available memory. | |
| 291 Solution: | |
| 292 When the line is connected, check the life time of the | |
| 293 data buffer. Remove the buffer if the live time is greater than | |
| 294 30 sec. (only if line is in data mode (line is disconnected)). | |
| 295 */ | |
| 296 // if (src_infos->LineState EQ LINE_CONNECTED) // line is always connected | |
| 297 { | |
| 298 vsi_t_time (VSI_CALLER ¤t_time); | |
| 299 if ((current_time - src_infos->data_buffer.create_time) > MAX_DATA_BUFFER_LIFE_TIME) | |
| 300 { | |
| 301 TRACE_EVENT_P1 ("[WRN] psi_buffer_data(): life time expired, buffer deleted (%d)", | |
| 302 current_time - src_infos->data_buffer.create_time); | |
| 303 free_data_buffer (&src_infos->data_buffer); | |
| 304 return; | |
| 305 } | |
| 306 } | |
| 307 } | |
| 308 | |
| 309 i = 0; | |
| 310 while (i < send_data->len) | |
| 311 { | |
| 312 if (active_buffer->len EQ active_buffer->size) // (src_infos->data_buffer.max_buffer_size)) | |
| 313 { | |
| 314 active_buffer = get_new_buffer (src_infos->large_type, | |
| 315 &src_infos->data_buffer.max_buffer_size); | |
| 316 last_buffer->next = (ULONG)active_buffer; | |
| 317 last_buffer = active_buffer; | |
| 318 } | |
| 319 // Optimize for Speed | |
| 320 j = MINIMUM((active_buffer->size - active_buffer->len), (send_data->len - i)); | |
| 321 if (j>1) | |
| 322 { | |
| 323 /*lint -e670 (Warning: Possible access beyond array for function)*/ | |
| 324 memcpy((char *)&active_buffer->buffer[active_buffer->len], (char *)&send_data->buffer[i], j); | |
| 325 active_buffer->len += j; | |
| 326 i += j; | |
| 327 } | |
| 328 else | |
| 329 active_buffer->buffer[active_buffer->len++] = send_data->buffer[i++]; | |
| 330 } | |
| 331 } | |
| 332 | |
| 333 | |
| 334 GLOBAL void psi_send_buffer_data (UBYTE src_id) | |
| 335 { | |
| 336 T_ACI_DTI_PRC_PSI *src_infos = NULL; | |
| 337 | |
| 338 TRACE_FUNCTION("psi_send_buffer_data()"); | |
| 339 | |
| 340 /* dti_id should be supported by DTI_ENTITY_ID or something, here.. */ | |
| 341 src_infos = find_element (psi_src_params, src_id, | |
| 342 cmhPSItest_srcId); | |
| 343 | |
| 344 if (aci_src_dti_params[src_id].isDtiConnected EQ FALSE) | |
| 345 { | |
| 346 TRACE_EVENT ("DTI_READY_IND: line not connected"); | |
| 347 return; | |
| 348 } | |
| 349 | |
| 350 /* | |
| 351 * send data which may have been stored .. | |
| 352 */ | |
| 353 if (src_infos->data_buffer.data_list NEQ NULL) | |
| 354 { | |
| 355 #ifdef _SIMULATION_ | |
| 356 { | |
| 357 T_ATI_SRC_TYPE src_type; | |
| 358 | |
| 359 if(get_source_type(src_infos->srcId, &src_type)) | |
| 360 { | |
| 361 if( ATI_SRC_TYPE_TST EQ src_type ) | |
| 362 { | |
| 363 ati_src_tst_sendString(src_infos->data_buffer.data_list, src_infos->srcId); | |
| 364 } | |
| 365 else | |
| 366 { | |
| 367 psa_psi_DTI_data_req (src_infos->data_buffer.data_list, src_infos, DTI_ENTITY_PSI); | |
| 368 } | |
| 369 } | |
| 370 } | |
| 371 #else | |
| 372 psa_psi_DTI_data_req (src_infos->data_buffer.data_list, src_infos, DTI_ENTITY_PSI); | |
| 373 #endif /* _SIMULATION_ */ | |
| 374 src_infos->data_buffer.data_list = NULL; | |
| 375 src_infos->data_buffer.max_buffer_size = 0; | |
| 376 src_infos->data_buffer.create_time = 0; | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 | |
| 381 LOCAL T_desc2 *make_send_data (UBYTE *data, USHORT data_len, | |
| 382 T_ATI_OUTPUT_TYPE output_type) | |
| 383 { | |
| 384 T_desc2 *send_data; | |
| 385 USHORT send_len = 0; | |
| 386 #if !defined (_SIMULATION_) OR defined(ACIDTI_TEST_SIM) | |
| 387 static UBYTE formated_output[MAX_CMD_LEN+5]; | |
| 388 USHORT formated_len; | |
| 389 | |
| 390 formated_len = format_output (data, data_len, formated_output, output_type); | |
| 391 send_len = sizeof(T_desc2) - 1 + formated_len; | |
| 392 | |
| 393 ACI_MALLOC(send_data, send_len); | |
| 394 send_data->next = (ULONG)NULL; | |
| 395 send_data->len = formated_len; | |
| 396 send_data->size = formated_len; | |
| 397 send_data->offset = 0; | |
| 398 memcpy(send_data->buffer, formated_output, formated_len); | |
| 399 | |
| 400 #else /* _SIMULATION_ */ | |
| 401 | |
| 402 send_len = sizeof(T_desc2) - 1 + data_len; | |
| 403 | |
| 404 ACI_MALLOC(send_data, send_len); | |
| 405 send_data->next = (ULONG)NULL; | |
| 406 send_data->len = data_len; | |
| 407 send_data->size = data_len; | |
| 408 send_data->offset = 0; | |
| 409 memcpy(send_data->buffer, data, data_len); | |
| 410 | |
| 411 #endif /* _SIMULATION_ */ | |
| 412 return (send_data); | |
| 413 } | |
| 414 | |
| 415 /* | |
| 416 +-------------------------------------------------------------------+ | |
| 417 | PROJECT : GSM-PS (6147) MODULE : CMH_DTIS | | |
| 418 | ROUTINE : io_DTIPSIsendString | | |
| 419 +-------------------------------------------------------------------+ | |
| 420 | |
| 421 PURPOSE : format output string and send to the PSI through DTI | |
| 422 */ | |
| 423 | |
| 424 LOCAL void io_DTIPSIsendString (UBYTE *string, USHORT string_len, | |
| 425 T_ACI_DTI_PRC_PSI *src_infos, | |
| 426 T_ATI_OUTPUT_TYPE output_type) | |
| 427 { | |
| 428 T_desc2 *send_data; | |
| 429 #ifdef _SIMULATION_ | |
| 430 T_ATI_SRC_TYPE src_type; | |
| 431 | |
| 432 /* | |
| 433 * get_source_type() writes an trace_event in the error case. | |
| 434 */ | |
| 435 if(!get_source_type(src_infos->srcId, &src_type)) | |
| 436 return; | |
| 437 #endif /* _SIMULATION_ */ | |
| 438 | |
| 439 TRACE_FUNCTION("io_DTIPSIsendString"); | |
| 440 if (!IS_ECHO_OUTPUT (output_type)) | |
| 441 { | |
| 442 #ifdef _SIMULATION_ | |
| 443 if( ATI_SRC_TYPE_TST NEQ src_type ) | |
| 444 #endif /* _SIMULATION_ */ | |
| 445 { | |
| 446 trace_cmd_line ("OUT:", (CHAR*)string, src_infos->srcId, string_len); | |
| 447 } | |
| 448 } | |
| 449 | |
| 450 if (string_len > MAX_LARGE_BUFFER_LEN) | |
| 451 { | |
| 452 TRACE_ERROR ("String too large for io_DTIPSIsendString!"); | |
| 453 TRACE_EVENT_P2 ("Truncating string from %d to %d", string_len, MAX_LARGE_BUFFER_LEN); | |
| 454 string_len = MAX_LARGE_BUFFER_LEN; | |
| 455 } | |
| 456 | |
| 457 send_data = make_send_data (string, string_len, output_type); | |
| 458 | |
| 459 if ((aci_src_dti_params[src_infos->srcId].isDtiConnected) AND | |
| 460 (aci_src_dti_params[src_infos->srcId].dtxState EQ READY)) | |
| 461 { | |
| 462 #ifdef _SIMULATION_ | |
| 463 if( ATI_SRC_TYPE_TST EQ src_type ) | |
| 464 { | |
| 465 ati_src_tst_sendString(send_data, src_infos->srcId); | |
| 466 ACI_MFREE(send_data); | |
| 467 } | |
| 468 else | |
| 469 { | |
| 470 psa_psi_DTI_data_req (send_data, src_infos, DTI_ENTITY_PSI); | |
| 471 } | |
| 472 #else | |
| 473 /* send message through DTI */ | |
| 474 psa_psi_DTI_data_req (send_data, src_infos, DTI_ENTITY_PSI); | |
| 475 #endif /* _SIMULATION_ */ | |
| 476 } | |
| 477 else | |
| 478 { | |
| 479 /* buffer these datas */ | |
| 480 psi_buffer_data (src_infos, send_data); | |
| 481 ACI_MFREE (send_data); | |
| 482 } | |
| 483 } | |
| 484 | |
| 485 #ifdef _SIMULATION_ | |
| 486 | |
| 487 /* | |
| 488 +-------------------------------------------------------------------+ | |
| 489 | PROJECT : GSM-PS (6147) MODULE : ATI_SRC_PSI_IO_C | | |
| 490 | ROUTINE : get_source_type | | |
| 491 +-------------------------------------------------------------------+ | |
| 492 | |
| 493 PURPOSE : provides the source type for a source ID | |
| 494 | |
| 495 returns FALSE if source ID is not registered | |
| 496 */ | |
| 497 LOCAL BOOL get_source_type( UBYTE src_id, T_ATI_SRC_TYPE *src_type ) | |
| 498 { | |
| 499 T_ATI_SRC_PARAMS *src_params = NULL; | |
| 500 | |
| 501 src_params = find_element (ati_src_list, src_id, search_ati_src_id); | |
| 502 if (src_params EQ NULL) | |
| 503 { | |
| 504 TRACE_EVENT_P1("[ERR] get_source_type: source ID %d not found", src_id); | |
| 505 *src_type = ATI_SRC_TYPE_UNKNOWN; | |
| 506 return FALSE; | |
| 507 } | |
| 508 | |
| 509 *src_type = src_params->src_type; | |
| 510 return TRUE; | |
| 511 } | |
| 512 | |
| 513 /* | |
| 514 +--------------------------------------------------------------------+ | |
| 515 | PROJECT : GSM-PS (6147) MODULE : ATI_SRC_PSI_IO_C | | |
| 516 | ROUTINE : psi_src_test_sendString | | |
| 517 +--------------------------------------------------------------------+ | |
| 518 | |
| 519 PURPOSE : Provides the io_DTIsendString() for the test-source-callback | |
| 520 and apends a separator to the message. | |
| 521 The separator is needed to isolates the messages in the | |
| 522 case of buffering messages during PSI is not connected | |
| 523 with ACI | |
| 524 */ | |
| 525 GLOBAL void psi_src_test_sendString (UBYTE *string, USHORT string_len, | |
| 526 T_ACI_DTI_PRC_PSI *src_infos, | |
| 527 T_ATI_OUTPUT_TYPE output_type) | |
| 528 { | |
| 529 UBYTE *tmp; | |
| 530 | |
| 531 ACI_MALLOC(tmp, string_len + 1); | |
| 532 strncpy(tmp, string, string_len); | |
| 533 tmp[string_len] = (UBYTE) ATI_TEST_SRC_SEPARATOR; | |
| 534 | |
| 535 io_DTIPSIsendString(tmp, (USHORT) (string_len + 1), src_infos, output_type); | |
| 536 | |
| 537 ACI_MFREE(tmp); | |
| 538 } | |
| 539 #endif /*_SIMULATION_*/ | |
| 540 #endif /*FF_PSI*/ | |
| 541 | |
| 542 /*==== EOF =======================================================*/ | |
| 543 |
