class elapsedSeconds
{
private:
	unsigned long ms=0;
public:
	elapsedSeconds(void) { ms = millis();}
	elapsedSeconds(unsigned long val) { ms = millis() - 1000UL*val ; }
	elapsedSeconds(const elapsedSeconds &orig) { ms = orig.ms; }
	operator unsigned long () const { return (millis()-ms)/1000; }
	elapsedSeconds & operator = (const elapsedSeconds &rhs) { ms = rhs.ms; return *this; }
	elapsedSeconds & operator = (unsigned long val) { ms = millis() - val*1000UL; return *this; }
	elapsedSeconds & operator -= (unsigned long val)      { ms += val*1000UL ; return *this; }
	elapsedSeconds & operator += (unsigned long val)      { ms -= val*1000UL ; return *this; }
	elapsedSeconds operator - (int val) const           { elapsedSeconds r(*this); r.ms += val*1000UL; return r; }
	elapsedSeconds operator - (unsigned int val) const  { elapsedSeconds r(*this); r.ms += val*1000UL; return r; }
	elapsedSeconds operator - (long val) const          { elapsedSeconds r(*this); r.ms += val*1000UL; return r; }
	elapsedSeconds operator - (unsigned long val) const { elapsedSeconds r(*this); r.ms += val*1000UL; return r; }
	elapsedSeconds operator + (int val) const           { elapsedSeconds r(*this); r.ms -= val*1000UL; return r; }
	elapsedSeconds operator + (unsigned int val) const  { elapsedSeconds r(*this); r.ms -= val*1000UL; return r; }
	elapsedSeconds operator + (long val) const          { elapsedSeconds r(*this); r.ms -= val*1000UL; return r; }
	elapsedSeconds operator + (unsigned long val) const { elapsedSeconds r(*this); r.ms -= val*1000UL; return r; }
};

elapsedSeconds secs, secs2(40);
extern volatile unsigned long timer0_millis;


void setup() {
  Serial.begin(115200);

  unsigned long zero = 0, biggest = -1, second = 1000;
  unsigned long rolloverSecond = biggest / 1000;
  unsigned long lastSecondMs = rolloverSecond*1000;
  Serial.println(biggest);
  Serial.println(rolloverSecond);
  Serial.println(lastSecondMs);
  Serial.println( zero - rolloverSecond );
  secs = 10 ; Serial.println(secs);
  secs += 10 ; Serial.println(secs);
  secs -= 5 ; Serial.println(secs);
  secs2; Serial.println(secs2);

  Serial.println();

  secs = -10;

  noInterrupts();
  timer0_millis  = zero - 10*second;
  interrupts();
}


void loop() {
  unsigned long now = millis();
  // put your main code here, to run repeatedly:
  static unsigned long lastSec = secs;
  if(secs != lastSec){
    lastSec = secs;
    Serial.print(now);
    Serial.print(" ");
    Serial.print(secs);
    Serial.print(" ");
    Serial.print(secs2);
    Serial.println();
  }
  if(secs == 30){
    secs = 100;
    secs2 = secs;
  }

}