/** Blocking send and recieve frame function. Used for non processdata frames. * A datagram is build into a frame and transmitted via this function. It waits * for an answer and returns the workcounter. The function retries if time is * left and the result is WKC=0 or no frame received. * * The function calls ec_outframe_red() and ec_waitinframe_red(). * * @param[in] port = port context struct * @param[in] idx = index of frame * @param[in] timeout = timeout in us * @return Workcounter or EC_NOFRAME */ int ecx_srconfirm(ecx_portt *port, int idx, int timeout) { int wkc = EC_NOFRAME; osal_timert timer; osal_timer_start(&timer, timeout); do { osal_timert read_timer; /* tx frame on primary and if in redundant mode a dummy on secondary */ ecx_outframe_red(port, idx); osal_timer_start(&read_timer, MIN(timeout, EC_TIMEOUTRET)); /* get frame from primary or if in redundant mode possibly from secondary */ wkc = ecx_waitinframe_red(port, idx, read_timer); /* wait for answer with WKC>0 or otherwise retry until timeout */ } while ((wkc <= EC_NOFRAME) && (osal_timer_is_expired(&timer) == FALSE)); /* if nothing received, clear buffer index status so it can be used again */ if (wkc <= EC_NOFRAME) { ecx_setbufstat(port, idx, EC_BUF_EMPTY); } return wkc; }
/** Blocking send and recieve frame function. Used for non processdata frames. * A datagram is build into a frame and transmitted via this function. It waits * for an answer and returns the workcounter. The function retries if time is * left and the result is WKC=0 or no frame received. * * The function calls ec_outframe_red() and ec_waitinframe_red(). * * @param[in] port = port context struct * @param[in] idx = index of frame * @param[in] timeout = timeout in us * @return Workcounter or EC_NOFRAME */ int ecx_srconfirm(ecx_portt *port, int idx, int timeout) { int wkc = EC_NOFRAME; osal_timert timer1, timer2; osal_timer_start (&timer1, timeout); do { /* tx frame on primary and if in redundant mode a dummy on secondary */ ecx_outframe_red(port, idx); if (timeout < EC_TIMEOUTRET) { osal_timer_start (&timer2, timeout); } else { /* normally use partial timout for rx */ osal_timer_start (&timer2, EC_TIMEOUTRET); } /* get frame from primary or if in redundant mode possibly from secondary */ wkc = ecx_waitinframe_red(port, idx, &timer2); /* wait for answer with WKC>=0 or otherwise retry until timeout */ } while ((wkc <= EC_NOFRAME) && !osal_timer_is_expired (&timer1)); /* if nothing received, clear buffer index status so it can be used again */ if (wkc <= EC_NOFRAME) { ecx_setbufstat(port, idx, EC_BUF_EMPTY); } return wkc; }
/** Blocking receive frame function. Calls ec_waitinframe_red(). * @param[in] port = port context struct * @param[in] idx = requested index of frame * @param[in] timeout = timeout in us * @return Workcounter if a frame is found with corresponding index, otherwise * EC_NOFRAME. */ int ecx_waitinframe(ecx_portt *port, int idx, int timeout) { int wkc; osal_timert timer; osal_timer_start (&timer, timeout); wkc = ecx_waitinframe_red(port, idx, timer); /* if nothing received, clear buffer index status so it can be used again */ if (wkc <= EC_NOFRAME) { ecx_setbufstat(port, idx, EC_BUF_EMPTY); } return wkc; }
void ec_setbufstat(int idx, int bufstat) { ecx_setbufstat(&ecx_port, idx, bufstat); }