#include <cstdint>
#include <iostream>
#include <limits>

using namespace std;

static uint32_t current_time = numeric_limits<uint32_t>::max() - 1000;

uint32_t millis() {
	return current_time;
}

void advance_time(uint32_t amount) {
	cout << "... time advances by " << amount << "ms ..." << endl;
	current_time += amount;
}

int main() {
	uint32_t curr_millis = millis();
	cout << "millis() = " << millis() << endl;

	uint32_t next_gps_update = millis() + 1000;
	cout << "next_gps_update = millis() + 1000 = " << next_gps_update << " (unsigned: " << uint32_t(next_gps_update) << ")" << endl;

	advance_time(1);

	cout << "millis() = " << millis() << endl;
	cout << "int32(millis() - next_gps_update) = " << int32_t(millis() - next_gps_update) << endl;
	cout << "int32(millis() - next_gps_update) >= 0 = " << (int32_t(millis() - next_gps_update) >= 0) << endl;

	advance_time(998);

	cout << "millis() = " << millis() << endl;
	cout << "int32(millis() - next_gps_update) = " << int32_t(millis() - next_gps_update) << endl;
	cout << "int32(millis() - next_gps_update) >= 0 = " << (int32_t(millis() - next_gps_update) >= 0) << endl;

	advance_time(10);

	cout << "millis() = " << millis() << endl;
	cout << "int32(millis() - next_gps_update) = " << int32_t(millis() - next_gps_update) << endl;
	cout << "int32(millis() - next_gps_update) >= 0 = " << (int32_t(millis() - next_gps_update) >= 0) << endl;

	next_gps_update = millis() + 1000;
	cout << "next_gps_update = millis() + 1000 = " << next_gps_update << " (unsigned: " << uint32_t(next_gps_update) << ")" << endl;
	
	advance_time(10);

	cout << "millis() = " << millis() << endl;
	cout << "int32(millis() - next_gps_update) = " << int32_t(millis() - next_gps_update) << endl;
	cout << "int32(millis() - next_gps_update) >= 0 = " << (int32_t(millis() - next_gps_update) >= 0) << endl;

	return 0;
}