-2

I just started making pebble watch faces and I want to make a count down timer, that can count how many hours are left in the day and then restarts at 12 am everyday.

the problem is I can not figure out a way to get the math right to display: the current time minus 24 hours and then show it on the watch (including the hours and mins like H:M).

// Time functions
static void update_time() {
  // Get a tm structure
  time_t temp = time(NULL); 
  struct tm *tick_time = localtime(&temp);
double munistime;
  // Create a long-lived buffer
  static char buffer[] = "00:00:00";

  // Write the current hours and minutes into the buffer
  if(clock_is_24h_style() == true) {
    // Use 24 hour format
    strftime(buffer, sizeof("00:00:00"), "%H:%M:%S", tick_time);
    munistime = 24.0 - 19.0;

  } else {
    // Use 12 hour format
    strftime(buffer, sizeof("00:00:00"), "%I:%M:%S", tick_time);
  }

  // Display this time on the TextLayer
  text_layer_set_text(s_time_layer, buffer);
}

static void tick_handler(struct tm *tick_time, TimeUnits units_changed) {
 update_time();
}
// Set the count from the start of the day
Static void update_countdown () {


}

    // Window Functions
    static void main_window_load(Window *window) {
   // Create time TextLayer
  s_time_layer = text_layer_create(GRect(0, 130, 150,50));
  text_layer_set_background_color(s_time_layer, GColorClear);
  text_layer_set_text_color(s_time_layer, GColorBlack);
  text_layer_set_text(s_time_layer, "00:00:00");
  // Improve the layout to be more like a watchface
  text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_BITHAM_30_BLACK));
  text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter);


  // Creates A count Timer Layer
  s_countdown_layer = text_layer_create(GRect(0, 40, 150, 50));
  text_layer_set_background_color(s_countdown_layer, GColorBlack);
  text_layer_set_text_color(s_countdown_layer, GColorWhite);
  text_layer_set_text(s_countdown_layer, "00:00:00");
  text_layer_set_text_alignment(s_countdown_layer, GTextAlignmentCenter);
  text_layer_set_font(s_countdown_layer,fonts_get_system_font(FONT_KEY_GOTHIC_28));


  // Add it as a child layer to the Window's root layer
  layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer));
  layer_add_child(window_get_root_layer(window),text_layer_get_layer(s_countdown_layer));
   update_time();
}
Josh Martin
  • 311
  • 3
  • 18

2 Answers2

0

I would get the tick_time in 3 variables - for hours, minutes and seconds. Compute the new values for them and then save them in the buffer for displaying.

aniri
  • 1,831
  • 1
  • 18
  • 28
0

It's not bad if you just convert the time to seconds, and subtract from 24 hours:

time_t temp = time(NULL);
struct tm *tick_time = localtime(&temp);
static char buffer[] = "00:00:00";

// 86400 = 24 hours * 60 minutes * 60 seconds
// this gets the total number of seconds remaining before midnight
int secsUntilMidnight = 86400 - (tick_time->tm_hour * 3600 + tick_time->tm_min * 60 + tick_time->tm_sec);

Then, split the values out again:

int hr = secsUntilMidnight / 3600;
int mn = (secsUntilMidnight - (hr*3600)) / 60;
int sc = (secsUntilMidnight - (hr*3600)) - (mn*60);

sprintf (buffer, "%02d:%02d:%02d", hr, mn, sc);

You could make it more efficient by setting secsUntilMidnight once a day and then just subtract 1 second in your tickHandler, and you could make the math of splitting the values out more efficient as well.

Dale
  • 534
  • 4
  • 13