int FatFile::printField(float value, char term, uint8_t prec) {
  char buf[24];
  char* str = &buf[sizeof(buf)];
  if (term) {
    *--str = term;
    if (term == '\n') {
      *--str = '\r';
    }
  }
  str = fmtFloat(value, str, prec);
  return write(str, buf + sizeof(buf) - str);
}
Esempio n. 2
0
//------------------------------------------------------------------------------
int StdioStream::printDec(float value, uint8_t prec) {
#define FLOAT_NEW_WAY
#ifdef FLOAT_NEW_WAY
  char buf[24];
  char *ptr = fmtFloat(value, buf + sizeof(buf), prec);
  // return fputs(ptr);
  // uint8_t len = buf + sizeof(buf) - ptr;
  return write(ptr, buf + sizeof(buf) - ptr);
#else
  char* ptr;
  uint8_t rtn = 0;
  uint8_t sign = 0;
  if (value < 0) {
    value = -value;
    sign = '-';
  }
  // check for NaN INF OVF
  if (isnan(value)) {
    if (fputs_P(PSTR("nan")) < 0) {
      return -1;
    }
    rtn += 3;
  } else if (isinf(value)) {
    if (fputs_P(PSTR("inf")) < 0) {
      return -1;
    }
    rtn += 3;
  } else if (value > 4294967040.0) {
    if (fputs_P(PSTR("ovf")) < 0) {
      return -1;
    }
    rtn += 3;
  } else {
    if (sign) {
      if (putc(sign) < 0) {
        return -1;
      }
      rtn++;
    }
    if (prec > 9) {
      prec = 9;
    }

    /*
       uint32_t s = 1;
       for (uint8_t i = 0; i < prec; i++) {
         // s *= 10;
         s = ((s << 2) + s) << 1;
       }
       // round value
       value += 0.5/s;
     */
    value += scale10(0.5, -prec);
    uint32_t whole = value;
    int np;
    if ((np = printDec(whole)) < 0) {
      return -1;
    }
    rtn += np;
    if (prec) {
      if (putc('.') < 0) {
        return -1;
      }
      char* str = fmtSpace(prec);
      if (!str) {
        return -1;
      }
      char* tmp = str - prec;

      //  uint32_t fraction = s*(value - whole);
      uint32_t fraction =  scale10(value - whole, prec);
      ptr = fmtDec(fraction, str);
      while (ptr > tmp) {
        *--ptr = '0';
      }
      rtn += prec + 1;
    }
  }
  return rtn;
#endif
}