//*****     MAIN ENTRY POINT     *****
int main()
{
	//variables
	int timeToWait;

	//i/o streams
	std::ofstream outputright;
	std::ofstream outputleft;
	outputright.open(OUTPUTUP);
	outputleft.open(OUTPUTDOWN);

	//instantiate buffers
	boost::circular_buffer< Packet > inputRight(BUFFERSIZE);   //downwards input Right
	boost::circular_buffer< Packet > inputLeft(BUFFERSIZE);   //downwards input Left

	boost::circular_buffer< unsigned int > outputRight(BUFFERSIZE); //upwards output Right
	boost::circular_buffer< unsigned int > outputLeft(BUFFERSIZE);  //upwards output Left

	boost::circular_buffer< Frame > physLeftUp(BUFFERSIZE);   		//upwards from phys to left dll
	boost::circular_buffer< Frame > physLeftDown(BUFFERSIZE);   	//downwards from left dll to phys
	boost::circular_buffer< Frame > physRightUp(BUFFERSIZE);   		//upwards from phys to right dll
	boost::circular_buffer< Frame > physRightDown(BUFFERSIZE);   	//downwards from right dll to phys

	#ifdef DEBUG
	DEBUG_OUT << "----------   ### INITIALIZING BUFFERS  ###   ----------" << std::endl;
	#endif

	//make a packet
	Packet test1;
	unsigned char data[PACKET_SIZE];
	for(int k=0;k<PACKET_SIZE;k++)
		data[k]=k;
	unsigned char length = PACKET_SIZE;
	bool flags[8] = {false};
	flags[PACKET_FLAG_ACK] = true;
	test1.make(5,2,flags,7,8,length,data);

	//Put packets in buffers
	test1.setRecvAddr(0);
	inputLeft.push_back(test1);
	inputLeft.push_back(test1);

	#ifdef DEBUG
	DEBUG_OUT << "Checksum validity: " << test1.checksumValid() << std::endl;
	DEBUG_OUT << "Total package length: " << (int)test1.totalLength() << std::endl;
	unsigned char* arrayPacket = test1.getAsArray();
	for (int i=0; i<test1.totalLength(); i++)
		DEBUG_OUT << (int)arrayPacket[i] << " ";
	DEBUG_OUT << std::endl;
	#endif

	test1.setRecvAddr(1);
	inputRight.push_back(test1);

	#ifdef DEBUG
	DEBUG_OUT << "Checksum validity: " << test1.checksumValid() << std::endl;
	DEBUG_OUT << "Total package length: " << (int)test1.totalLength() << std::endl;
	arrayPacket = test1.getAsArray();
	for (int i=0; i<test1.totalLength(); i++)
		DEBUG_OUT << (int)arrayPacket[i] << " ";
	DEBUG_OUT << std::endl;
	#endif

	//instantiate data link layers
	DtmfDataLinkLayer Leftdll(1,1); //addr = 1, has token
	DtmfDataLinkLayer Rightdll(0,0); //addr = 0, has no token

	//instantiate physical layer
	DtmfPhysical physicalLayer(paFloat32, 2, 600, 8000, paFloat32, 2, 300, 8000);
	physicalLayer.startDataStream();

	//call encode or decode with arguments downInput, downOutput, upInput, upOutput
	for(int k=0;k<TEST_ITERATIONS;k++)
	{
	#ifdef DEBUG
		DEBUG_OUT << std::endl << " LEFT SIDE:";
	#endif
		Leftdll.decode(&inputLeft, &physLeftDown, &physLeftUp, &outputLeft);
		wait(1);
		Leftdll.encode(&inputLeft, &physLeftDown, &physLeftUp, &outputLeft);
		wait(1);

	if(!physLeftDown.empty())
	{
		#ifdef DEBUG
		DEBUG_OUT << std::endl << "----------   ###   SEND   ###   ----------" << std::endl;
		#endif
		timeToWait = physLeftDown.end() - physLeftDown.begin();
		#ifdef DEBUG
		DEBUG_OUT << timeToWait << " frames to send" << std::endl;
		#endif
		physicalLayer.send(&physLeftDown);
		physLeftDown.clear();				//TODO: temporary hack. send method should pop, but does not
		wait(timeToWait+5);
	}
	physicalLayer.receive(&physRightUp);

	#ifdef DEBUG
	DEBUG_OUT << std::endl << " RIGHT SIDE:";
	#endif
	Rightdll.decode(&inputRight, &physRightDown, &physRightUp, &outputRight);
	wait(1);
	Rightdll.encode(&inputRight, &physRightDown, &physRightUp, &outputRight);
	wait(1);

	if(!physRightDown.empty())
	{
		#ifdef DEBUG
		DEBUG_OUT << std::endl << "----------   ###   SEND   ###   ----------" << std::endl;
		#endif
		timeToWait = physRightDown.end() - physRightDown.begin();
		#ifdef DEBUG
		DEBUG_OUT << timeToWait << " frames to send" << std::endl;
		#endif
		physicalLayer.send(&physRightDown);
		physRightDown.clear();			//TODO: temporary hack. send method should pop, but does not
		wait(timeToWait+5);
	}
	physicalLayer.receive(&physLeftUp);
	}

#ifdef DEBUG
DEBUG_OUT << std::endl << "----------   ### WRITING BUFFERS TO FILES ###   ----------" << std::endl;
#endif

	//write output buffers to files. Results in "Assertion failed:" if buffer is empty, but executes anyway
	while(true)
		{
			if(outputLeft.empty())
			{
				break;
			}
			else
			{
				#ifdef DEBUG
				DEBUG_OUT << "Writing datagram..." << outputLeft.front() << std::endl;
				#endif
				outputleft << (int)outputLeft.front() << std::endl;
				outputLeft.pop_front();
			}
		}

	while(true)
		{
			if(outputRight.empty())
			{
				break;
			}
			else
			{
				#ifdef DEBUG
				DEBUG_OUT << "Writing datagram..." << outputRight.front() << std::endl;
				#endif
				outputright << (int)outputRight.front() << std::endl;
				outputRight.pop_front();
			}
		}

	//print report
	#ifdef DEBUG
	DEBUG_OUT << "----------   ### REPORT ###   ----------" << std::endl;
	DEBUG_OUT << "Right data link layer discarded " << Rightdll.lostFrameCount << " frames." << std::endl;
	DEBUG_OUT << "Right data link layer transferred " << Rightdll.successFrameCount << " frames." << std::endl;
	DEBUG_OUT << std::endl;
	DEBUG_OUT << "Left data link layer discarded " << Leftdll.lostFrameCount << " frames." << std::endl;
	DEBUG_OUT << "Left data link layer transferred " << Leftdll.successFrameCount << " frames." << std::endl;
	#endif

	return 0;
}
Esempio n. 2
0
Token Lexer::getNext() {
	try {

	} catch(int i) {

	}
	skipWhitespacesAndComments();

	AutoCounter ac(currentPos, currentPos, currentColumn);

	if(inputLeft()) {
		if(isdigit(input[currentPos])) {
			std::stringstream buffer;
			buffer << input[currentPos];
			currentPos++;
			while(inputLeft() && isdigit(input[currentPos])) {
				buffer << input[currentPos];
				currentPos++;
			}
			if(inputLeft() && input[currentPos] == '.') {
				currentPos++;
				buffer << '.';
				while(inputLeft() && isdigit(input[currentPos])) {
					buffer << input[currentPos];
					currentPos++;
				}
				auto element = std::stod(buffer.str(), nullptr);
				auto index = addRealConstant(element);
				return Token(TokenType::REAL, index, currentColumn, currentLine);
			} else {
				auto element = std::stoi(buffer.str(), nullptr);
				auto index = addIntConstant(element);
				return Token(TokenType::INT, index, currentColumn, currentLine); // INT
			}
		} else if(isalpha(input[currentPos]) || input[currentPos] == '_') {
			std::stringstream buffer;
			buffer << input[currentPos];
			currentPos++;
			while(inputLeft() && (isalnum(input[currentPos]) || input[currentPos] == '_')) {
				buffer << input[currentPos];
				currentPos++;
			}
			auto identifierValue = buffer.str();
			if(identifierValue == "true") {
				return Token(TokenType::BOOL, 1, currentColumn, currentLine);
			} else if(identifierValue == "false") {
				return Token(TokenType::BOOL, 0, currentColumn, currentLine);
			} else if(identifierValue == "return") {
				return Token(TokenType::RETURN, currentColumn, currentLine);
			} else if(identifierValue == "if") {
				return Token(TokenType::IF, currentColumn, currentLine);
			} else if(identifierValue == "else") {
				return Token(TokenType::ELSE, currentColumn, currentLine);
			} else if(identifierValue == "loop") {
				return Token(TokenType::LOOP, currentColumn, currentLine);
			}
			int index = identifier.size();
			identifier.push_back(buffer.str());
			return Token(TokenType::IDENTIFIER, index, currentColumn, currentLine);
		} else {
			switch(input[currentPos]) {
				case '+':
					currentPos++;
					return Token(TokenType::OPERATOR, 0, currentColumn, currentLine);
				case '-':
					currentPos++;
					return Token(TokenType::OPERATOR, 1, currentColumn, currentLine);
				case '*':
					currentPos++;
					return Token(TokenType::OPERATOR, 2, currentColumn, currentLine);
				case '/':
					currentPos++;
					return Token(TokenType::OPERATOR, 3, currentColumn, currentLine);
				case '<':
					currentPos++;
					if(inputLeft() && input[currentPos] == '=') {
						currentPos++;
						return Token(TokenType::OPERATOR, 5, currentColumn, currentLine);
					}
					return Token(TokenType::OPERATOR, 4, currentColumn, currentLine);
				case '>':
					currentPos++;
					if(inputLeft() && input[currentPos] == '=') {
						currentPos++;
						return Token(TokenType::OPERATOR, 7, currentColumn, currentLine);
					}
					return Token(TokenType::OPERATOR, 6, currentColumn, currentLine);
				case '(':
					currentPos++;
					return Token(TokenType::LPAR, 0, currentColumn, currentLine);
				case ')':
					currentPos++;
					return Token(TokenType::RPAR, 0, currentColumn, currentLine);
				case '{':
					currentPos++;
					return Token(TokenType::LBLOCK, 0, currentColumn, currentLine);
				case '}':
					currentPos++;
					return Token(TokenType::RBLOCK, 1, currentColumn, currentLine);
				case '=':
					currentPos++;
					if(inputLeft() && input[currentPos] == '=') {
						currentPos++;
						return Token(TokenType::OPERATOR, 8, currentColumn, currentLine);
					} else if( inputLeft() && input[currentPos] == '>') {
						currentPos++;
						return Token(TokenType::OPERATOR, 12, currentColumn, currentLine);
					}
					return Token(TokenType::ASSIGN, currentColumn, currentLine);
				case '!':
					currentPos++;
					if(inputLeft() && input[currentPos] == '=') {
						currentPos++;
						return Token(TokenType::OPERATOR, 9, currentColumn, currentLine);
					}
					return Token(TokenType::UNARYOPERATOR, 0, currentColumn, currentLine);
				case '&':
					currentPos++;
					if(inputLeft() && input[currentPos] == '&') {
						currentPos++;
						return Token(TokenType::OPERATOR, 10, currentColumn, currentLine);
					}
					return Token(TokenType::ERROR, currentColumn, currentLine);
				case '|':
					currentPos++;
					if(inputLeft() && input[currentPos] == '|') {
						currentPos++;
						return Token(TokenType::OPERATOR, 11, currentColumn, currentLine);
					}
					return Token(TokenType::ERROR, currentColumn, currentLine);
				case '%':
					currentPos++;
					return Token(TokenType::OPERATOR, 13, currentColumn, currentLine);
				case ';':
					currentPos++;
					return Token(TokenType::SEMICOLON, currentColumn, currentLine);
				case ',':
					currentPos++;
					return Token(TokenType::SEPARATOR, currentColumn, currentLine);
				case ':':
					currentPos++;
					if(inputLeft() && input[currentPos] == '=') {
						currentPos++;
						return Token(TokenType::DEFINE, currentColumn, currentLine);
					}
					return Token(TokenType::ERROR, currentColumn, currentLine);
				default:
				break;
			}
		}
	} else {
		return Token(TokenType::EOI, currentColumn, currentLine);
	}
	currentPos++;
	return Token(TokenType::ERROR, currentColumn, currentLine);
}