示例#1
0
bool StandardSerialPortBackend::writeError()
{
//    qDebug() << "!d" << tr("DBG -- Serial Port writeError...");

    SioWorker::usleep(300);
    return writeRawFrame(QByteArray(1, 69));
}
示例#2
0
bool StandardSerialPortBackend::writeError()
{
//    qDebug() << "!d" << tr("DBG -- Serial Port writeError...");

    if(mMethod==HANDSHAKE_SOFTWARE)SioWorker::usleep(mWriteDelay);
    else SioWorker::usleep(mCompErrDelay);
    return writeRawFrame(QByteArray(1, 69));
}
示例#3
0
bool StandardSerialPortBackend::writeDataFrame(const QByteArray &data)
{
//    qDebug() << "!d" << tr("DBG -- Serial Port writeDataFrame...");

    QByteArray copy(data);
    copy.resize(copy.size() + 1);
    copy[copy.size() - 1] = sioChecksum(copy, copy.size() - 1);
    SioWorker::usleep(50);
    return writeRawFrame(copy);
}
示例#4
0
bool StandardSerialPortBackend::writeDataNak()
{
//    qDebug() << "!d" << tr("DBG -- Serial Port writeDataNak...");

    return writeRawFrame(QByteArray(1, 78));
}
示例#5
0
bool StandardSerialPortBackend::writeCommandAck()
{
//    qDebug() << "!d" << tr("DBG -- Serial Port writeCommandAck...");

    return writeRawFrame(QByteArray(1, 65));
}
示例#6
0
void HuffmanCodec::encode(BitEncoder* sink, int* raw, int rawFill, bool* userFallback)
{
	/** determine dynamic range (min, max)
	  */
	int rawMin = raw[0];
	int rawMax = raw[0];
	{
		for (int i = 1; i < rawFill; ++i)
		{
			int x = raw[i];
			if (x < rawMin) rawMin = x;
			else if (x > rawMax) rawMax = x;
		}
	}

	/** optional fallback to raw data transmission
	  */
	if (rawMax - rawMin + 1 > rawDynamicRange_)
	{
#ifdef FTL_HUFFMANCODEC_PROFILING
		print(
			"Fallback to unencoded transmission, because out of dynamic range.\n"
			"    (rawMax - rawMin + 1, rawDynamicRange_) = (%%, %%)\n",
			(rawMax - rawMin + 1), rawDynamicRange_
		);
#endif // FTL_HUFFMANCODEC_PROFILING
		if (!userFallback)
			writeRawFrame(sink, raw, rawFill, rawMin, rawMax);
		else
			*userFallback = true;
		return;
	}
	
	/** determine symbol frequencies
	  */
	reset();
	for (int i = 0; (i < rawFill) && (codeTableFill_ < rawDiversity_); ++i)
	{
		int x = raw[i] - rawMin;
		if (!codeMap_[x].symbol)
			addSymbol(x, 0);
		++codeMap_[x].symbol->count;
	}

	/** optional fallback to raw data transmission
	  */
	if (codeTableFill_ == rawDiversity_)
	{
		if (!userFallback)
			writeRawFrame(sink, raw, rawFill, rawMin, rawMax);
		else
			*userFallback = true;
		return;
	}

	/** generate code table
	  */
	int diversity = codeTableFill_;
	generateCodeTable();

#ifdef FTL_HUFFMANCODEC_DEBUG_STATISTICS
	for (int i = 0; i < diversity; ++i)
	{
		FTL_DEBUG << i << ": H(" << codeTable_[i].value << ") = " << codeTable_[i].count << endl;
	}
#endif

	/** determine output size
	  */
	int tableSize = 0;
	int outSize = 1;    // encoding flag
	outSize += BitEncoder::bitsPerUIntVlc(rawFill);
	outSize += BitEncoder::bitsPerUIntVlc(rawMin);
	tableSize += BitEncoder::bitsPerUIntVlc(diversity);
	for (int i = 0; i < diversity; ++i)
	{
		tableSize += BitEncoder::bitsPerUIntVlc(codeTable_[i].value);
		tableSize += BitEncoder::bitsPerUIntVlc(codeTable_[i].count);
		SymbolNode* sym = codeTable_ + i;
		int len = 0;
		while ((sym = sym->parent) != 0) ++len;
		outSize += len * codeTable_[i].count;
	}
	
	outSize += tableSize;
	int outSizeBytes = outSize / 8 + (outSize % 8 != 0);

#ifdef FTL_HUFFMANCODEC_PROFILING
	print(
		"diversity, outSize, table weight = %%, %%, %%\n",
		diversity, outSize/8, double(tableSize) / outSize
	);
#endif // FTL_HUFFMANCODEC_PROFILING

	/** optional fallback to raw data transmission
	  */
	if (outSizeBytes > encodedCapacity(rawFill, rawMax-rawMin+1))
	{
#ifdef FTL_HUFFMANCODEC_PROFILING
		print("fallback to unencoded transmission\n");
#endif // FTL_HUFFMANCODEC_PROFILING
		if (!userFallback)
			writeRawFrame(sink, raw, rawFill, rawMin, rawMax);
		else
			*userFallback = true;
		return;
	}

	if (userFallback)
		*userFallback = false;
	
	/** write header
	  */
	sink->writeUIntVlc(rawFill);
	sink->writeIntVlc(rawMin);
	sink->writeIntVlc(rawMax);
	sink->writeBit(1);    // encoding flag
	
	/** write frequency table
	  */
	sink->writeUIntVlc(diversity);
	for (int i = 0; i < diversity; ++i)
	{
		sink->writeUIntVlc(codeTable_[i].value);
		sink->writeUIntVlc(codeTable_[i].count);
	}

	/** encode symbols
	  */
	for (int i = 0; i < rawFill; ++i)
	{

		int x = raw[i] - rawMin;
		
		SymbolNode* sym = codeMap_[x].symbol;
		bitStack_.clear();
		while (sym->parent)
		{
			SymbolNode* parent = sym->parent;
			bitStack_.push(parent->rightChild == sym);
			sym = parent;
		}
		while (bitStack_.fill() > 0)
			sink->writeBit(bitStack_.pop());
	}
}