//***** 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; }
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); }