dp_msac2.c
资源名称:Profibus.rar [点击查看]
上传用户:hualang
上传日期:2022-04-11
资源大小:104k
文件大小:83k
源码类别:
能源行业(电力石油煤炭)
开发平台:
C/C++
- /********************** Filename: dp_msac2.c *******************************/
- /* ========================================================================= */
- /* */
- /* 0000 000 000 00000 0 000 0 0 0 0000 */
- /* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */
- /* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Einsteinstra遝 6 */
- /* 0000 000 0 0 000 0 0 00000 0 0000 91074 Herzogenaurach */
- /* 0 00 0 0 0 0 0 0 0 0 0 */
- /* 0 0 0 0 0 0 0 0 0 0 0 0 0 Tel: ++49-9132-744-200 */
- /* 0 0 0 000 0 0 000 0 0 0 0 GmbH Fax: ++49-9132-744-204 */
- /* */
- /* ========================================================================= */
- /* */
- /* Function: interface service routines for msac_c2 */
- /* */
- /* ------------------------------------------------------------------------- */
- /* */
- /* Technical support: P. Fredehorst */
- /* Tel. : ++49-9132/744-214 */
- /* Fax. : -204 */
- /* eMail: pfredehorst@profichip.com */
- /* */
- /*****************************************************************************/
- /*****************************************************************************/
- /* contents:
- - function prototypes
- - data structures
- - internal functions
- */
- /*****************************************************************************/
- /* include hierarchy */
- #include "..dp_incplatform.h"
- #include "..dp_incdp_inc.h"
- //#include "E5_Inc.h"
- #ifdef DP_MSAC_C2
- /*---------------------------------------------------------------------------*/
- /* global msac2 data definitions */
- /*---------------------------------------------------------------------------*/
- typedef struct
- {
- UBYTE read_rec_ptr;
- UBYTE write_rec_ptr;
- UBYTE start_rec_ptr; // first element of receive queue
- UBYTE end_rec_ptr; // last element of receive queue
- UBYTE num_sap;
- UBYTE pdu_len;
- UWORD poll_time;
- UBYTE enabled;
- UBYTE close_channel_request; // memory item for close_channel request of the user,
- // used to reject a double request
- MSAC_C2_REC_QUEUE_PTR act_rec_ptr;
- MSAC_C2_REC_QUEUE rec_queue[MSAC_C2_MAX_INPUT_ITEMS];
- MSAC_C2_CONNECT_ITEM connection_list[DP_C2_NUM_SAPS]; // list of connection-descriptions
- MSAC_C2_RES_IND_QUEUE reserve_buffer[DP_C2_NUM_SAPS]; // array of reserve data buffer to realize a disconnect pdu
- MSAC_C2_TIMER timer_list[ DP_C2_NUM_SAPS ];
- } MSAC2_STRUC;
- SECTION_DEF_CommuData static MSAC2_STRUC msac_c2[MAX_DEV_NUM];
- /*---------------------------------------------------------------------------*/
- /* function prototypes */
- /*---------------------------------------------------------------------------*/
- void msac_c2_realize_ind_recv(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr);
- void msac_c2_send_response_data (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr);
- void msac_c2_call_ind_await (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr);
- void msac_c2_resp_pdu_provide(UBYTE dev_num,UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr);
- void msac_c2_pdu_provide(UBYTE dev_num,UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr);
- void msac_c2_handle_user_response (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr);
- void msac_c2_create_disconnect_pdu(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, MSAC2_DIRECTION direction);
- void msac_c2_realize_resp_sent(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr);
- void msac_c2_realize_ind_disable_done(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr);
- void msac_c2_confirm_close_request(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr);
- void msac_c2_dc_user_indication(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr);
- void msac_c2_close_channel (UBYTE dev_num);
- UBYTE msac_c2_start_timer(UBYTE dev_num, UBYTE timer_index, UWORD timer_value );
- UBYTE msac_c2_stop_timer(UBYTE dev_num, UBYTE timer_index );
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_process(UBYTE dev_num) */
- /* */
- /* function: main program of MSAC_C2 */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_process(UBYTE dev_num)
- {
- MSAC_C2_CONNECT_ITEM_PTR connection_ptr;
- UBYTE sap_nr;
- UBYTE cn_id;
- #ifdef DP_MSAC_C2_Time
- UBYTE i;
- #endif//#ifdef DP_MSAC_C2_Time
- // check, if MSAC_C2 functions enabled
- if( msac_c2[dev_num].enabled )
- {
- // handle receive queue
- while( msac_c2[dev_num].read_rec_ptr != msac_c2[dev_num].write_rec_ptr )
- {
- // check cn_id
- msac_c2[dev_num].act_rec_ptr = &(msac_c2[dev_num].rec_queue[msac_c2[dev_num].read_rec_ptr]);
- sap_nr = msac_c2[dev_num].act_rec_ptr->sap_nr&0xff;//2009.11.7
- if(( sap_nr > MSAC_C2_SAP_NR_HIGH)||((MSAC_C2_SAP_NR_HIGH - sap_nr) >= msac_c2[dev_num].num_sap))
- {
- vpc3_errcb[dev_num].error_code = msac_c2[dev_num].act_rec_ptr->fdl_code;
- vpc3_errcb[dev_num].cn_id = sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }
- else
- {
- cn_id = MSAC_C2_SAP_NR_HIGH - sap_nr;
- if(cn_id >= DP_C2_NUM_SAPS)
- {
- vpc3_errcb[dev_num].error_code = msac_c2[dev_num].act_rec_ptr->fdl_code;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }
- else
- {
- // determine pointer of connection description
- connection_ptr = &(msac_c2[dev_num].connection_list[cn_id]);
- switch(msac_c2[dev_num].act_rec_ptr->fdl_code)
- {
- case MSAC_C2_IND_RECV:
- {
- msac_c2_realize_ind_recv(dev_num,connection_ptr, sap_nr);
- break;
- }
- case MSAC_C2_RESP_SENT:
- {
- msac_c2_realize_resp_sent(dev_num,connection_ptr, sap_nr);
- break;
- }
- case MSAC_C2_IND_DISABLE_DONE:
- {
- msac_c2_realize_ind_disable_done(dev_num,connection_ptr, sap_nr);
- break;
- }
- default:
- {
- vpc3_errcb[dev_num].error_code = msac_c2[dev_num].act_rec_ptr->fdl_code;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }
- }// switch (msac_c2_input_read_ptr->fdl_code)
- }//else
- }//else
- if(msac_c2[dev_num].read_rec_ptr != msac_c2[dev_num].end_rec_ptr)
- {
- msac_c2[dev_num].read_rec_ptr++;
- }
- else
- {
- msac_c2[dev_num].read_rec_ptr = msac_c2[dev_num].start_rec_ptr;
- }
- }//while( msac_c2[dev_num].read_rec_ptr != msac_c2[dev_num].write_rec_ptr )
- #ifdef DP_MSAC_C2_Time
- //check timer
- for(i = 0; i < DP_C2_NUM_SAPS; i++)
- {
- if( msac_c2[dev_num].connection_list[i].state != MSAC_C2_CS_CLOSE_CHANNEL ) //sign of free element
- {
- if( msac_c2[dev_num].connection_list[i].timer_active == TRUE )
- {
- // determine pointer of connection description
- connection_ptr = &(msac_c2[dev_num].connection_list[i]);
- if( msac_c2[dev_num].timer_list[connection_ptr->timer_id].running == FALSE )
- {
- //reset PCNTRL_RESP bit
- fdl_reset_pcntrl_resp_bit(dev_num,connection_ptr->sap_nr, FDL_PRIMARY_BUF);
- connection_ptr->timer_break = TRUE;
- //disable timer
- connection_ptr->timer_active = FALSE;
- //new description state
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- //set recognized-flag of user_break
- connection_ptr->user_break = MSAC_C2_UB_BREAK;
- connection_ptr->error_code = MSAC_C2_EC_REQ_TIMEOUT;
- //handle request pdu as disconnect-pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- //give the disconnect information to the user
- msac_c2_pdu_provide(dev_num,sap_nr, connection_ptr->buf_ptr_res);
- //handle pdu as disconnect-pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- msac_c2_send_response_data(dev_num,connection_ptr);
- }//if( msac_c2[dev_num].timer_list[connection_ptr->timer_id].running == FALSE )
- }//if( msac_c2[dev_num].connection_list[i].timer_active == TRUE )
- }//if( msac_c2[dev_num].connection_list[i].state != MSAC_C2_CS_CLOSE_CHANNEL )
- }//for(i = 0; i < DP_C2_NUM_SAPS; i++)
- #endif//#ifdef DP_MSAC_C2_Time
- }//if( msac_c2[dev_num].enabled )
- }//void msac_c2_process(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_pdu_provide(UBYTE dev_num,UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr) */
- /* */
- /* function: */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_pdu_provide(UBYTE dev_num, UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr )
- {
- DPV1_PTR dpv1_ptr;
- UBYTE data_opc;
- DPV1_RET_VAL ret_val;
- // determine pointer of indication netto data
- dpv1_ptr = (DPV1_PTR) &(buf_ptr->user_data[0]);
- data_opc = dpv1_ptr->read.function_num & MSAC_C2_FN_MASK;
- switch( data_opc )
- {
- case MSAC_C2_FN_DS_READ:
- {
- if( (BFWORD2BYTE(dpv1_ptr->read.length) > 0) && (BFWORD2BYTE(dpv1_ptr->read.length) <=240) && (BFWORD2BYTE(buf_ptr->data_len)) )
- {
- ret_val = user_dpv1_read_req(dev_num,sap_nr,dpv1_ptr);
- }//if( (dpv1_ptr->read.length > 0) && (dpv1_ptr->read.length <=240) )
- else
- {
- dpv1_ptr->neg.err_code1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_TYPE;
- dpv1_ptr->neg.err_code2 = 0x00;
- ret_val = DPV1_NOK;
- }//else of if( (dpv1_ptr->read.length > 0) && (dpv1_ptr->read.length <=240) )
- break;
- }//case MSAC_C2_FN_DS_READ:
- case MSAC_C2_FN_DS_WRITE:
- {
- if( BFWORD2BYTE(dpv1_ptr->write.length) > 0 )
- {
- ret_val = user_dpv1_write_req(dev_num,sap_nr,dpv1_ptr);
- }//if( dpv1_ptr->write.length > 0 )
- else
- {
- dpv1_ptr->neg.err_code1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_TYPE;
- dpv1_ptr->neg.err_code2 = 0x00;
- ret_val = DPV1_NOK;
- }//else of if( dpv1_ptr->write.length > 0 )
- break;
- }//case MSAC_C2_FN_DS_WRITE:
- case MSAC_C2_FN_DATA:
- {
- if( BFWORD2BYTE(dpv1_ptr->transport.length) > 0 )
- {
- ret_val = user_c2_data_transport_req(dev_num,sap_nr,dpv1_ptr);
- }//if( dpv1_ptr->transport.length > 0 )
- else
- {
- dpv1_ptr->neg.err_code1 = DPV1_ERRCL_ACCESS | DPV1_ERRCL_ACC_TYPE;
- dpv1_ptr->neg.err_code2 = 0x00;
- ret_val = DPV1_NOK;
- }//else of if( dpv1_ptr->transport.length > 0 )
- break;
- }//case MSAC_C2_FN_DATA:
- case MSAC_C2_FN_CONNECT:
- {
- ret_val = user_c2_initiate_req(dev_num,sap_nr,dpv1_ptr);
- break;
- }//case MSAC_C2_FN_CONNECT:
- case MSAC_C2_FN_DISCONNECT:
- {
- ret_val = user_c2_abort_ind(dev_num,sap_nr,dpv1_ptr);
- if( ret_val != DPV1_OK)
- {
- vpc3_errcb[dev_num].error_code = data_opc;
- vpc3_errcb[dev_num].cn_id = sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//if( ret_val != DPV1_OK)
- ret_val = DPV1_DELAY; // ABORT-function always do nothing
- break;
- }//case MSAC_C2_FN_DISCONNECT:
- default:
- {
- // Error unknown service
- vpc3_errcb[dev_num].error_code = data_opc;
- vpc3_errcb[dev_num].cn_id = sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }//default:
- }//switch( data_opc )
- switch( ret_val )
- {
- case DPV1_OK:
- {
- if( data_opc == MSAC_C2_FN_CONNECT )
- {
- buf_ptr->data_len = MSAC_C2_LEN_INITIATE_RES_HEAD + BFWORD2BYTE(dpv1_ptr->initiate_res.s_len) + BFWORD2BYTE(dpv1_ptr->initiate_res.d_len);
- }//if( data_opc == MSAC_C2_FN_CONNECT )
- else
- {
- if( data_opc == MSAC_C2_FN_DS_WRITE )
- {
- buf_ptr->data_len = DPV1_LEN_HEAD_DATA;
- }//if( data_opc == MSAC_C2_FN_DS_WRITE )
- else // for READ andd TRANSPORT length is defined by userdata
- {
- buf_ptr->data_len = BFWORD2BYTE(dpv1_ptr->read.length) + DPV1_LEN_HEAD_DATA;
- }//else of if( data_opc == MSAC_C2_FN_DS_WRITE )
- }//else of if( data_opc == MSAC_C2_FN_CONNECT )
- msac_c2_resp_pdu_provide(dev_num,sap_nr,buf_ptr);
- break;
- }//case DPV1_OK:
- case DPV1_NOK:
- {
- //user must create correct response-pdu
- buf_ptr->data_len = DPV1_LEN_NEG_RESPONSE;
- dpv1_ptr->neg.function_num |= DPV1_ERROR_BIT_RESPONSE;
- dpv1_ptr->neg.err_decode = DPV1_ERRDC_DPV1; /* always fixed */
- msac_c2_resp_pdu_provide(dev_num,sap_nr,buf_ptr);
- break;
- }//case DPV1_NOK:
- case DPV1_DELAY:
- {
- // do nothing
- break;
- }//case DPV1_DELAY:
- case DPV1_ABORT:
- {
- buf_ptr->data_len = MSAC_C2_LEN_DISCONNECT_PDU-1;
- dpv1_ptr->abort.function_num = MSAC_C2_FN_DISCONNECT | MSAC_C2_FUNCTION_NUM_EXTENSION;
- msac_c2_resp_pdu_provide(dev_num,sap_nr,buf_ptr);
- break;
- }//case DPV1_ABORT:
- default:
- {
- vpc3_errcb[dev_num].error_code = ret_val;
- vpc3_errcb[dev_num].cn_id = sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }//default:
- }//switch( ret_val )
- }//void msac_c2_pdu_provide(UBYTE dev_num, UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_realize_ind_recv(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, */
- /* UBYTE sap_nr) */
- /* */
- /* function: MSAC_C2 received a request-pdu. */
- /* Depend on the opcode */
- /* - the pdu is given to the user */
- /* (DATA, DISCONNECT), */
- /* - a response is provided (IDLE), */
- /* - a new connection is initialized (CONNECT). */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_realize_ind_recv(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- {
- union
- {
- MSAC_C2_CR_BUF_PTR data_ptr;
- MSAC_C2_INITIATE_REQ_PDU_PTR initiate_req;
- }pdu;
- MSAC_C2_DATA_BUF_PTR buf_ptr = msac_c2[dev_num].act_rec_ptr->buf_ptr;
- UBYTE timer_ret;
- UWORD poll_time_out;
- UBYTE data_opc;
- UBYTE cn_id = connection_ptr->cn_id;
- UBYTE initiate_s_d_len;
- //determine pointer of indication netto data
- pdu.data_ptr = (MSAC_C2_CR_BUF_PTR) &(buf_ptr->user_data[0]);
- data_opc = pdu.data_ptr->opcode & MSAC_C2_FN_MASK;
- //taking over opcode and buf_ptr into connection description
- connection_ptr->opcode = data_opc;
- connection_ptr->buf_ptr = buf_ptr;
- switch( connection_ptr->state )
- {
- // state after initialization
- case MSAC_C2_CS_AWAIT_CONNECT:
- {
- //taking over opcode and buf_ptr into connection description
- //connection_ptr->opcode = data_opc;
- //connection_ptr->buf_ptr = buf_ptr;
- // reset saved informations of msac_c2_disconnect(dev_num)
- connection_ptr->dr_reason_code = 0x00;
- connection_ptr->dr_location = 0x00;
- // set init value of error_code
- connection_ptr->error_code = MSAC_C2_EC_OK;
- // reset timer
- msac_c2[dev_num].timer_list[connection_ptr->timer_id].time_act = 0x0000;
- msac_c2[dev_num].timer_list[connection_ptr->timer_id].running = FALSE;
- connection_ptr->timer_break = FALSE;
- // s_len and d_len, must be correct set, if S/D-Typ is defined
- initiate_s_d_len = 0;
- initiate_s_d_len += (BFWORD2BYTE(pdu.initiate_req->s_type) == 0 ) ? 2 : BFWORD2BYTE(pdu.initiate_req->s_len);
- initiate_s_d_len += (BFWORD2BYTE(pdu.initiate_req->d_type) == 0 ) ? 2 : BFWORD2BYTE(pdu.initiate_req->d_len);
- if( data_opc != MSAC_C2_FN_CONNECT )
- {
- //changed V302 PNO testcase, wrong function number
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- connection_ptr->poll_time_out = msac_c2[dev_num].poll_time;
- //changed for Testcase RM11
- connection_ptr->error_code = MSAC_C2_EC_REMOTE_ERROR;
- //create disconnect pdu */
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- msac_c2_send_response_data(dev_num,connection_ptr);
- //manipulate the item of timer_break, because
- //msac_c2_send_response_data(dev_num) was called without
- //a previous MSAC_C2_START_TIMER
- connection_ptr->timer_break = FALSE;
- connection_ptr->state = MSAC_C2_CS_DISABLE_CONNECT;
- fdl_ind_disable(dev_num,sap_nr); //close SAP, answer POLL request with RS
- }//if( data_opc != MSAC_C2_FN_CONNECT )
- else
- if( ( (BFWORD2BYTE(pdu.initiate_req->s_type) == 0) && ( BFWORD2BYTE(pdu.initiate_req->s_len) != 2 ) )
- || ( (BFWORD2BYTE(pdu.initiate_req->d_type) == 0) && ( BFWORD2BYTE(pdu.initiate_req->d_len) != 2 ) )
- )
- {
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- connection_ptr->poll_time_out = msac_c2[dev_num].poll_time;
- //changed for Testcase RM11
- connection_ptr->error_code = MSAC_C2_EC_REMOTE_ERROR;
- //create disconnect pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- msac_c2_send_response_data(dev_num,connection_ptr);
- //manipulate the item of timer_break, because
- //msac_c2_send_response_data(dev_num) was called without
- //a previous MSAC_C2_START_TIMER
- connection_ptr->timer_break = FALSE;
- }//else if( (buf_ptr->data_len < MSAC_C2_MIN_CR_PDU_SIZE) || ...
- else if( (BFWORD2BYTE(buf_ptr->data_len) < MSAC_C2_MIN_CR_PDU_SIZE) ||
- (BFWORD2BYTE(buf_ptr->data_len) < MSAC_C2_MIN_CR_PDU_SIZE -4 + initiate_s_d_len) )
- {
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- connection_ptr->poll_time_out = msac_c2[dev_num].poll_time;
- //changed for Testcase RM11
- connection_ptr->error_code = MSAC_C2_EC_INV_S_D_LEN_ERR;
- //create disconnect pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- msac_c2_send_response_data(dev_num,connection_ptr);
- //manipulate the item of timer_break, because
- //msac_c2_send_response_data(dev_num) was called without
- //a previous MSAC_C2_START_TIMER
- connection_ptr->timer_break = FALSE;
- }//else if( (buf_ptr->data_len < MSAC_C2_MIN_CR_PDU_SIZE) || ...
- else
- {
- //connect-pdu
- //handle poll_timeout
- #ifdef LITTLE_ENDIAN
- poll_time_out = BFLONG2WORD(pdu.data_ptr->poll_time_out);
- #else
- poll_time_out = BFLONG2WORD(SWAP_LONG(pdu.data_ptr->poll_time_out ));
- #endif
- // TRACE("Pooltimeout: %d", poll_time_out);
- if( msac_c2[dev_num].poll_time > poll_time_out )
- {
- poll_time_out = msac_c2[dev_num].poll_time;
- }//if( msac_c2[dev_num].poll_time > poll_time_out )
- connection_ptr->poll_time_out = poll_time_out;
- timer_ret = msac_c2_start_timer(dev_num,connection_ptr->timer_id, poll_time_out);
- if( timer_ret != MSAC_C2_TIMER_OK )
- {
- vpc3_errcb[dev_num].error_code = timer_ret;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//if( timer_ret != MSAC_C2_TIMER_OK )
- else
- {
- // set connection state
- connection_ptr->state = MSAC_C2_CS_PROVIDE_IND;
- msac_c2_pdu_provide(dev_num,sap_nr, buf_ptr);
- connection_ptr->timer_active = TRUE;
- }//else of if( timer_ret != MSAC_C2_TIMER_OK )
- }//else of if( data_opc != MSAC_C2_FN_CONNECT )
- break;
- }//case MSAC_C2_CS_AWAIT_CONNECT:
- // state after successfully intiate indication
- case MSAC_C2_CS_AWAIT_IND:
- {
- // Check PollTimeOut
- timer_ret = msac_c2_start_timer(dev_num,connection_ptr->timer_id, connection_ptr->poll_time_out);
- //There was a poll_time_out. The timeout-request
- //is behind this request in the input queue.
- //This subject is without importance in this case.
- if( timer_ret == MSAC_C2_TIMER_OK )
- {
- connection_ptr->timer_break = TRUE;
- }//if( timer_ret == MSAC_C2_TIMER_OK )
- if( data_opc == MSAC_C2_FN_DISCONNECT )
- {
- //disable timer
- connection_ptr->timer_active = FALSE;
- if(connection_ptr->user_break != MSAC_C2_UB_NO_BREAK)
- {
- // set recognized-flag of user_break
- connection_ptr->user_break = MSAC_C2_UB_BREAK;
- }
- else
- {
- connection_ptr->error_code = MSAC_C2_EC_DC_BY_MASTER;
- // create dr pdu in reserved buffer
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- // disconnet to user always by buf_ptr_res
- msac_c2_pdu_provide(dev_num,sap_nr , connection_ptr->buf_ptr_res);
- }
- connection_ptr->state = MSAC_C2_CS_DISABLE_CONNECT;
- fdl_ind_disable(dev_num,sap_nr);
- }//if( data_opc == MSAC_C2_FN_DISCONNECT )
- else
- {
- // data_opc != DPV2_FN_DISCONNECT
- #ifdef DP_MSAC_C2_Time
- if( (connection_ptr->user_break != MSAC_C2_UB_NO_BREAK)
- || (connection_ptr->timer_break == TRUE ) )
- #else
- if( (connection_ptr->user_break != MSAC_C2_UB_NO_BREAK) )
- #endif //#ifdef DP_MSAC_C2_Time
- {
- //disable timer
- connection_ptr->timer_active = FALSE;
- //new description state */
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- //set recognized-flag of user_break */
- connection_ptr->user_break = MSAC_C2_UB_BREAK;
- if( connection_ptr->timer_break == TRUE )
- {
- connection_ptr->error_code = MSAC_C2_EC_REQ_TIMEOUT;
- //handle request pdu as disconnect-pdu */
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- //give the disconnect information to the user */
- msac_c2_pdu_provide(dev_num,sap_nr, connection_ptr->buf_ptr_res);
- }//if( connection_ptr->timer_break == TRUE )
- else
- {
- connection_ptr->error_code = MSAC_C2_EC_DC_BY_USER;
- }//else of if( connection_ptr->timer_break == TRUE )
- //handle pdu as disconnect-pdu */
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- msac_c2_send_response_data(dev_num,connection_ptr);
- }//if( (connection_ptr->user_break != MSAC_C2_UB_NO_BREAK)
- else
- {
- //no user break
- if( data_opc == MSAC_C2_FN_IDLE )
- {
- //handle response data */
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- msac_c2_send_response_data(dev_num,connection_ptr);
- }//if( data_opc == MSAC_C2_FN_IDLE )
- else
- {
- timer_ret = msac_c2_start_timer(dev_num,connection_ptr->timer_id, connection_ptr->poll_time_out);
- //There was a request_time_out. The timeout-request */
- //is behind this request in the input queue. */
- //Set a note and reject later the timeout-request. */
- if( timer_ret == MSAC_C2_TIMER_OK )
- {
- connection_ptr->timer_break = TRUE; //DP_TRUE
- }//if( timer_ret == MSAC_C2_TIMER_OK )
- switch( data_opc )
- {
- case MSAC_C2_FN_DATA:
- case MSAC_C2_FN_DS_READ:
- case MSAC_C2_FN_DS_WRITE:
- {
- //save buf_ptr */
- //connection_ptr->buf_ptr = buf_ptr;
- //new description state */
- connection_ptr->state = MSAC_C2_CS_PROVIDE_IND;
- msac_c2_pdu_provide(dev_num,sap_nr, buf_ptr);
- break;
- }//case MSAC_C2_FN_DATA:
- default:
- {
- //invalid opc
- //set error code
- connection_ptr->error_code = MSAC_C2_EC_REMOTE_ERROR;
- //handle request pdu as disconnect-pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- //give the disconnect information to the user
- msac_c2_pdu_provide(dev_num,sap_nr, connection_ptr->buf_ptr_res);
- //msac_c2_pdu_provide(dev_num,sap_nr, connection_ptr->buf_ptr);
- //handle response pdu as disconnect-pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- //new description state
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- msac_c2_send_response_data(dev_num,connection_ptr);
- break;
- }//default:
- }//switch( data_opc )
- }//else of if( data_opc == MSAC_C2_FN_IDLE )
- }//else of if( (connection_ptr->user_break != MSAC_C2_UB_NO_BREAK)
- }//else of if( data_opc == MSAC_C2_FN_DISCONNECT )
- break;
- }//case MSAC_C2_CS_AWAIT_IND:
- case MSAC_C2_CS_PROVIDE_RESP:
- {
- //V302; special behavior for Testcase 2C6
- if( data_opc == MSAC_C2_FN_DISCONNECT )
- {
- connection_ptr->timer_active = FALSE;
- connection_ptr->error_code = MSAC_C2_EC_DC_BY_MASTER;
- // create dr pdu in reserved buffer
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- // disconnet to user always by buf_ptr_res
- msac_c2_pdu_provide(dev_num,sap_nr , connection_ptr->buf_ptr_res);
- connection_ptr->state = MSAC_C2_CS_DISABLE_CONNECT;
- fdl_ind_disable(dev_num,sap_nr);
- }//if( data_opc == MSAC_C2_FN_DISCONNECT )
- break;
- }//case MSAC_C2_CS_PROVIDE_RESP:
- //not allowed here
- case MSAC_C2_CS_DISABLE_CONNECT:
- case MSAC_C2_CS_CLOSE_CHANNEL:
- case MSAC_C2_CS_PROVIDE_IND:
- default:
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->state;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }//default
- }//switch( connection_ptr->state )
- }//void msac_c2_realize_ind_recv(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_realize_resp_sent(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, */
- /* UBYTE sap_nr ) */
- /* */
- /* function: A response pdu was sent to the master. Gives the */
- /* confirmation to the user and realizes the timer handling. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_realize_resp_sent(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- {
- UBYTE timer_ret;
- UBYTE cn_id = connection_ptr->cn_id;
- UBYTE opc = connection_ptr->opcode;
- UBYTE no_action = FALSE;
- UBYTE fatal_state = FALSE;
- //check return value
- if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- {
- //check connection state
- switch( connection_ptr->state )
- {
- case MSAC_C2_CS_PROVIDE_RESP:
- {
- break;
- }//case MSAC_C2_CS_PROVIDE_RESP:
- case MSAC_C2_CS_DISABLE_CONNECT:
- {
- switch (connection_ptr->error_code)
- {
- //V302; special behavior for Testcase 2C6
- case MSAC_C2_EC_DC_BY_MASTER:
- {
- //do nothing here, there was a ABORT before
- no_action = TRUE;
- break;
- }
- default:
- {
- fatal_state = TRUE;
- }
- }
- break;
- }//case MSAC_C2_CS_DISABLE_CONNECT:
- case MSAC_C2_CS_CLOSE_CHANNEL:
- case MSAC_C2_CS_AWAIT_CONNECT:
- case MSAC_C2_CS_AWAIT_IND:
- case MSAC_C2_CS_PROVIDE_IND:
- default:
- {
- fatal_state = TRUE;
- break;
- }//default:
- }//switch( connection_ptr->state )
- if( fatal_state )
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->state;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//if( fatal_state )
- if( !no_action )
- {
- switch( opc )
- {
- case MSAC_C2_FN_IDLE:
- case MSAC_C2_FN_DATA:
- case MSAC_C2_FN_DS_READ:
- case MSAC_C2_FN_DS_WRITE:
- case MSAC_C2_FN_CONNECT:
- {
- //start request_time_out
- timer_ret = msac_c2_start_timer(dev_num,connection_ptr->timer_id, (dev_num,connection_ptr->poll_time_out << 1));
- //There was a request_time_out. The timeout-request
- //is behind this request in the input queue.
- //Set a note and reject later the timeout-request.
- if( timer_ret == MSAC_C2_TIMER_OK )
- {
- connection_ptr->timer_break = TRUE;
- }//if( timer_ret == MSAC_C2_TIMER_OK )
- //new description state
- connection_ptr->state = MSAC_C2_CS_AWAIT_IND;
- break;
- }//case MSAC_C2_FN_IDLE:
- case MSAC_C2_FN_DISCONNECT:
- {
- //stop PollTimeOut */
- timer_ret = msac_c2_stop_timer(dev_num,connection_ptr->timer_id);
- //There was a poll_time_out. The timeout-request
- //is behind this request in the input queue.
- //This subject is without importance in this case.
- if( timer_ret == MSAC_C2_TIMER_ALREADY_STOPPED )
- {
- connection_ptr->timer_break = TRUE;
- }//if( timer_ret == MSAC_C2_TIMER_ALREADY_STOPPED )
- connection_ptr->state = MSAC_C2_CS_DISABLE_CONNECT;
- fdl_ind_disable(dev_num,sap_nr);
- break;
- }//case MSAC_C2_FN_DISCONNECT:
- default:
- {
- //internal error: invalid opcode */
- vpc3_errcb[dev_num].error_code = connection_ptr->opcode;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//default:
- }//switch( opc )
- }//if( !no_action )
- }//if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- else
- {
- vpc3_errcb[dev_num].error_code = msac_c2[dev_num].act_rec_ptr->ret_value;
- vpc3_errcb[dev_num].cn_id = cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//else of if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- }//void msac_c2_realize_resp_sent(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_realize_ind_disable_done(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, */
- /* UBYTE sap_nr ) */
- /* */
- /* function: A sap was deactivated. Give the confirmation to the user. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_realize_ind_disable_done(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- {
- if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- {
- if( connection_ptr->state == MSAC_C2_CS_DISABLE_CONNECT )
- {
- switch( connection_ptr->error_code )
- {
- case MSAC_C2_EC_USER_ERR:
- case MSAC_C2_EC_DC_BY_USER:
- case MSAC_C2_EC_DC_BY_MASTER:
- case MSAC_C2_EC_REMOTE_ERROR:
- case MSAC_C2_EC_INV_S_D_LEN_ERR: //Testcase RM11
- {
- //give a new connection resource to rm sap */
- msac_c2_call_ind_await(dev_num,connection_ptr);
- break;
- }//case MSAC_C2_EC_USER_ERR:
- case MSAC_C2_EC_REQ_TIMEOUT:
- {
- msac_c2_dc_user_indication(dev_num,connection_ptr);
- break;
- }//case MSAC_C2_EC_REQ_TIMEOUT:
- default:
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->error_code;
- vpc3_errcb[dev_num].cn_id = connection_ptr->cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//default:
- }//switch( connection_ptr->error_code )
- }//if( connection_ptr->state == MSAC_C2_CS_DISABLE_CONNECT )
- else
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->state;
- vpc3_errcb[dev_num].cn_id = connection_ptr->cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//else of if( connection_ptr->state == MSAC_C2_CS_DISABLE_CONNECT )
- }//if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- else
- {
- vpc3_errcb[dev_num].error_code = msac_c2[dev_num].act_rec_ptr->ret_value;
- vpc3_errcb[dev_num].cn_id = sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//else of if( msac_c2[dev_num].act_rec_ptr->ret_value == MSAC_C2_EC_OK )
- }//void msac_c2_realize_ind_disable_done(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE sap_nr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_dc_user_indication(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr) */
- /* */
- /* function: A sap was deactivated. Give the confirmation to the user. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_dc_user_indication(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- {
- //give a new connection resource to rm sap
- msac_c2_call_ind_await(dev_num,connection_ptr);
- //create disconnect pdu
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_REQ_DIRECTION);
- msac_c2_pdu_provide(dev_num,connection_ptr->sap_nr, connection_ptr->buf_ptr_res);
- }//void msac_c2_dc_user_indication(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_confirm_close_request(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr) */
- /* */
- /* function: The function realizes the close handling of a connection */
- /* after a close_channel request. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_confirm_close_request(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- {
- UBYTE i = 0;
- UBYTE all_closed;
- connection_ptr->user_break = MSAC_C2_UB_NO_BREAK;
- msac_c2_stop_timer(dev_num,connection_ptr->timer_id);
- connection_ptr->state = MSAC_C2_CS_CLOSE_CHANNEL;
- do
- {
- all_closed = (msac_c2[dev_num].connection_list[i].state == MSAC_C2_CS_CLOSE_CHANNEL);
- i++;
- }
- while( all_closed && (i < DP_C2_NUM_SAPS) );
- if( all_closed )
- {
- msac_c2[dev_num].close_channel_request = FALSE; //DP_FALSE */
- }// if( all_closed )
- }//void msac_c2_confirm_close_request(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* UBYTE msac_c2_transmit_delay(UBYTE dev_num,UBYTE sap_nr, UBYTE status, DPV1_PTR pdu_ptr)*/
- /* */
- /* function: msac_c2_transmit_delay receives response data from the user. */
- /* In this function the response data are checked. In dependence */
- /* of the pdu-opcode und the status the length of the data and */
- /* the function-code is manipulated. Then the dpv1_msc2 transmit */
- /* function is called. */
- /* */
- /* return codes: DPV1_OK ( transmit function is called ) */
- /* C2_ENABLED_ERROR ( C2 service not supported ) */
- /* C2_INV_CN_ID ( invalid connection ident ) */
- /* C2_USER_ERR ( invalid response data ) */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode UBYTE msac_c2_transmit_delay(UBYTE dev_num, UBYTE sap_nr, UBYTE status, DPV1_PTR pdu_ptr )
- {
- MSAC_C2_CONNECT_ITEM_PTR connection_ptr;
- DPV1_PTR dpv1_ptr;
- UBYTE data_opc;
- UBYTE ret_value;
- //check, if MSAC_C2 functions enabled
- if( msac_c2[dev_num].enabled )
- {
- //check, if valid sap
- if( ( sap_nr > MSAC_C2_SAP_NR_HIGH ) || ( (MSAC_C2_SAP_NR_HIGH - sap_nr) >= msac_c2[dev_num].num_sap) )
- {
- ret_value = C2_INV_CN_ID;
- }//if( ( sap_nr > MSAC_C2_SAP_NR_HIGH ) || ( (MSAC_C2_SAP_NR_HIGH - sap_nr) >= msac_c2[dev_num].num_sap) )
- else
- {
- // determine connection_ptr
- connection_ptr = &(msac_c2[dev_num].connection_list[MSAC_C2_SAP_NR_HIGH - sap_nr]);
- //check, if valid buf_ptr
- if( pdu_ptr != (DPV1_PTR)&(connection_ptr->buf_ptr->user_data[0]) )
- {
- ret_value = C2_USER_ERR;
- }//if( pdu_ptr != (DPV1_PTR)&(connection_ptr->buf_ptr->user_data[0]) )
- else
- {
- dpv1_ptr = (DPV1_PTR)&(connection_ptr->buf_ptr->user_data[0]);
- data_opc = dpv1_ptr->response.function_num & MSAC_C2_FN_MASK;
- ret_value = DPV1_OK;
- switch( status )
- {
- case DPV1_OK:
- {
- if( data_opc == MSAC_C2_FN_CONNECT )
- {
- connection_ptr->buf_ptr->data_len = MSAC_C2_LEN_INITIATE_RES_HEAD + BFWORD2BYTE(dpv1_ptr->initiate_res.s_len) + BFWORD2BYTE(dpv1_ptr->initiate_res.d_len);
- }//if( data_opc == MSAC_C2_FN_CONNECT )
- else
- {
- if( data_opc == MSAC_C2_FN_DS_WRITE )
- {
- connection_ptr->buf_ptr->data_len = DPV1_LEN_HEAD_DATA;
- }//if( data_opc == MSAC_C2_FN_DS_WRITE )
- else
- {
- //for READ andd TRANSPORT length is defined by userdata
- connection_ptr->buf_ptr->data_len = BFWORD2BYTE(dpv1_ptr->response.length) + DPV1_LEN_HEAD_DATA;
- }//else of if( data_opc == MSAC_C2_FN_DS_WRITE )
- }//else of if( data_opc == MSAC_C2_FN_CONNECT )
- msac_c2_resp_pdu_provide(dev_num,sap_nr,connection_ptr->buf_ptr);
- break;
- }//case DPV1_OK:
- case DPV1_NOK:
- {
- //User must create correct response-pdu */
- connection_ptr->buf_ptr->data_len = DPV1_LEN_NEG_RESPONSE;
- dpv1_ptr->neg.function_num |= DPV1_ERROR_BIT_RESPONSE;
- dpv1_ptr->neg.err_decode = DPV1_ERRDC_DPV1;
- msac_c2_resp_pdu_provide(dev_num,sap_nr,connection_ptr->buf_ptr);
- break;
- }//case DPV1_NOK:
- case DPV1_ABORT:
- {
- connection_ptr->buf_ptr->data_len = MSAC_C2_LEN_DISCONNECT_PDU-1;
- dpv1_ptr->abort.function_num = MSAC_C2_FN_DISCONNECT | MSAC_C2_FUNCTION_NUM_EXTENSION;
- //DPV2S_CTRL_REASON_ABORT(dev_num,dat_ptr.abort->subnet,dat_ptr.abort->instance_reason)
- msac_c2_resp_pdu_provide(dev_num,sap_nr,connection_ptr->buf_ptr);
- break;
- }//case DPV1_ABORT:
- default:
- {
- ret_value = C2_USER_ERR;
- break;
- }//default:
- }//switch( status )
- }//else of if( pdu_ptr != (DPV1_PTR)&(connection_ptr->buf_ptr->user_data[0]) )
- }//else of if( ( sap_nr > MSAC_C2_SAP_NR_HIGH ) || ( (MSAC_C2_SAP_NR_HIGH - sap_nr) >= msac_c2[dev_num].num_sap) )
- }//if( msac_c2[dev_num].enabled )
- else
- {
- ret_value = C2_ENABLED_ERROR;
- }//else of if( msac_c2[dev_num].enabled )
- return(ret_value );
- }//UBYTE msac_c2_transmit_delay(UBYTE dev_num, UBYTE sap_nr, UBYTE status, DPV1_PTR pdu_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* UBYTE msac_c2_initiate_req_to_res(UBYTE dev_num,DPV1_PTR pdu_ptr) */
- /* */
- /* function: function helps user to create an initiate-response */
- /* the response is only created, if the slave is endpoint of the */
- /* connection. Otherwise the puffer is untouched. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode UBYTE msac_c2_initiate_req_to_res(UBYTE dev_num, DPV1_PTR pdu )
- {
- UBYTE ret_value;
- UBYTE S_typ;
- UBYTE S_len;
- UBYTE i;
- //pay attention: same address, Response Buffer is shorter than Request ! sequence!
- //first 3 Octets reseved, then Send_Timeout (2Byte) no more used
- //only Max_pdu_lge (1Byte) >> 4Bytes difference
- //buffer is changed, only if D-Typ = 0, end point of connection
- ret_value = DPV1_NOK;
- if( BFWORD2BYTE(pdu->initiate_req.d_type) == 0 )
- {
- pdu->initiate_res.max_len_data_unit = msac_c2[dev_num].pdu_len; //Length of Init-Data
- pdu->initiate_res.features_supported1 = C2_FEATURES_SUPPORTED_1;
- pdu->initiate_res.features_supported2 = C2_FEATURES_SUPPORTED_2;
- pdu->initiate_res.profile_features_supported1 = C2_PROFILE_FEATURES_1;
- pdu->initiate_res.profile_features_supported2 = C2_PROFILE_FEATURES_2;
- pdu->initiate_res.profile_ident_nummer = BFWORD2LONG(C2_PROFILE_NUMBER);
- //D-Typ and S-Typ changed position */
- pdu->initiate_res.s_type = pdu->initiate_req.d_type;
- pdu->initiate_res.s_len = pdu->initiate_req.d_len;
- S_typ = BFWORD2BYTE(pdu->initiate_req.s_type); //save S_typ
- pdu->initiate_res.d_type = S_typ; //copy S_typ in buffer
- S_len = BFWORD2BYTE(pdu->initiate_req.s_len); //save S_len
- pdu->initiate_res.d_len = S_len; //copy S_len in buffer
- //lge/type S
- pdu->initiate_res.addr_data[0] = pdu->initiate_req.addr_data[S_len +0];
- pdu->initiate_res.addr_data[1] = pdu->initiate_req.addr_data[S_len +1];
- //after this point S-len is destroyed */
- //copy add. address */
- if( S_typ == 0 )
- {
- //if S-Typ =0 */
- pdu->initiate_res.addr_data[2+0] = pdu->initiate_req.addr_data[0];
- pdu->initiate_res.addr_data[2+1] = pdu->initiate_req.addr_data[1];
- }//if( S_typ == 0 )
- else
- {
- for( i=0; i < S_len; i++ )
- {
- pdu->initiate_res.addr_data[2+i] = pdu->initiate_req.addr_data[i];
- }//for( i=0; i < S_len; i++ )
- }//else of if( S_typ == 0 )
- ret_value = DPV1_OK;
- }//if( pdu->initiate_req.d_type == 0 )
- return ret_value;
- }//UBYTE msac_c2_initiate_req_to_res(UBYTE dev_num, DPV1_PTR pdu )
- /*---------------------------------------------------------------------------*/
- /* */
- /* DP_ERROR_CODE msac_c2_init (UBYTE dev_num) */
- /* */
- /* function: This function is called by the user. It initializes the */
- /* variables of MSAC_C2 connections */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode DP_ERROR_CODE msac_c2_init(UBYTE dev_num)
- {
- DP_ERROR_CODE error;
- UBYTE i;
- error = DP_OK;
- memset(&msac_c2[dev_num], 0, sizeof(MSAC2_STRUC));//2009.4.3
- // check sap
- if( ( dp_sys[dev_num].c2_num_saps <= MSAC_C2_SAP_NR_HIGH )
- && ( dp_sys[dev_num].c2_num_saps <= DP_C2_NUM_SAPS )
- )
- {
- // check c2_len
- if( ( dp_sys[dev_num].c2_len >= MSAC_C2_MIN_CR_PDU_SIZE )
- && ( dp_sys[dev_num].c2_len <= MSAC_C2_MAX_PDU )
- )
- {
- msac_c2[dev_num].poll_time = MSAC_C2_TIMEOUT_1_5MBAUD;
- //changed V302
- msac_c2[dev_num].pdu_len = DP_C2_LEN-4;
- msac_c2[dev_num].num_sap = DP_C2_NUM_SAPS;
- // init connection list
- for( i = 0; i < DP_C2_NUM_SAPS; i++ )
- {
- msac_c2[dev_num].connection_list[i].sap_nr = MSAC_C2_SAP_NR_HIGH - i;
- msac_c2[dev_num].connection_list[i].state = MSAC_C2_CS_CLOSE_CHANNEL; //sign of free element */
- msac_c2[dev_num].connection_list[i].cn_id = i;
- msac_c2[dev_num].connection_list[i].timer_id = i;
- msac_c2[dev_num].connection_list[i].timer_break = FALSE;
- msac_c2[dev_num].connection_list[i].timer_active = FALSE;
- msac_c2[dev_num].connection_list[i].user_break = MSAC_C2_UB_NO_BREAK;
- msac_c2[dev_num].connection_list[i].buf_ptr_res = (MSAC_C2_DATA_BUF PTR_ATTR *) &(msac_c2[dev_num].reserve_buffer[i]);
- msac_c2[dev_num].connection_list[i].dr_reason_code = 0x00;
- msac_c2[dev_num].connection_list[i].dr_location = 0x00;
- }
- //init memory item for close_channel request of the user */
- msac_c2[dev_num].close_channel_request = FALSE;
- // initialize receive queue */
- msac_c2[dev_num].start_rec_ptr = 0;
- msac_c2[dev_num].write_rec_ptr = msac_c2[dev_num].start_rec_ptr;
- msac_c2[dev_num].read_rec_ptr = msac_c2[dev_num].start_rec_ptr;
- msac_c2[dev_num].end_rec_ptr = MSAC_C2_MAX_INPUT_ITEMS-1;
- // enable msac_c2-functions
- msac_c2[dev_num].enabled = TRUE;
- }//if( (dp_sys[dev_num].c2_len >= MSAC_C2_MIN_CR_PDU_SIZE ) ...
- else
- {
- error = C2_DATA_LEN_ERROR;
- }//else of if( (dp_sys[dev_num].c2_len >= MSAC_C2_MIN_CR_PDU_SIZE ) ...
- }//if( ( dp_sys[dev_num].c2_num_saps <= MSAC_C2_SAP_NR_HIGH ) ...
- else
- {
- error = C2_DATA_SAP_ERROR;
- }//else of if( ( dp_sys[dev_num].c2_num_saps <= MSAC_C2_SAP_NR_HIGH ) ...
- return error;
- }//DP_ERROR_CODE msac_c2_init(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* function: msac_c2_set_timeout */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_set_timeout(UBYTE dev_num)
- {
- switch( VPC3_GET_BAUDRATE(dev_num) )
- {
- case BAUDRATE_500KBAUD:
- {
- msac_c2[dev_num].poll_time = MSAC_C2_TIMEOUT_500KBAUD;
- break;
- }
- case BAUDRATE_187_50KBAUD:
- case BAUDRATE_93_75KBAUD:
- case BAUDRATE_45_45KBAUD:
- case BAUDRATE_19_20KBAUD:
- case BAUDRATE_9_60KBAUD:
- {
- msac_c2[dev_num].poll_time = MSAC_C2_TIMEOUT_187_50KBAUD;
- break;
- }
- default:
- {
- msac_c2[dev_num].poll_time = MSAC_C2_TIMEOUT_1_5MBAUD;
- break;
- }
- }//switch( VPC3_GET_BAUDRATE(dev_num) )
- fdl_set_poll_timeout(dev_num, msac_c2[dev_num].poll_time );
- }//void msac_c2_set_timeout(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_open_channel_sap(UBYTE dev_num,UBYTE sap_nr) */
- /* */
- /* function: internal function */
- /* activate sap */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_open_channel_sap(UBYTE dev_num, UBYTE sap_nr )
- {
- UBYTE i = 0;
- while( (msac_c2[dev_num].connection_list[i].sap_nr&0xff) != (sap_nr&0xff) )//2009.11.7
- {
- i++;
- }//while( msac_c2[dev_num].connection_list[i].sap_nr != sap_nr )
- msac_c2[dev_num].connection_list[i].state = MSAC_C2_CS_AWAIT_CONNECT;
- }//void msac_c2_open_channel_sap(UBYTE dev_num, UBYTE sap_nr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* DP_ERROR_CODE msac_c2_open_channel (UBYTE dev_num) */
- /* */
- /* function: implementation of open_channel-function, analyze the data, */
- /* allocate timer for sap 49, activate sap 49 */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode DP_ERROR_CODE msac_c2_open_channel(UBYTE dev_num)
- {
- DP_ERROR_CODE error;
- //check, if msac_c2-functions enabled
- if( msac_c2[dev_num].enabled )
- {
- //check connection state: connection 0 represents the connection description
- if( msac_c2[dev_num].connection_list[0].state == MSAC_C2_CS_CLOSE_CHANNEL )
- {
- error = DP_OK;
- if( fdl_open_channel(dev_num) == FDL_OK )
- {
- //set description state of connection
- msac_c2[dev_num].connection_list[0].state = MSAC_C2_CS_AWAIT_CONNECT;
- //assign connection resource of lower layer
- if( fdl_ind_await(dev_num,msac_c2[dev_num].connection_list[0].sap_nr) != FDL_OK )
- {
- error = C2_NO_CONN_RESOURCE;
- }//if( fdl_ind_await(dev_num,msac_c2[dev_num].connection_list[0].sap_nr) != FDL_OK )
- }//if( fdl_open_channel(dev_num) == FDL_OK )
- else
- {
- error = C2_INV_LOWER_LAYER;
- }//else of if( fdl_open_channel(dev_num) == FDL_OK )
- }//if( msac_c2[dev_num].connection_list[0].state == MSAC_C2_CS_CLOSE_CHANNEL )
- else
- {
- //function is called twice
- error = C2_RESOURCE_ERROR;
- }//else of if( msac_c2[dev_num].connection_list[0].state == MSAC_C2_CS_CLOSE_CHANNEL )
- }//if( msac_c2[dev_num].enabled )
- else
- {
- error = C2_ENABLED_ERROR;
- }//else of if( msac_c2[dev_num].enabled )
- return error;
- }//DP_ERROR_CODE msac_c2_open_channel(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_create_disconnect_pdu(UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr, */
- /* UBYTE direction) */
- /* */
- /* function: internal function */
- /* manipulate or create a pdu as disconnect pdu */
- /* Note: A disconnect pdu to the user is always to */
- /* send by the reserved buffer. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_create_disconnect_pdu(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, MSAC2_DIRECTION direction )
- {
- MSAC_C2_DATA_BUF_PTR data_ptr; //pointer to data buffer */
- MSAC_C2_DR_BUF_PTR dc_buf_ptr; //pointer to disconnect pdu */
- UBYTE dr_location = MSAC_C2_SUBNET_NO;
- UBYTE dr_error;
- //disable timer */
- connection_ptr->timer_active = FALSE;
- switch( connection_ptr->error_code )
- {
- case MSAC_C2_EC_DC_BY_MASTER:
- {
- //read the source information of dr pdu */
- data_ptr = connection_ptr->buf_ptr;
- dc_buf_ptr = (MSAC_C2_DR_BUF_PTR) &(data_ptr->user_data[0]);
- dr_location = dc_buf_ptr->location;
- dr_error = dc_buf_ptr->reason_code;
- break;
- }
- case MSAC_C2_EC_USER_ERR:
- {
- dr_error = MSAC_C2_ABT_IV | MSAC_C2_INSTANCE_MSAC_C2;
- break;
- }
- case MSAC_C2_EC_INV_S_D_LEN_ERR:
- {
- dr_error = MSAC_C2_ABT_IA | MSAC_C2_INSTANCE_MSAC_C2;
- break;
- }
- case MSAC_C2_EC_REQ_TIMEOUT:
- {
- dr_error = MSAC_C2_ABT_TO | MSAC_C2_INSTANCE_MSAC_C2;
- break;
- }
- case MSAC_C2_EC_REMOTE_ERROR:
- {
- dr_error = MSAC_C2_ABT_FE | MSAC_C2_INSTANCE_MSAC_C2;
- break;
- }
- case MSAC_C2_EC_DC_BY_USER:
- {
- dr_location = connection_ptr->dr_location;
- dr_error = (connection_ptr->dr_reason_code) | MSAC_C2_INSTANCE_USER;
- break;
- }
- default:
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->error_code;
- vpc3_errcb[dev_num].cn_id = connection_ptr->cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }
- }//end switch */
- //define destination pointer */
- if( direction == MSAC_C2_RESP_DIRECTION )
- data_ptr = connection_ptr->buf_ptr;
- else //MSAC_C2_REQ_DIRECTION */
- data_ptr = connection_ptr->buf_ptr_res;
- data_ptr->data_len = MSAC_C2_LEN_DISCONNECT_PDU -1;
- dc_buf_ptr = (MSAC_C2_DR_BUF_PTR) &(data_ptr->user_data[0]);
- //fill dr pdu */
- dc_buf_ptr->opcode = MSAC_C2_FN_DISCONNECT | MSAC_C2_FUNCTION_NUM_EXTENSION;
- dc_buf_ptr->location = dr_location;
- dc_buf_ptr->reason_code = dr_error;
- dc_buf_ptr->reserved = (UBYTE) 0;
- connection_ptr->opcode = MSAC_C2_FN_DISCONNECT;
- if( direction == MSAC_C2_REQ_DIRECTION )
- {
- data_ptr->fc = MSAC_C2_FC_SRD_L;
- }//if( direction == MSAC_C2_REQ_DIRECTION )
- }//void msac_c2_create_disconnect_pdu(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr, UBYTE direction )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_send_response_data (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr) */
- /* */
- /* function: internal function */
- /* send response data to fdl (without wait pdu) */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_send_response_data(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- {
- //There was a timeout. The timeout-request
- //is behind this request in the input queue.
- //Set a note and reject later the timeout-request.
- if( msac_c2_start_timer(dev_num,connection_ptr->timer_id, connection_ptr->poll_time_out) == MSAC_C2_TIMER_OK)
- {
- connection_ptr->timer_break = TRUE;
- }
- //update fc for response */
- connection_ptr->buf_ptr->fc = FC_RESP_L;
- fdl_resp_provide(dev_num,connection_ptr->sap_nr, FDL_PRIMARY_BUF);
- }//void msac_c2_send_response_data(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_call_ind_await (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr) */
- /* */
- /* function: Set the connection state of MSAC_C2_CS_AWAIT_CONNECT, call */
- /* the output function MSAC_C2_IND_AWAIT(UBYTE dev_num) and check the return */
- /* code of the function. */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_call_ind_await(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- {
- UBYTE rcode;
- //new description state */
- connection_ptr->state = MSAC_C2_CS_AWAIT_CONNECT;
- connection_ptr->timer_break = FALSE;
- connection_ptr->user_break = MSAC_C2_UB_NO_BREAK;
- rcode = fdl_ind_await(dev_num,connection_ptr->sap_nr);
- if( rcode != FDL_OK )
- {
- vpc3_errcb[dev_num].error_code = rcode;
- vpc3_errcb[dev_num].cn_id = connection_ptr->cn_id;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }//if( rcode != FDL_OK )
- }//void msac_c2_call_ind_await(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* msac_c2_handle_user_response (UBYTE dev_num,MSAC_C2_CONNECT_ITEM_PTR connection_ptr) */
- /* */
- /* function: internal function */
- /* check user data and set the reaction (no call of */
- /* msac_c2_send_response_data, no set of connection description) */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_handle_user_response(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- {
- MSAC_C2_DATA_BUF_PTR buf_ptr = connection_ptr->buf_ptr;
- MSAC_C2_CC_BUF_PTR data_ptr = (MSAC_C2_CC_BUF_PTR) &(connection_ptr->buf_ptr->user_data[0]);
- MSAC_C2_DE_BUF_PTR de_data_ptr = (MSAC_C2_DE_BUF_PTR) &(buf_ptr->user_data[0]);
- UBYTE data_opc = data_ptr->opcode & MSAC_C2_FN_MASK;
- UBYTE rcode = TRUE; //Boolean
- if((data_opc != connection_ptr->opcode) && (data_opc != MSAC_C2_FN_DISCONNECT))
- {
- rcode = FALSE;
- }
- else
- {
- switch (data_opc)
- {
- case MSAC_C2_FN_CONNECT:
- {
- //negativ response connection state not opened */
- if( (de_data_ptr->opcode & DPV1_ERROR_BIT_RESPONSE) != 0 )
- { //negativ response by FN_CONNECT, internal disconnect */
- connection_ptr->opcode = MSAC_C2_FN_DISCONNECT;
- if(BFWORD2BYTE(buf_ptr->data_len) < DPV1_LEN_NEG_RESPONSE)
- {
- rcode = FALSE;
- }
- }
- else //positiv response */
- {
- if(BFWORD2BYTE(buf_ptr->data_len) < MSAC_C2_MIN_CC_PDU_SIZE)
- {
- rcode = FALSE;
- }
- }
- break;
- }
- case MSAC_C2_FN_DATA:
- {
- if( (de_data_ptr->opcode & DPV1_ERROR_BIT_RESPONSE) != 0 ) //TRANS-NRS */
- { //new negative response */
- if(BFWORD2BYTE(buf_ptr->data_len) != DPV1_LEN_NEG_RESPONSE)
- {
- rcode = FALSE;
- }
- }
- else
- {
- if((BFWORD2BYTE(buf_ptr->data_len) != (BFWORD2BYTE(de_data_ptr->length) + DPV1_LEN_HEAD_DATA)) ||
- (BFWORD2BYTE(de_data_ptr->length) > MSAC_C2_MAX_PDU_SIZE))
- {
- rcode = FALSE;
- }
- else
- {
- //no change of user data */
- }
- }
- break;
- }
- case MSAC_C2_FN_DS_READ:
- case MSAC_C2_FN_DS_WRITE:
- {
- if( (de_data_ptr->opcode & DPV1_ERROR_BIT_RESPONSE) != 0 ) //RDNRS, WRNRS */
- {
- if(BFWORD2BYTE(buf_ptr->data_len) != DPV1_LEN_NEG_RESPONSE)
- {
- rcode = FALSE;
- }
- }
- else //RDRES, WRRES */
- {
- if(data_opc == MSAC_C2_FN_DS_READ)
- {
- if(BFWORD2BYTE(buf_ptr->data_len) != (BFWORD2BYTE(de_data_ptr->length) + DPV1_LEN_HEAD_DATA))
- {
- rcode = FALSE;
- }
- }
- else //DPV2_FN_DS_WRITE */
- {
- if(BFWORD2BYTE(buf_ptr->data_len) != DPV1_LEN_HEAD_DATA)
- {
- rcode = FALSE;
- }
- }
- if( rcode == TRUE )
- {
- if( (BFWORD2BYTE(de_data_ptr->slot) == 255) ||
- (BFWORD2BYTE(de_data_ptr->index) == 255) ||
- (BFWORD2BYTE(de_data_ptr->length) > MSAC_C2_MAX_PDU_SIZE))
- {
- rcode = FALSE;
- }
- }
- }
- break;
- }
- case MSAC_C2_FN_DISCONNECT:
- {
- connection_ptr->opcode = MSAC_C2_FN_DISCONNECT;
- break;
- }
- default:
- {
- rcode = FALSE;
- break;
- }
- } // switch
- }
- if(rcode)
- {
- //response data_ok */
- switch (data_opc)
- {
- case MSAC_C2_FN_CONNECT:
- {
- //negative response is now handled */
- if((data_ptr->opcode & DPV1_ERROR_BIT_RESPONSE) != 0)
- {
- connection_ptr->error_code = MSAC_C2_EC_DC_BY_USER;
- }
- break;
- }
- case MSAC_C2_FN_DISCONNECT:
- {
- connection_ptr->error_code = MSAC_C2_EC_DC_BY_USER;
- break;
- }
- }
- } //end response data ok */
- else //invalid response data */
- {
- connection_ptr->error_code = MSAC_C2_EC_USER_ERR;
- //handle response data as disconnect-pdu */
- msac_c2_create_disconnect_pdu(dev_num,connection_ptr, MSAC_C2_RESP_DIRECTION);
- } //end invalid user response */
- }//void msac_c2_handle_user_response(UBYTE dev_num, MSAC_C2_CONNECT_ITEM_PTR connection_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_resp_pdu_provide(UBYTE dev_num,UBYTE sap_nr, */
- /* MSAC_C2_DATA_BUF_PTR buf_ptr) */
- /* */
- /* function: MSAC_C2 received response data from the user. In this */
- /* function the response data are checked. In dependence of the */
- /* pdu-opcode the response data are given to the layer 2 */
- /* (DATA_TRANSPORT and DISCONNECT) or the productiv data sap is */
- /* the productiv data sap is activated (CONNECT). */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_resp_pdu_provide(UBYTE dev_num, UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr )
- {
- MSAC_C2_CONNECT_ITEM_PTR connection_ptr;
- buf_ptr=buf_ptr;
- //determine connection_ptr */
- connection_ptr = &(msac_c2[dev_num].connection_list[MSAC_C2_SAP_NR_HIGH - sap_nr]);
- switch (connection_ptr->state)
- {
- case MSAC_C2_CS_PROVIDE_IND: //wait for response data */
- {
- switch (connection_ptr->error_code)
- {
- case MSAC_C2_EC_OK:
- {
- //new description state */
- connection_ptr->state = MSAC_C2_CS_PROVIDE_RESP;
- msac_c2_handle_user_response(dev_num,connection_ptr);
- msac_c2_send_response_data(dev_num,connection_ptr);
- break;
- }
- case MSAC_C2_EC_USER_ERR:
- case MSAC_C2_EC_INV_S_D_LEN_ERR:
- case MSAC_C2_EC_REQ_TIMEOUT:
- case MSAC_C2_EC_DC_BY_USER:
- case MSAC_C2_EC_DC_BY_MASTER:
- case MSAC_C2_EC_REMOTE_ERROR:
- default:
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->error_code;
- vpc3_errcb[dev_num].cn_id = MSAC_C2_SAP_NR_HIGH - sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- }
- }
- break;
- }//case MSAC_C2_CS_PROVIDE_IND:
- case MSAC_C2_CS_CLOSE_CHANNEL:
- case MSAC_C2_CS_AWAIT_CONNECT:
- case MSAC_C2_CS_AWAIT_IND:
- case MSAC_C2_CS_PROVIDE_RESP:
- case MSAC_C2_CS_DISABLE_CONNECT:
- default:
- {
- vpc3_errcb[dev_num].error_code = connection_ptr->state;
- vpc3_errcb[dev_num].cn_id = MSAC_C2_SAP_NR_HIGH - sap_nr;
- // *** no further action of dpv1/c2 ***
- fatal_error(dev_num,_DP_C2, __LINE__, &vpc3_errcb[dev_num]);
- break;
- }//default:
- } //end switch connection_ptr->state */
- }//void msac_c2_resp_pdu_provide(UBYTE dev_num, UBYTE sap_nr, MSAC_C2_DATA_BUF_PTR buf_ptr )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_close_channel(UBYTE dev_num) */
- /* */
- /* function: implementation of close_channel function */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_close_channel(UBYTE dev_num)
- {
- if( (msac_c2[dev_num].close_channel_request == FALSE ) && (msac_c2[dev_num].connection_list[0].state != MSAC_C2_CS_CLOSE_CHANNEL) )
- {
- //accept close_channel request
- msac_c2[dev_num].close_channel_request = TRUE;
- fdl_close_channel(dev_num, FDL_MSAC_C2_SAP );
- }//if( (msac_c2[dev_num].close_channel_request == FALSE ) && (msac_c2[dev_num].connection_list[0].state != MSAC_C2_CS_CLOSE_CHANNEL) )
- }//void msac_c2_close_channel(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_input_queue(UBYTE dev_num,MSAC_C2_DATA_BUF_PTR buf_ptr, BYTE ret_value */
- /* UBYTE user_id, UBYTE fdl_code) */
- /* */
- /* function: copy message into msac_c2 input queue */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_input_queue(UBYTE dev_num, MSAC_C2_DATA_BUF_PTR buf_ptr, UBYTE ret_value ,UBYTE user_id, UBYTE fdl_code )
- {
- MSAC_C2_REC_QUEUE_PTR rec_ptr;
- rec_ptr = &(msac_c2[dev_num].rec_queue[msac_c2[dev_num].write_rec_ptr]);
- rec_ptr->buf_ptr = buf_ptr;
- rec_ptr->ret_value = ret_value; //clear ret_value
- rec_ptr->sap_nr = user_id;
- rec_ptr->fdl_code = fdl_code;
- if( msac_c2[dev_num].write_rec_ptr != msac_c2[dev_num].end_rec_ptr )
- {
- msac_c2[dev_num].write_rec_ptr++;
- }//if( msac_c2[dev_num].write_rec_ptr != msac_c2[dev_num].end_rec_ptr )
- else
- {
- msac_c2[dev_num].write_rec_ptr = msac_c2[dev_num].start_rec_ptr;
- }//else of if( msac_c2[dev_num].write_rec_ptr != msac_c2[dev_num].end_rec_ptr )
- }//void msac_c2_input_queue(UBYTE dev_num, MSAC_C2_DATA_BUF_PTR buf_ptr, UBYTE ret_value ,UBYTE user_id, UBYTE fdl_code )
- /*---------------------------------------------------------------------------*/
- /* */
- /* void msac_c2_timer_tick_10msec(UBYTE dev_num) */
- /* */
- /* function: 10msec Timer Function for MSAC_2 connections, */
- /* called by interrupt function. */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode void msac_c2_timer_tick_10msec(UBYTE dev_num)
- {
- UBYTE i;
- for( i = 0; i < DP_C2_NUM_SAPS; i++ )
- {
- if( msac_c2[dev_num].timer_list[i].running != FALSE )
- {
- if( msac_c2[dev_num].timer_list[i].time_act )
- {
- msac_c2[dev_num].timer_list[i].time_act--;
- }//if( msac_c2[dev_num].timer_list[i].time_act )
- else
- {
- msac_c2[dev_num].timer_list[i].running = FALSE;
- }//else of if( msac_c2[dev_num].timer_list[i].time_act )
- }//if( msac_c2[dev_num].timer_list[i].running != FALSE )
- }//for( i = 0; i < DP_C2_NUM_SAPS; i++ )
- }//void msac_c2_timer_tick_10msec(UBYTE dev_num)
- /*---------------------------------------------------------------------------*/
- /* */
- /* UBYTE msac_c2_start_timer(UBYTE dev_num,UBYTE timer_index, UWORD timer_value) */
- /* */
- /* function: start timer */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode UBYTE msac_c2_start_timer(UBYTE dev_num, UBYTE timer_index, UWORD timer_value )
- {
- UBYTE ret_val;
- //set new reload-value
- msac_c2[dev_num].timer_list[ timer_index ].time_act = timer_value;
- if( msac_c2[dev_num].timer_list[ timer_index ].running == TRUE )
- {
- ret_val = MSAC_C2_TIMER_ALREADY_RUNS;
- }//if( msac_c2[dev_num].timer_list[ timer_index ].running == TRUE )
- else
- {
- msac_c2[dev_num].timer_list[ timer_index ].running = TRUE;
- ret_val = MSAC_C2_TIMER_OK;
- }//else of if( msac_c2[dev_num].timer_list[ timer_index ].running == TRUE )
- return ret_val;
- }//UBYTE msac_c2_start_timer(UBYTE dev_num, UBYTE timer_index, UWORD timer_value )
- /*---------------------------------------------------------------------------*/
- /* */
- /* UBYTE msac_c2_stop_timer(UBYTE dev_num,UBYTE timer_index) */
- /* */
- /* function: stop timer */
- /* */
- /*---------------------------------------------------------------------------*/
- SECTION_DEF_CommuCode UBYTE msac_c2_stop_timer(UBYTE dev_num, UBYTE timer_index )
- {
- UBYTE ret_val;
- if( msac_c2[dev_num].timer_list[ timer_index ].running == FALSE )
- {
- ret_val = MSAC_C2_TIMER_ALREADY_STOPPED;
- }//if( msac_c2[dev_num].timer_list[ timer_index ].running == FALSE )
- else
- {
- msac_c2[dev_num].timer_list[ timer_index ].time_act = 0x0000;
- msac_c2[dev_num].timer_list[ timer_index ].running = FALSE;
- ret_val = MSAC_C2_TIMER_OK;
- }//else of if( msac_c2[dev_num].timer_list[ timer_index ].running == FALSE )
- return ret_val;
- }//UBYTE msac_c2_stop_timer(UBYTE dev_num, UBYTE timer_index )
- #endif//#ifdef DP_MSAC_C2
- /*****************************************************************************/
- /* Copyright (C) profichip GmbH 2004. Confidential. */
- /*****************************************************************************/