bool SeedUDPClientHandler::handleSetValueCommand() {

	int id = mReadDatagram.readNextInt();
	QString valueToSet = mReadDatagram.readNextString();

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_SET_VALUE_ACK);
	mWriteDatagram.writeInt(id);

	QList<Value*> knownValues = mKnownValues.keys();
	for(int i = 0; i < knownValues.size(); ++i) {
		Value *value = knownValues.at(i);
		if(mKnownValues.value(value) == id) {
			bool ok = value->setValueFromString(valueToSet);
			if(ok) {
				mWriteDatagram.writeByte(1);
			}
			else {
				mWriteDatagram.writeByte(0);
			}
			sendDatagram();
			return true;
		}
	}
	mWriteDatagram.writeByte(2); //notify: failed to find value
	sendDatagram();

	return true;
}
Exemple #2
0
bool TCore::dock()
{
	enum ControlSymbols {
		ADD_ITEM = 0,
		SET_TITLE,
	};
    const qint8 id = 8;
    moveWidget(id, DOCK, 700, 20, 300, 300);
    QByteArray datagram, data(9,0);
    qint8 oper1 = id;
    memcpy(data.data(), &oper1, 1);
    oper1 = DOCK;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = VALUE;
    memcpy(data.data()+2, &oper1, 1);
    oper1 = SET_TITLE;
    memcpy(data.data()+3, &oper1, 1);
    memcpy(data.data()+4, "title", 5);
    sendDatagram(address, remoutePort, data);
    data.resize(7);
    oper1 = ADD_ITEM;
    memcpy(data.data()+3, &oper1, 1);
    oper1 = 1;
    memcpy(data.data()+4, &oper1, 1);
    oper1 = 6;
    memcpy(data.data()+5, &oper1, 1);
    oper1 = 3;
    memcpy(data.data()+6, &oper1, 1);
    sendDatagram(address, remoutePort, data);
    return true;
}
Exemple #3
0
bool TCore::labelI_and_hide()
{
    const qint8 id = 2;
    static qint32 value = 0;
    value++;
    moveWidget(id, LABELI, 10, 300, 100, 30);
    QByteArray datagram, data(14,0);
    qint8 oper1 = id;
    memcpy(data.data(), &oper1, 1);
    oper1 = MainWindow::LABELI;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = MainWindow::VALUE;
    memcpy(data.data()+2, &oper1, 1);
    memcpy(data.data()+3, &value, 4);
    sendDatagram(address, remoutePort, data);
    if(value % 4)
    {
	QByteArray datagram, data(7,0);
	//show/hide
	oper1 = id;
	memcpy(data.data(), &oper1, 1);
	oper1 = LABELI;
	memcpy(data.data()+1, &oper1, 1);
	oper1 = SHOW;
	memcpy(data.data()+2, &oper1, 1);
	oper1 = 2;//hide
	memcpy(data.data()+3, &oper1, 4);
	sendDatagram(address, remoutePort, data);
    }
    return true;
}
Exemple #4
0
bool TCore::led()
{
    enum ControlSymbols {
	    NAME = 0x00,
	    STATE,//0x01
    };
    enum States {
	    OFF = 0x00,
	    OK,//0x01
	    WARNING,//0x02
	    ALARM,//0x03
    };
    const qint8 id = 6;
    static qint8 value = 0;
    moveWidget(id, LED, 600, 100, 100, 30);
    QByteArray datagram, data(17,0);
    qint8 oper1 = id;
    memcpy(data.data(), &oper1, 1);
    oper1 = LED;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = VALUE;
    memcpy(data.data()+2, &oper1, 1);
    oper1 = NAME;
    memcpy(data.data()+3, &oper1, 1);
    memcpy(data.data()+4, "state of word", 13);
    sendDatagram(address, remoutePort, data);

    data.resize(5);
    oper1 = STATE;
    memcpy(data.data()+3, &oper1, 1);
    memcpy(data.data()+4, &value, 1);
    sendDatagram(address, remoutePort, data);
    if(++value > 0x03)value = 0;
    return true;
}
Exemple #5
0
int Worker::inquiry()
{
    Datagram dg;
    inquiry_result_t * btDev;
    unsigned char btDevNum;

    // wait for inquiry (about 20 seconds)
    // FLEX: returns Bluetooth devices

    sendDatagram(serial, REQUEST, INQUIRY);
    receiveDatagram(serial, &dg);
    if (!(dg.type == RESPONSE && dg.id == INQUIRY))
        return -1;

    btDevNum = parseInquiryDatagram(&btDev, &dg);

    emit bluetoothInquiryCompleted(btDev, btDevNum);

    sync->acquire();

    if (btDeviceIndexChosen == -1)
        return -1;

    sendDatagram(serial, RESPONSE, OK);

    return 0;
}
Exemple #6
0
//Memory Access Configuration Protocol
uint16_t DCC_Proxy::MACProcessRead(void)
{
  uint32_t address = getAddress(_rxDatagramBuffer->data);
  uint8_t space = decodeSpace(_rxDatagramBuffer->data);
  uint8_t datagram_offset = (_rxDatagramBuffer->data[1]&0x03)?6:7; //if the space is encoded in the flags in data[1], then the payload begins at byte 6; else, the payload begins after the space byte,at byte 7.
    uint8_t length = _rxDatagramBuffer->data[datagram_offset];



  OLCB_Datagram reply;
  memcpy(&(reply.destination), &(_rxDatagramBuffer->source), sizeof(OLCB_NodeID));
  //copy first six/seven bytes.
  memcpy(reply.data, _rxDatagramBuffer->data, datagram_offset);
  reply.data[1] = MAC_CMD_READ_REPLY | reply.data[1]&0x0F; //set as read response
  Serial.println("MACPROCESSREAED");
  Serial.print("Making reply with MTI ");
  Serial.println(reply.data[0], HEX);
  Serial.println(reply.data[1], HEX);
  //TODO presume datagram?
  Serial.print("length = ");
  Serial.println(length, DEC);
  Serial.print("address = ");
  Serial.println(address, HEX);
  Serial.print("space = ");
  Serial.println(space, HEX);
  Serial.print("data offset in datagram = ");
  Serial.println(datagram_offset);
  //And, now do something useful.
  //first check the space?
  switch(space)
  {
  case 0xFD: //Configuration space...basically just EEPROM
    reply.length = length+datagram_offset;
    for(uint8_t i = 0; i < length; ++i)
    {
      reply.data[datagram_offset+i] = eeprom_read_byte((uint8_t*)(address+i+_eeprom_address)); //TODO check that address is < 255!
    }
    if(sendDatagram(&reply))
      return DATAGRAM_ERROR_OK;
    //else
    //have them resend
    return DATAGRAM_REJECTED_BUFFER_FULL;

  case 0xFF: //CDI request.
    Serial.println("CDI request.");
    reply.length = readCDI(address, length, &(reply.data[datagram_offset])) + 6;
    Serial.print("total length of CDI reply = ");
    Serial.println(reply.length, DEC);
    if(sendDatagram(&reply))
      return DATAGRAM_ERROR_OK;
    //else
    //have them resend
    return DATAGRAM_REJECTED_BUFFER_FULL;
    //case 0xFE: //"All memory" access. Just give them what they want?
    //Serial.println("all memory request. ignoring");
    //	break;
  }
  //Serial.println("NAKing");
  return DATAGRAM_REJECTED; //send a NAK. Is this what we really want?
}
Exemple #7
0
void UDPServer::start()
{
    sleep(UDPSleep);
    while(UDPLoopGuard)
    {
        VideoFile videofileToSend = getFromQueue();

        std::ifstream videoFile;
        videoFile.open(videofileToSend.getLocalPath());
        bool isBegin = true;
        uint datagramNumber = 1;
        while(!videoFile.eof())
        {
            int maxDataSize = MAX_DATAGRAM_SIZE - DATAGRAM_CUSTOM_HEADER_SIZE;
            char bytesFromFile[maxDataSize];
            memset(bytesFromFile, 0, maxDataSize);
            videoFile.read(bytesFromFile, maxDataSize);

            std::string bytesStr(bytesFromFile, videoFile.gcount());
            if (isBegin)
            {
                sendDatagram(datagramNumber, videofileToSend.getId(), UdpMessagesTypes::Begin, bytesStr,videofileToSend.getTimestamp());
            } else
            {
                sendDatagram(datagramNumber, videofileToSend.getId(), UdpMessagesTypes::Middle, bytesStr,videofileToSend.getTimestamp());
            }
            isBegin = false;
            datagramNumber++;
        }
        sendDatagram(datagramNumber, videofileToSend.getId(), UdpMessagesTypes::End, "", videofileToSend.getTimestamp());
        videoFile.close();
    }
}
bool SeedUDPClientHandler::handleAgentOverviewCommand() {

	if(mOwner == 0) {
		return false;
	}

	QList<SimObjectGroup*> agentGroups = Physics::getPhysicsManager()->getSimObjectGroups();

	{
		for(int i = 0; i < agentGroups.size(); ++i) {
			SimObjectGroup *group = agentGroups.at(i);
			if(!mKnownObjectGroups.values().contains(group)) {
				mKnownObjectGroups.insert(mObjectGroupCounter++, group);
			}
		}
	}
	QList<int> knownGroupIds = mKnownObjectGroups.keys();
	{
		for(int i = 0; i < knownGroupIds.size(); ++i) {
			int id = knownGroupIds.at(i);
			SimObjectGroup *group = mKnownObjectGroups.value(id);
			if(!agentGroups.contains(group)) {
				//a known group does not exist any more.
				mKnownObjectGroups.remove(id);
			}
		}
	}

	knownGroupIds = mKnownObjectGroups.keys();

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_AGENT_OVERVIEW);
	mWriteDatagram.writeInt(knownGroupIds.size());
	sendDatagram();

	for(int i = 0; i < agentGroups.size(); ++i) {

		//mDatagramMutex.unlock();

		int id = knownGroupIds.at(i);
		SimObjectGroup *group = mKnownObjectGroups.value(id);

		//mDatagramMutex.lock();

		mWriteDatagram.clear();
		mWriteDatagram.writeByte(SeedUDPCommunication::UDP_AGENT_OVERVIEW_NEXT);
		mWriteDatagram.writeInt(i); //index counter
		mWriteDatagram.writeInt(id); //group id
		mWriteDatagram.writeString(group->getType()); //type
		int stillAvailable = (mOwner->isGroupControlled(group)) ? 0 : 1;
		mWriteDatagram.writeByte(stillAvailable); //availability
		mWriteDatagram.writeString(group->getName());
		sendDatagram();
	}
	if(!waitForConfirmation(SeedUDPCommunication::UDP_AGENT_OVERVIEW_ACK)) {
		return false;
	}
	return true;
}
Exemple #9
0
/**
 *  Sends datagram packet to a multicast address and broadcast list specified in settings.
 * @param lpszData  Datagram packet to be broadcasted.
 */
void wavrUdpNetwork::sendBroadcast(QString* lpszData) {
    if(!isRunning) {
        wavrTrace::write("Warning: UDP server not running. Broadcast not sent");
        return;
    }

    QByteArray datagram = lpszData->toUtf8();
    sendDatagram(multicastAddress, datagram);
    for(int index = 0; index < broadcastList.count(); index++) {
        sendDatagram(broadcastList.at(index), datagram);
    }
}
bool SeedUDPClientHandler::executeSendCommunicationResetMessage() {

	mSendCommunicationResetInfoMessage = false;

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_RESET_COMMUNICATION_ACK);
	sendDatagram();

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_RESET_SIMULATION_ACK);
	sendDatagram();

	return true;
}
Exemple #11
0
bool TCore::list()
{
	enum ControlSymbols {
		I = 0x01,
		F,//0x02
		HEX,//0x03
	};
    const qint8 id = 3;
    QByteArray data(56,0);
    qint8 oper1 = id;
    moveWidget(id, LIST, 200, 10, 200, 300);
    memcpy(data.data(), &oper1, 1);
    oper1 = MainWindow::LIST;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = MainWindow::VALUE;
    memcpy(data.data()+2, &oper1, 1);
    qint32 value1 = 13;
    oper1 = I;
    memcpy(data.data()+3, &oper1, 1);
    memcpy(data.data()+4, &value1, 4);
    memcpy(data.data()+8, "th pickaninny toward to sea...; ", 32);
    float valueF = 3.14;
    oper1 = F;
    memcpy(data.data()+40, &oper1, 1);
    memcpy(data.data()+41, &valueF, 4);
    memcpy(data.data()+45, " - pi.", 6);
    oper1 = HEX;
    memcpy(data.data()+51, &oper1, 1);
    value1 = 21;
    memcpy(data.data()+52, &value1, 4);
    sendDatagram(address, remoutePort, data);
    return true;
}
bool SeedUDPClientHandler::handleAgentDeregistrationCommand() {

	if(mOwner == 0) {
		return false;
	}


	int id = mReadDatagram.readNextInt();

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_DEREGISTER_FROM_AGENT_ACK);
	mWriteDatagram.writeInt(id);

	if(mInterfaceGroups.keys().contains(id)) {
		InterfaceGroup *iGroup = mInterfaceGroups.take(id);
		if(iGroup == 0 || iGroup->mAssociatedObjectGroup == 0) {
			Core::log("SeedUPDClientHandler: Invalid state of interface group.");
			return false;
		}
		bool ok = mOwner->deregisterGroupController(iGroup->mAssociatedObjectGroup, this);

		mWriteDatagram.writeByte(ok ? 1 : 0);

		delete iGroup;
	}
	else {

		mWriteDatagram.writeByte(2); //signals: was not registered before.
	}
	sendDatagram();

	return true;
}
Exemple #13
0
void inquiry()
{
    Datagram dg;
    // This is a testing example
    /*
    inquiry_result_t btDev[2];
    strcpy(btDev[0].addr, "000A3A58F310");
    strcpy(btDev[0].name, "Elm327");
    strcpy(btDev[0].cod,  "12345");

    strcpy(btDev[1].addr, "0003C92DB48F");
    strcpy(btDev[1].name, "Nokia");
    strcpy(btDev[1].cod,  "56789");
    */

    QString inquiryResult;
    inquiryResult.clear();
    inquiryResult.append(3);
    inquiryResult.append("Nokia,0003C92DB48F,66894.Elm327,000A3A58F310,41847.HTC Vision,0005DY51K8X3,98017.");

    qDebug() << "\tPrinting: \"" <<inquiryResult.toStdString().c_str() << "\"";

    constructDatagram(&dg, RESPONSE, INQUIRY, strlen(inquiryResult.toStdString().c_str()), (unsigned char *)inquiryResult.toStdString().c_str());
    sendDatagram(&serial, &dg);
}
void UDPServer::listButtons()
{
    QString msg = "10;";
    msg += Mapper::instance()->getSelectedController().printAll();
    //msg += "TODO: append button list";
    sendDatagram(msg.toLatin1());
}
void DisplayRenderer::sendDisplayData(QImage im1, QImage im2)
{
	qDebug() << "sending data for displays";
	
	PC2TB_PACKET outPacket;

	// pack tha packet:
	outPacket.magicNumber1 = MAGIC_NUMBER1;
	outPacket.magicNumber2 = MAGIC_NUMBER2;
	outPacket.packetVersion = PACKET_VERSION;
	QTime midnight(0,0);
    int time_ms = midnight.msecsTo(MainWindow::app()->getTimeBaseTime());
	uint32_t time_100us = 10*time_ms;
	outPacket.pcTime_100us = time_100us;
	
	// ALGE text
	memcpy(outPacket.algeText, algeText().toAscii().data(), ALGE_TEXT_LEN);
	
	genMatrixData(im1, 1, outPacket.matrixData1);
	genMatrixData(im2, 2, outPacket.matrixData2);
	
	outPacket.matrixDataValid=1;
	
	outPacket.cmdReceiver=COMMAND_INVALID_RECEIVER;
	outPacket.command=COMMAND_INVALID_CMD;
	
	outPacket.crc = CRC8_run((uint8_t*)(&outPacket), (uint16_t)(sizeof(PC2TB_PACKET)-1));

	QByteArray datagram;
	datagram.setRawData((char*)(&outPacket), sizeof(PC2TB_PACKET));
	
	emit sendDatagram(datagram);
}
bool SeedUDPClientHandler::handleValueDeregistrationCommand() {

	int numberOfIds = mReadDatagram.readNextInt();

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_DEREGISTER_FROM_VALUE_ACK);
	mWriteDatagram.writeInt(numberOfIds);

	for(int i = 0; i < numberOfIds; ++i) {
		int id = mReadDatagram.readNextInt();
		bool foundId = false;

		QList<Value*> knownValues = mKnownValues.keys();
		for(int j = 0; j < knownValues.size(); ++j) {
			Value *value = knownValues.at(i);
			if(mKnownValues.value(value) == id) {
				foundId = true;
				if(mRegisteredValues.contains(value)) {
					mRegisteredValues.removeAll(value);
				}
			}
		}
		if(foundId) {
			mWriteDatagram.writeInt(id);
		}
		else {
			mWriteDatagram.writeInt(0); //id was not known, so no deregistration took place
		}
	}
	sendDatagram();

	return true;
}
void UDPServer::supportedDevices(const QString cmd)
{
    QString msg = "10;";
    QMap<QString, int> map;
    QString cmdStr;
    QString methodString;
    qDebug() << "cmd" << cmd;

    QStringList cmdList;
    cmdList = cmd.split(' ');
    cmdList.removeFirst();

    for(int i = 0; i < cmdList.size(); i++)
    {
        int intPos = cmdList[i].size() - 1;
        int number = cmdList[i].toLower().data()[intPos].digitValue();

        cmdStr = cmdList[i].remove(intPos,1);

        map[cmdStr] =  number;
    }

    methodString.append(QString("b %1,").arg(map.value("b", 0)));
    methodString.append(QString("p %1,").arg(map.value("p", 0)));
    methodString.append(QString("v %1").arg(map.value("v", 0)));

    qDebug() << "methodString: " << methodString;

    msg += SupportedDevices::instance()->printDevicesWithString(methodString);

    sendDatagram(msg.toLatin1());
}
bool SeedUDPClientHandler::handleEventRegistrationCommand() {

	int id = 0;

	QString eventName = mReadDatagram.readNextString();

	if(eventName.compare("") != 0) {
		EventManager *em = Core::getInstance()->getEventManager();
		Event *event = em->registerForEvent(eventName, this);

		if(event != 0) {
			if(mRegisteredEvents.keys().contains(event)) {
				id = mRegisteredEvents.value(event);
			}
			else {
				id = mEventIdCounter++;
				mRegisteredEvents.insert(event, id);
			}
		}
	}

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_REGISTER_FOR_EVENT_ACK);
	mWriteDatagram.writeInt(id);
	sendDatagram();

	return true;
}
Exemple #19
0
int Worker::sendBitmask()
{
    Datagram dg;
    unsigned char * bitmask;

    // FLEX: requests the bitmask

    receiveDatagram(serial, &dg);

    if (dg.type != REQUEST || dg.id != GET_BITMASK) {
        qDebug() << "Expected bitmap request!";
        return -1;
    }

    // PC: sends the bitmask

    bitmask = new unsigned char[((Vehicle *)vehicle)->getBitmaskSize()];
    ((Vehicle *)vehicle)->getBitmask(bitmask);
    constructDatagram(&dg,
                      RESPONSE,
                      GET_BITMASK,
                      ((Vehicle *)vehicle)->getBitmaskSize(),
                      bitmask);

    sendDatagram(serial, &dg);
    destructDatagramData(&dg);

    // switch to data request loop

    return 0;
}
Exemple #20
0
bool TCore::graph()
{
    enum CommandTypes {
	ADD_KOORD = 0,
	SETXTITLE,
	SETYTITLE,
    };
    //graphbody set val
    const qint8 id = 5;
    static float t = 0;
    if(!t)
	moveWidget(id, GRAPH, 460, 300, 300, 300);
    t += 0.1;
    QByteArray data(12,0);
    qint8 oper1 = id;
    memcpy(data.data(), &oper1, 1);
    oper1 = GRAPH;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = VALUE;
    memcpy(data.data()+2, &oper1, 1);
    static qint32 value = 0;
    oper1 = ADD_KOORD;
    memcpy(data.data()+3, &oper1, 1);
    value = 10*t*cos(t);
    memcpy(data.data()+4, &value, 4);
    value = 10*t*sin(t);
    memcpy(data.data()+8, &value, 4);
    /*value = t;
    memcpy(data.data()+12, &value, 4);
    value = cos(t);
    memcpy(data.data()+16, &value, 4);*/
    sendDatagram(address, remoutePort, data);
    //graphbody set title
    data.resize(12);
    oper1 = id;
    memcpy(data.data(), &oper1, 1);
    oper1 = GRAPH;
    memcpy(data.data()+1, &oper1, 1);
    oper1 = VALUE;
    memcpy(data.data()+2, &oper1, 1);
    qint8 oper2 = SETXTITLE;
    memcpy(data.data()+3, &oper2, 1);
    memcpy(data.data()+4, "x values", 8);
    sendDatagram(address, remoutePort, data);
    return true;
}
GroundStation::GroundStation(QWidget *parent)
//    : QPushButton(tr("Quit"), parent)
{
//    connect(&timer, SIGNAL(timeout()), this, SLOT(sendDatagram()));

//    timer.start(2 * 1000);
    sendDatagram();
}
void UDPServer::sendDeviceList()
{
    QString dvcs = "10;";
    if(UsableControllers::printAllShortList().isEmpty())
        dvcs += "No usable controllers connected!";
    else
        dvcs += QString(UsableControllers::printAllShortList());
    sendDatagram(dvcs.toLatin1());
}
void UDPServer::handleDataRequest(QString data)
{
    qDebug() << "UDPServer::handleDataRequest called with data:" << data;
    QString cmd = data.section(';',1,1).toLower();
    switch (COMMANDS.indexOf(cmd.section(' ',0,0)))
    {
    case 0: // Help command (help)
        qDebug() << "help command called";
        sendHelp();
        break;
    case 1: // List devices command (lsdvs)
        qDebug() << "List devices command called";
        sendDeviceList();
        break;
    case 2: // Select device command (sldvc)
        qDebug() << "Select device command called";
        selectDevice(cmd);
        break;
    case 3: // Deselect device command (dsdvc)
        qDebug() << "Deselect device command called";
        deselectDevice();
        break;
    case 4: // List buttons command (lsbts)
        qDebug() << "List buttons command called";
        listButtons();
        break;
    case 5: // Keymap command (kmap)
        qDebug() << "Keymap command called";
        mapKey(cmd);
        break;
    case 6: // Undo keymap command (umap)
        qDebug() << "Undo keymap command called";
        unmapKey(cmd);
        break;
    case 7: // Supported devices command (supdvs)
        qDebug() << "Supported devices command called";
        supportedDevices(cmd);
        break;
    case 8: // Axis Format Map (afmap)
        qDebug() << "Axis Format Map command called";
        axisFormatMap(cmd);
        break;
    case 9: // Axis Key Map (akmap)
        qDebug() << "Axis Key Map command called";
        axisKeyMap(cmd);
        break;
    default:
        qDebug() << "Command not recognised";
        QString reply = "10;";
        reply += "\'" + cmd.section(' ',0,0) + "\'";
        reply += " is not recognized as a command, use the \'help\' command for more information";
        sendDatagram(reply.toLatin1());
        break;
    }

    emit dataAvailable(data);
}
Exemple #24
0
void loop()
{
    for (;;) {
        //receiveBitmask();
        unsigned int value, j;
        unsigned char buff[10];
        unsigned char cmd;
        bool goOn = true;
        do {
            //FLEX: request loop

            //for (int i=0; i<bitmaskSize*8; i++) {
            for (int i=0; i<4; i++) {
                qDebug() << "Dentro: "<< i;
                Datagram dg;
                unsigned int d;

                d = (1.0 + sin(t))/2.0 * 125.0;
                t += 0.01;

                if (i == 2) {// RPM
                    d *= 17000 / 125;
                    qDebug() << "sending:" << d;
                }

                value = d;
                for (j=0; value != 0; j++) {
                    buff[j] = value % 256;
                    value /= 256;
                }
                buff[j] = '\0';
                if (j == 0) {
                    buff[0] = 0;
                    buff[1] = '\0';
                    j = 1;
                }

                qDebug() << "Monitor: " << i;
                qDebug() << "Data:    " << i;
                qDebug() << " ";
                constructDatagram(&dg, DATA, i, j, buff);
                sendDatagram(&serial,&dg);
                usleep(10000);
            }

            //FLEX: c’è = readUART1(&something)
        } while (goOn);
        cmd = -1;
        if (cmd == STOP) {
            qDebug() << "Stop request";
            exit(0);
        } else if (cmd != GET_BITMASK) {
            qDebug() << "Expected bitmask request!";
            exit(1);
        }
    }
}
void NetworkHandler::sendColor(const QColor &color)
{
    if(color.isValid() && time_.elapsed() >= 50) {
        QString myRgb;
        myRgb.append((quint8)(color.redF()*255));
        myRgb.append((quint8)(color.greenF()*255));
        myRgb.append((quint8)(color.blueF()*255));
        sendDatagram(myRgb);
    }
}
bool SeedUDPClientHandler::handleValueListCommand() {


	ValueManager *vm = Core::getInstance()->getValueManager();

	QString regExp = mReadDatagram.readNextString();

	QList<QString> valueNames = vm->getValueNamesMatchingPattern(regExp);

	mWriteDatagram.clear();
	mWriteDatagram.writeByte(SeedUDPCommunication::UDP_VALUE_IDS);
	mWriteDatagram.writeInt(valueNames.size());
	sendDatagram();

	for(int i = 0; i < valueNames.size(); ++i) {

		Value *value = vm->getValue(valueNames.at(i));
		int id = -1;
		if(value != 0) {
			if(mKnownValues.keys().contains(value)) {
				id = mKnownValues.value(value);
			}
			else {
				id = mValueIdCounter++;
				mKnownValues.insert(value, id);
			}
		}
		mWriteDatagram.clear();
		mWriteDatagram.writeByte(SeedUDPCommunication::UDP_VALUE_INFO);
		mWriteDatagram.writeInt(i);
		mWriteDatagram.writeInt(id);
		if(value == 0) {
			mWriteDatagram.writeString("");
		}
		else {
			mWriteDatagram.writeString(value->getName());
		}
		mWriteDatagram.writeString(valueNames.at(i));
		sendDatagram();
	}
	return true;
}
void UDPServer::sendControllerAction(const QString action)
{
    qDebug() << "UDPServer::sendControllerAction entered, taking appropriate action";

    QString msg = "20;";
    msg += action;

    // TODO: make reaction dependable on value of action
    // for now just send the action to the client
    sendDatagram(msg.toLatin1());
}
void UDPServer::deselectDevice()
{
    QString msg = "10;";

    if(Mapper::instance()->tryDeviceSelect(-1))
        msg += "Device successfully deselected!";
    else
        msg += "Error: Device was not deselected, please try again";

    sendDatagram(msg.toLatin1());
}
// AME = Alive Message Expected
void UDPServer::sendAME()
{
    QString address = udpSocket->localAddress().toString();
    quint16 port = udpSocket->localPort();
    QByteArray datagram = "4;" + address.toLatin1() + ";" +  QByteArray::number(port);

    startAliveTimer();
    sendDatagram(datagram);

    qDebug() << "AME Message sent";
}
void UDPServer::sendSYNACK()
{
    QString address = otherNodeAddress();
    quint16 port = udpSocket->localPort();
    QByteArray datagram = "2;" + address.toLatin1() + ";" +  QByteArray::number(port);

    startTimeOutTimer();
    sendDatagram(datagram);

    qDebug() << "SYN-ACK Message sent";
}