
#include "RBPXPLRTERM_config.h"

/*
 * ======================= global variables ====================
 */

bool flags[NUMFLAGS];
int  counters[NUMCOUNTERS];

bool setFlag(int nflag, bool newFlag) {
  if (nflag>=NUMFLAGS) return false;
  flags[nflag] = newFlag;
  return flags[nflag];
}

bool getFlag(int nflag) {
  if (nflag>=NUMFLAGS) return false;
  return flags[nflag];
}

extern bool toggleFlag(int nflag) {
  if (nflag>=NUMFLAGS) return false;
  bool oldflag = getFlag(nflag);
  setFlag(nflag,!oldflag);
  return oldflag;
}

extern int setCounter(int ncounter, int newCounter) {
  if (ncounter>=NUMCOUNTERS) return -1;
  return (counters[ncounter]=newCounter);  
}

extern int getCounter(int ncounter) {
  if (ncounter>=NUMCOUNTERS) return -1;
  return counters[ncounter];
}

extern int incrementCounter(int ncounter) {
  if (ncounter>=NUMCOUNTERS) return -1;
  return ++counters[ncounter];
}

extern String getParameter(int nparam) {
  switch (nparam) {
    case PAR_CONFIGFILENAME:      return String(__FILE__);      break;
    case PAR_CONFIGFILEDATE:      return String(__DATE__);      break;
    case PAR_CONFIGFILETIME:      return String(__TIME__);      break;
    default: return String("getParameter: unknown parameter number "+nparam);
  }
}

extern int decrementCounter(int ncounter) {
  if (ncounter>=NUMCOUNTERS) return -1;
  return --counters[ncounter];
}

extern bool setEcho(bool newEcho) {
  return setFlag(FLG_ECHO, newEcho);
}

extern bool getEcho() {
  return getFlag(FLG_ECHO);
}

bool getInputHadDotCommand() {
  return getFlag(FLG_INPUTHADDOTCOMMAND);
}

void setInputHadDotCommand(bool newInputHadDotCommand) {
  setFlag(FLG_INPUTHADDOTCOMMAND,newInputHadDotCommand);
}

int getRepeatCount() {
  return getCounter(CNT_REPEATCOUNT);
}

int setRepeatCount(int newRepeatCount) {
  return setCounter(CNT_REPEATCOUNT,newRepeatCount);
}

int incrementRepeatCount() {
  return incrementCounter(CNT_REPEATCOUNT);
}

// decrement repeatCount and return true if it has reached 0
bool decrementRepeatCount() {
  return decrementCounter(CNT_REPEATCOUNT);
}

bool getDebug() {
  return getFlag(FLG_DEBUG);
}

bool setDebug(bool newDebug) {
  return setFlag(FLG_DEBUG,newDebug);
}

bool toggleDebug() {
  return toggleFlag(FLG_DEBUG);
}

String formatLongGrouped(unsigned long val, boolean leadzeroblank) {
  if (val>=1000) {
    String u;
    if (val>=1000000) {
      u = formatLongGrouped(val/1000,false);
    } else {
      u = formatLongGrouped(val/1000,true);
    }
    String v = formatLongGrouped(val%1000,false);
    String s = String( u + "." + v );
    // SERIAL_PRINTF("formatLongGrouped.u=%s.v=%s.concatenated=%s\n",u.c_str(),v.c_str(),s.c_str());
    return s;
  } else {
    char sbuf[4];
    if (leadzeroblank) { 
      sprintf(sbuf,"%3d",val);
    } else {
      sprintf(sbuf,"%03d",val);
    }
    String s = String(sbuf);
    // SERIAL_PRINTF("formatLongGrouped.val=%d.s=%s\n",val,s.c_str());
    return String(sbuf);
  }
}

const char* millisf() {
  return formatLongGrouped(millis()).c_str();
}

const char* microsf() {
  return formatLongGrouped(micros()).c_str();
}

String millisfs() {
  return formatLongGrouped(millis());
}

String microsfs() {
  return formatLongGrouped(micros());
}
