OneDigg OneDiggFromXPathNodeFactory::createDigg(pugi::xpath_node &node) {
	ValuesFromNodeExtractor extractor;
	auto title = extractor.getValueFromNode(node, (InputFileConstants::getDiggNameNodeName()+"/text()").c_str());
	auto description = extractor.getValueFromNode(node, (InputFileConstants::getDiggDescriptionNodeName()+"/text()").c_str());
	int diggsCount = getDiggsCount(node, extractor);

	std::string date = fetchDate(node, extractor);
	std::string time = fetchTime(node, extractor);
	std::string dateWithTime = extractor.getValueFromNode(node, (InputFileConstants::getDiggTimeNodeName()+"/text()").c_str());
	return OneDigg(title, description, diggsCount, date, dateWithTime);
}
void setup() {
  //wdt_disable();
  wdt_reset();

  // Set the watchdog timer to 8 seconds
  wdt_enable(WDTO_8S);

  // start the serial library:
  Serial.begin(9600);	//debug messages
  Serial1.begin(9600);	//RFID
  Serial.println("Artifactory Door\r\n  Booting");

  auxSetup();
  fetchTime();
  lcdDisplayTime(1);
  
  if (SD.begin(SD_CS_PIN)) {
/*
    if(SD.exists(logFile)){  //if there is an active log file 
      archiveLog();  
    }
*/
    nextFileName(logFile, logFilePrefix, logFileSuffix);
    fileWrite(logFile, "booting", "", true);
    Serial.print("logFile = ");
    Serial.println(logFile);

    openFile = SD.open(fullFile);  //can we open the full members file?
    if (openFile) {
		fileWrite(logFile, "full members file open success: ", fullFile, true);      
		SDcardPresent = true;
    }
    openFile.close();

	openFile = SD.open(restFile);
	if (openFile) {
		fileWrite(logFile, "restricted members file open success: ", restFile, true); 
	}
    openFile.close();

    openFile = SD.open(assocFile);  //can we open the full members file?
    if (openFile) {
		fileWrite(logFile, "associate members file open success: ", assocFile, true);      
    }
    openFile.close();
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Artifactory Door");
  lcd.setCursor(0, 1);
  lcd.print("  Booting");

/*    
  if (Ethernet.begin(mac) == 0) {
    Serial.println("DHCP failed.");
    // initialize the ethernet device not using DHCP:
    Ethernet.begin(mac, ip, gateway, subnet);
  }
  Serial.print("IP = ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();

  if(serverWrite("booting", "", false) == true) {
    Serial.println("telnet sending");
  } else {
    Serial.println("telnet send failed");
  }
*/
  
  //fast timers are measured against micros()
  fastTimers[TIMERSECOND].period = 1 S;
  fastTimers[TIMERSECOND].start = micros();
  fastTimers[TIMERSECOND].active = true;
  fastTimers[TIMERSECOND].expire = theTimeIncrement;

  fastTimers[TIMERSLOWPOLL].period = 2 S;
  fastTimers[TIMERSLOWPOLL].start = micros();
  fastTimers[TIMERSLOWPOLL].active = true;
  fastTimers[TIMERSLOWPOLL].expire = pollSlowTimers;

  fastTimers[TIMERSTRIKE].period = 5 S;
  fastTimers[TIMERSTRIKE].active = false;
  fastTimers[TIMERSTRIKE].expire = closeTheDoor;

  fastTimers[TIMERLEDBLINK].period = 1 S; // Seconds
  fastTimers[TIMERLEDBLINK].active = false;
  fastTimers[TIMERLEDBLINK].expire = ledBlink;

  fastTimers[TIMERLEDFADER].period = 10 MS;
  fastTimers[TIMERLEDFADER].active = false;
  fastTimers[TIMERLEDFADER].expire = ledFade;

/*
  fastTimers[TIMERSERVER].period = 10 S;
  fastTimers[TIMERSERVER].active = false;
  fastTimers[TIMERSERVER].expire = serverTimeout;
*/
  //slow timers are measured against theTime
  slowTimers[TIMERLOGDUMP].period = 86400;  // seconds
  slowTimers[TIMERLOGDUMP].start = theTime;
  slowTimers[TIMERLOGDUMP].active = true;
  slowTimers[TIMERLOGDUMP].expire = dumpLogs;

  slowTimers[TIMERRTCREFRESH].period = 86400;  // ten hours
  //slowTimers[TIMERRTCREFRESH].period = 15;  // ten hours
  slowTimers[TIMERRTCREFRESH].start = theTime;
  slowTimers[TIMERRTCREFRESH].active = true;
  slowTimers[TIMERRTCREFRESH].expire = fetchTime;

  slowTimers[TIMERLCDTIME].period = 2;  	// seconds
  slowTimers[TIMERLCDTIME].start = theTime;
  slowTimers[TIMERLCDTIME].active = true;
  slowTimers[TIMERLCDTIME].expire = LCDrefresh;

	slowTimers[TIMERDOORBELL].period = 2;	// seconds
	slowTimers[TIMERDOORBELL].active = false;
	slowTimers[TIMERDOORBELL].expire = DoorBellRefresh;

	slowTimers[TIMERDOORSTATUS].period = 2;	// seconds
	slowTimers[TIMERDOORSTATUS].active = false;
	slowTimers[TIMERDOORSTATUS].expire = DoorStatusRefresh;

  slowTimers[TIMEREXITGRACE].period = 60; // Give a 1 minute grace period post lockup
  slowTimers[TIMEREXITGRACE].active = false;
  slowTimers[TIMEREXITGRACE].expire = closeSpaceFinal;

  //slowTimers[TIMERINDUCEDEATH].period = 10;
  //slowTimers[TIMERINDUCEDEATH].active = true;
  //slowTimers[TIMERINDUCEDEATH].expire = induceDeath;

  PCICR |= (1 << PCIE2);  //enable port-change interrupt on port-change-byte 2
  PCMSK2 |= DOORBELLBIT;
  PCMSK2 |= REEDSWITCHBIT;
  PCMSK2 |= GUESTOKBIT;
  PCMSK2 |= LOCKUPBIT;

  pinMode(DOORSTRIKE, OUTPUT);
  pinMode(LCDBACKLIGHT, OUTPUT);
  pinMode(DOORBELL, INPUT);
  pinMode(REEDSWITCH, INPUT);
  pinMode(GUESTOKSWITCH, INPUT);
  pinMode(LOCKUPBUTTON, INPUT);

  digitalWrite(LCDBACKLIGHT, HIGH);
  digitalWrite(DOORBELL, HIGH);  //pullup resistors
  digitalWrite(REEDSWITCH, HIGH);
  digitalWrite(GUESTOKSWITCH, HIGH);
  digitalWrite(LOCKUPBUTTON, HIGH);

//  interruptFlags = 0;


	pinMode(DOORBELLLED, OUTPUT);
	pinMode(GUESTOKLED, OUTPUT);
	pinMode(LOCKUPLED, OUTPUT);

	digitalWrite(DOORBELLLED, LOW);
	digitalWrite(GUESTOKLED, LOW);
	digitalWrite(LOCKUPLED, LOW);

	pinMode(STATUS_R, OUTPUT);
	pinMode(STATUS_G, OUTPUT);
	pinMode(STATUS_B, OUTPUT);
	digitalWrite(STATUS_R, LOW);
	digitalWrite(STATUS_G, LOW);
	digitalWrite(STATUS_B, LOW);

}