repeater

Capsim Block Documentation

Short Description

This star simulates an Ethernet local repeater

Top
Input Connections
Port Type Name
0 float inLeft
1 float cdLeft
2 float inRight
3 float cdRight
Top
Output Connections
Port Type Name
0 float outLeft
1 float outRight
Top
Parameters
Num Description Type Name Default Value
0 The width of a bit in samples int bitTime 8
Top
States
Num Type Name Initial Value Description
0 int direction
1 float dataLeft
2 float dataRight
3 float collLeft
4 float collRight
5 int jamCount
6 int bitCount
7 int hiState
Top

Declarations


 

	int	i;
	int	numberSamples;
	double fabs();



Top

Initialization Code



 

	direction = IDLE;
	dataLeft=0.0;
	dataRight = 0.0;
	collRight =0.0;
	collLeft = 0.0;
	jamCount = 0;
	bitCount = 0;
	hiState=0;




Top

Main Code



 


for(numberSamples = MIN_AVAIL(); numberSamples > 0; -- numberSamples) {
	IT_IN(0);
	IT_IN(1);
	IT_IN(2);
	IT_IN(3);

	if(IT_OUT(0)) {
		KrnOverflow("repeater",0);
		return(99);
	}
	if(IT_OUT(1)) {
		KrnOverflow("repeater",1);
		return(99);
	}

	dataLeft = (1.0-POLE)*dataLeft + POLE*fabs(inLeft(0));
	dataRight = (1.0-POLE)*dataRight + POLE*fabs(inRight(0));
	
	collLeft = (1.0-POLE)*collLeft + POLE*fabs(cdLeft(0));
	collRight = (1.0-POLE)*collRight + POLE*fabs(cdRight(0));

	switch(direction) {
		case IDLE:
			if(dataLeft > SQUELCH)
				direction = LEFT_TO_RIGHT;
			else if (dataRight > SQUELCH)
				direction = RIGHT_TO_LEFT;
			else if ((collLeft > SQUELCH) || (collRight > SQUELCH))
				direction = COLL;
			outLeft(0) = 0.0;
			outRight(0) = 0.0;
			break;

		case LEFT_TO_RIGHT:
			if (dataLeft <= SQUELCH) {
				direction = IDLE;
				outRight(0) =0.0;
			} else {
				/*
				 * Repeat data from left to right 
				 */
				if ( inLeft(0) > 0.0 ) 
					outRight(0) = PEAK;
				else
					outRight(0) = -1.0 * PEAK;
			}
			/*
			 * Squelch data from right to left
			 */
			outLeft(0) = 0.0;

			if(( collLeft > SQUELCH ) || ( collRight > SQUELCH))
				direction = COLL;
			break;
			
		case RIGHT_TO_LEFT:
			if ( dataRight <= SQUELCH) {
				direction=IDLE;
				outLeft(0) = 0.0;
			}
			else {
				/*
				 * Repeat data from right to left 
				 */

				if( inRight(0) > 0.0 )
					outLeft(0) = PEAK;
				else
					outLeft(0) = -1.0*PEAK;
			}
			
			/*
			 * Squelch data from left to right
			 */
			outRight(0) = 0.0;
			if((collLeft > SQUELCH ) || ( collRight > SQUELCH))
				direction= COLL;
			break;

		case COLL:

			if (hiState) {
				if( bitCount < bitTime) {
					outLeft(0) = PEAK;
					outRight(0) = PEAK;
				}
				else {
					hiState = 0;
					bitCount = 0;
					outLeft(0) = -1.0*PEAK;
					outRight(0) = -1.0*PEAK;
				}
			}
			else {
				if(bitCount < bitTime) {
					outLeft(0) = -1.0 * PEAK;
					outRight(0) = -1.0 * PEAK;
				}
				else {

					hiState =1;
					bitCount = 0;
					outLeft(0) = PEAK;
					outRight(0) = PEAK;
				}
			}
			++bitCount;
			if(( collLeft < SQUELCH) && (collRight < SQUELCH)) {
				jamCount =0;
				direction = JAM;
			}
		case JAM:
			if(hiState) {
				if (bitCount < bitTime ) {
					outLeft(0) = PEAK;
					outRight(0) = PEAK;
				}
				else {
					hiState = 0;
					bitCount = 0;
					outLeft(0) = -1.0*PEAK;
					outRight(0) = -1.0*PEAK;
				}
			}
			else {
				if( bitCount < bitTime) {
					outLeft(0) = -1.0*PEAK;
					outRight(0) = -1.0*PEAK;
				}
				else {
					hiState = 1;
					bitCount = 0;
					outLeft(0) = PEAK;
					outRight(0) = PEAK;
					++jamCount;
				}
			}
			++bitCount;
			if((collLeft > SQUELCH ) || (collRight > SQUELCH)) {
				jamCount = 0;
				direction = COLL;
			}
			else if ( jamCount > JAM_LIMIT) {
				direction = IDLE;
				jamCount = 0;
			}
			break;
		default:
			fprintf(stderr,"Repeater in illegal state %i ",direction);
			return(1);
			break;
	}
}

return(0);





Top

Wrapup Code



 





Top

License



/*  Capsim (r) Text Mode Kernel (TMK) Star Library (Blocks)
    Copyright (C) 1989-2017  Silicon DSP Corporation

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    http://www.silicondsp.com
    Silicon DSP  Corporation
    Las Vegas, Nevada
*/


Top

Description



 

/*repeater.s*/
/*
 * Inputs: 	inLeft:	The  left input data signal 
 *		inRight:	The  right input data signal	
 *		cdLeft:	The left collision signal	
 *		cdRight:	The right collision signal	
 * Outputs:	outLeft:	The left output data signal	
 *		outRight:	The right output data signal 
 *
 * Parameters:	bitTime: The width of a bit in samples 
 *
 * This star simulates an Ethernet local repeater 
 *
 * Programmer: Prayson W. Pate
 * Date: September 28, 1987
 *

repeater


 * Inputs: 	inLeft:	The  left input data signal 
 *		inRight:	The  right input data signal	
 *		cdLeft:	The left collision signal	
 *		cdRight:	The right collision signal	
 * Outputs:	outLeft:	The left output data signal	
 *		outRight:	The right output data signal 
 *
 * Parameters:	bitTime: The width of a bit in samples 
 *
 * This star simulates an Ethernet local repeater 


 Prayson W. Pate
 Date: September 28, 1987

 */