Exemplo n.º 1
0
size_t RDRingBuffer::write(char *src,size_t cnt)
{
  size_t free_cnt;
  size_t cnt2;
  size_t to_write;
  size_t n1, n2;

  if ((free_cnt = writeSpace()) == 0) {
    return 0;
  }

  to_write = cnt > free_cnt ? free_cnt : cnt;

  cnt2 = rb->write_ptr + to_write;

  if (cnt2 > rb->size) {
    n1 = rb->size - rb->write_ptr;
    n2 = cnt2 & rb->size_mask;
  } else {
    n1 = to_write;
    n2 = 0;
  }

  memcpy (&(rb->buf[rb->write_ptr]), src, n1);
  rb->write_ptr += n1;
  rb->write_ptr &= rb->size_mask;

  if (n2) {
    memcpy (&(rb->buf[rb->write_ptr]), src + n1, n2);
    rb->write_ptr += n2;
    rb->write_ptr &= rb->size_mask;
  }

  return to_write;
}
void TextWriter::writeNodeKids(const Node* Nd, bool EmbeddedInParent) {
  // Write out with number of kids specified to be on same line,
  // with remaining kids on separate (indented) lines.
  int Type = int(Nd->getType());
  int Count = 0;
  int KidsSameLine = KidCountSameLine[int(Type)];
  int NumKids = Nd->getNumKids();
  if (NumKids <= MaxKidCountSameLine[int(Type)])
    KidsSameLine = MaxKidCountSameLine[int(Type)];
  Node* LastKid = Nd->getLastKid();
  int HasHiddenSeq = HasHiddenSeqSet.count(Type);
  bool ForceNewline = false;
  for (auto* Kid : *Nd) {
    if (HasHiddenSeq && Kid == LastKid && isa<SequenceNode>(LastKid)) {
      writeNewline();
      writeNode(Kid, true, HasHiddenSeq);
      return;
    }
    ++Count;
    if (ForceNewline) {
      writeNode(Kid, true);
      continue;
    }
    if (NeverSameLine.count(Kid->getType())) {
      if (!(Count == 1 && EmbeddedInParent))
        writeNewline();
      ForceNewline = true;
      writeNode(Kid, true);
      continue;
    }
    if (Count < KidsSameLine) {
      writeSpace();
      writeNode(Kid, false);
      continue;
    }
    if (Count == KidsSameLine) {
      writeSpace();
      ForceNewline = Count < NumKids;
      writeNode(Kid, ForceNewline);
      continue;
    }
    ForceNewline = true;
    writeNode(Kid, true);
  }
}
void TextWriter::writeNodeKidsAbbrev(const Node* Nd, bool EmbeddedInParent) {
  // Write out with number of kids specified to be on same line,
  // with remaining kids on separate (indented) lines.
  int Type = int(Nd->getType());
  int Count = 0;
  int KidsSameLine = KidCountSameLine[int(Type)];
  int NumKids = Nd->getNumKids();
  if (NumKids <= MaxKidCountSameLine[int(Type)])
    KidsSameLine = MaxKidCountSameLine[int(Type)];
  Node* LastKid = Nd->getLastKid();
  int HasHiddenSeq = HasHiddenSeqSet.count(Type);
  for (auto* Kid : *Nd) {
    if (HasHiddenSeq && Kid == LastKid && isa<SequenceNode>(Kid)) {
      fprintf(File, " ...[%d]", Kid->getNumKids());
      return;
    }
    if (NeverSameLine.count(Kid->getType())) {
      fprintf(File, " ...[%d]", NumKids - Count);
      return;
    }
    ++Count;
    if (Count < KidsSameLine) {
      writeSpace();
      writeNodeAbbrev(Kid, false);
      continue;
    }
    if (Count == KidsSameLine) {
      writeSpace();
      writeNode(Kid, false);
      if (Kid != LastKid)
        fprintf(File, " ...[%d]", NumKids - Count);
      return;
    }
    if (Count == 1 && EmbeddedInParent) {
      fprintf(File, " ...[%d]", NumKids);
      return;
    }
    writeSpace();
    writeNode(Kid, false);
    if (Kid != LastKid)
      fprintf(File, " ...[%d]", NumKids - Count);
    return;
  }
}
Exemplo n.º 4
0
static void _hReceiverTest()
{
	static const char* const info[6][2] PROGMEM = {
		{ strLeft, strRight },
		{ strForward, strBack },
		{ strRight, strLeft },
		{ strIdle, strFull },
		{ strOff, strOn },
		{ strOff, strOn },
	};
	
	for (uint8_t i = 0; i < 6; i++)
	{
		if (RX_good & _BV(i))
		{
			writeValue(i, 66, RX[i], 4, -1);
			lcdSetPos(i, 96);
			if (i == THR)
			{
				if (State.ThrottleOff)
					writePadded_P(strIdle, 5);
				else if (RX[THR] >= RX_THRESHOLD)
					writePadded_P(strFull, 5);
				else
					writeSpace(5);
			}
			else
			{
				if (abs(RX[i]) > (RX_THRESHOLD / 2))
					writePadded_P((PGM_P)pgm_read_word(&info[i][RX[i] > 0]), 5);
				else
					writeSpace(5);
			}
		}
		else
		{
			lcdSetPos(i, 66);
			lcdWriteString_P(strNoSignal);
		}
	}
}
inline size_t SingleRWRingBuffer :: write(const char * src, size_t sz) {
	size_t space = writeSpace();
	sz = sz > space ? space : sz;
	if (sz == 0) return 0;

	size_t w = mWrite;
	size_t end = w + sz;

	if (end < mSize) {
		memcpy(mData+w, src, sz);
	} else {
		size_t split = mSize-w;
		end &= mWrap;
		memcpy(mData+w, src, split);
		memcpy(mData, src+split, end);
	}

	mWrite = end;
	return sz;
}
Exemplo n.º 6
0
static void writePadded_P(const char *s, uint8_t len)
{
	lcdWriteString_P(s);
	writeSpace(len - strlen_P(s));
}
Exemplo n.º 7
0
static void writePadded(char *s, uint8_t len)
{
	lcdWriteString(s);
	writeSpace(len - strlen(s));
}