OverviewFilesCommitsIssuesDocsReleasesPeers

cthuloid / Arduino / libraries / PrintLevel / PrintLevel.h

94 lines · c ref:
// Put the writing target here, as long as it has print() and println() methods
#ifndef gPrinter
  #define gPrinter Serial
#endif

namespace PrintLevel {
	enum PrintLevel {SILENT=0, ERRORS_ONLY, NORMAL_ACKS, ALL_INFO, NUM_SETTINGS};
    char *gStrings[] = {"silent", "error", "ack", "info"};
	PrintLevel gPrintLevel = ALL_INFO;

	const char *toString(PrintLevel p) {
		if(p >= 0 && p < NUM_SETTINGS) return gStrings[p];
		else return gStrings[ALL_INFO];
	}

	const char *toString() { return toString(gPrintLevel); }

	bool set(const char *str) {
	  PrintLevel mode;
	  int i;
	  for(i = 0; i < NUM_SETTINGS; i++) {
		if(!strcmp(str, gStrings[i])) {
		  mode = (PrintLevel)i;
		  break;
		}
	  }

	  if(i == NUM_SETTINGS) {
		/*int mode;
		if(!toInt(arg, &mode) || mode < PrintLevel::ERRORS_ONLY || mode > PrintLevel::ALL_INFO) {
		  printlnError("Error: argument must be between 0 and 3 or one of 'silent', 'error', 'ack', 'info'");
		  return;
		}
		*/
		return false;
	  }
	
	  gPrintLevel = mode;
	  return true;
	}

	void printErrorString() {
		gPrinter.print("Error: argument must one of the following: ");
		for(int i = 0; i < NUM_SETTINGS; i++) {
			gPrinter.print('\'');
			gPrinter.print(gStrings[i]);
			gPrinter.print('\'');
			if(i == NUM_SETTINGS-1) gPrinter.print('\n');
			else gPrinter.print(", ");
		}
	}
}

template<class T>
void printlnAlways(T s) {
  gPrinter.println(s);
}
template<class T>
void printlnError(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::ERRORS_ONLY) return;
  gPrinter.println(s);
}
template<class T>
void printlnAck(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::NORMAL_ACKS) return;
  gPrinter.println(s);
}
template<class T>
void printlnInfo(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::ALL_INFO) return;
  gPrinter.println(s);
}
template<class T>
void printAlways(T s) {
  gPrinter.print(s);
}
template<class T>
void printError(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::ERRORS_ONLY) return;
  gPrinter.print(s);
}
template<class T>
void printAck(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::NORMAL_ACKS) return;
  gPrinter.print(s);
}
template<class T>
void printInfo(T s) {
  if(PrintLevel::gPrintLevel < PrintLevel::ALL_INFO) return;
  gPrinter.print(s);
}

#undef gPrinter