Browse code

Use the text layer for modal messages and make room for a status display

Natasha Kerensikova authored on19/03/2016 22:46:08
Showing1 changed files
... ...
@@ -7,39 +7,48 @@
7 7
 #define MSG_KEY_DATA_LINE	220
8 8
 
9 9
 static Window *window;
10
-static TextLayer *text_layer;
11
-static char buffer[256];
10
+static TextLayer *modal_text_layer;
11
+static char modal_text[256];
12 12
 static HealthMinuteData minute_data[1440];
13 13
 static uint16_t minute_data_size = 0;
14 14
 static uint16_t minute_index = 0;
15 15
 static time_t minute_first = 0, minute_last = 0;
16 16
 static unsigned sent = 0;
17
+static bool modal_displayed = false;
17 18
 static char global_buffer[1024];
18 19
 
20
+static void
21
+set_modal_mode(bool is_modal) {
22
+	if (is_modal == modal_displayed) return;
23
+	layer_set_hidden(text_layer_get_layer(modal_text_layer), is_modal);
24
+}
25
+
19 26
 static void
20 27
 window_load(Window *window) {
21 28
 	Layer *window_layer = window_get_root_layer(window);
22 29
 	GRect bounds = layer_get_bounds(window_layer);
23 30
 
24
-	text_layer = text_layer_create((GRect) { .origin = { 0, bounds.size.h / 3 }, .size = { bounds.size.w, bounds.size.h / 3 } });
25
-	text_layer_set_text(text_layer, buffer);
26
-	text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);
27
-	text_layer_set_font(text_layer,
31
+	modal_text_layer = text_layer_create(GRect(0, bounds.size.h / 3,
32
+	    bounds.size.w, bounds.size.h / 3));
33
+	text_layer_set_text(modal_text_layer, modal_text);
34
+	text_layer_set_text_alignment(modal_text_layer, GTextAlignmentCenter);
35
+	text_layer_set_font(modal_text_layer,
28 36
 	    fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
29
-	layer_add_child(window_layer, text_layer_get_layer(text_layer));
37
+	layer_add_child(window_layer, text_layer_get_layer(modal_text_layer));
38
+
39
+	set_modal_mode(true);
30 40
 }
31 41
 
32 42
 static void
33 43
 window_unload(Window *window) {
34
-	text_layer_destroy(text_layer);
44
+	text_layer_destroy(modal_text_layer);
35 45
 }
36 46
 
37 47
 static void
38 48
 set_modal_message(const char *msg) {
39
-	GRect content_size;
40
-	strncpy(buffer, msg, sizeof buffer);
41
-	buffer[sizeof buffer - 1] = 0;
42
-	layer_mark_dirty(text_layer_get_layer(text_layer));
49
+	strncpy(modal_text, msg, sizeof modal_text);
50
+	modal_text[sizeof modal_text - 1] = 0;
51
+	layer_mark_dirty(text_layer_get_layer(modal_text_layer));
43 52
 }
44 53
 
45 54
 /* minute_data_image - fill a buffer with CSV data without line terminator */
... ...
@@ -181,47 +190,6 @@ send_next_line(void) {
181 190
 	minute_index += 1;
182 191
 }
183 192
 
184
-static int16_t
185
-get_next_minute_index(time_t previous_t) {
186
-	time_t t = previous_t ? previous_t + 60 - (previous_t % 60) : 0;
187
-	int16_t index = 0;
188
-
189
-	if (t < minute_first || t >= minute_last) {
190
-		uint32_t u;
191
-		minute_first = t;
192
-		minute_last = time(0);
193
-		u = health_service_get_minute_history(minute_data,
194
-		    ARRAY_LENGTH(minute_data),
195
-		    &minute_first, &minute_last);
196
-
197
-		if (!u) {
198
-			APP_LOG(APP_LOG_LEVEL_ERROR,
199
-			    "health_service_get_minute_history returned 0");
200
-			minute_first = minute_last = 0;
201
-			return -1;
202
-		}
203
-
204
-		if (t >= minute_last) {
205
-			APP_LOG(APP_LOG_LEVEL_ERROR,
206
-			    "Unexpected minute_last %" PRIi32
207
-			    " when t is %" PRIi32,
208
-			    minute_last, t);
209
-			return -1;
210
-		}
211
-	} else {
212
-		index = (t - minute_first) / 60;
213
-	}
214
-
215
-	while (minute_data[index].is_invalid) {
216
-		index += 1;
217
-		t = minute_first + 60 * index;
218
-		if (t >= minute_last)
219
-			return get_next_minute_index(t);
220
-	}
221
-
222
-	return index;
223
-}
224
-
225 193
 static void
226 194
 handle_last_sent(Tuple *tuple) {
227 195
 	uint32_t ikey = 0;
... ...
@@ -238,12 +206,10 @@ handle_last_sent(Tuple *tuple) {
238 206
 	}
239 207
 	APP_LOG(APP_LOG_LEVEL_INFO, "received LAST_SENT %" PRIu32, ikey);
240 208
 
241
-	int16_t index = get_next_minute_index(ikey * 60);
242
-	if (index < 0) return;
243
-
244
-	APP_LOG(APP_LOG_LEVEL_INFO,
245
-	    "got index %" PRIi16 ", sending time %" PRIi32,
246
-	    index, minute_first + index * 60);
209
+	minute_index = 0;
210
+	minute_data_size = 0;
211
+	minute_last = ikey * 60;
212
+	set_modal_mode(false);
247 213
 
248 214
 	if (load_minute_data_page(ikey * 60))
249 215
 		send_next_line();
... ...
@@ -264,28 +230,12 @@ inbox_received_handler(DictionaryIterator *iterator, void *context) {
264 230
 			    "Unexpected type %d for MSG_KEY_MODAL_MESSAGE",
265 231
 			    (int)tuple->type);
266 232
 		} else {
233
+			set_modal_mode(true);
267 234
 			set_modal_message(tuple->value->cstring);
268 235
 		}
269 236
 	}
270 237
 }
271 238
 
272
-static time_t
273
-get_first_health_minute(void) {
274
-	time_t start = 0, end = time(0);
275
-	uint32_t ret;
276
-
277
-	ret = health_service_get_minute_history(minute_data, 1, &start, &end);
278
-	return ret ? start : 0;
279
-}
280
-
281
-static void
282
-init_text(void) {
283
-	time_t t = get_first_health_minute();
284
-	struct tm *tm = localtime(&t);
285
-	strftime(buffer, sizeof buffer, "First health minute: %FT%T%z", tm);
286
-	minute_first = t;
287
-}
288
-
289 239
 static void
290 240
 outbox_sent_handler(DictionaryIterator *iterator, void *context) {
291 241
 	(void)iterator;
... ...
@@ -308,7 +258,7 @@ init(void) {
308 258
 	app_message_register_outbox_sent(outbox_sent_handler);
309 259
 	app_message_open(256, 2048);
310 260
 
311
-	init_text();
261
+	strncpy(modal_text, "Waiting for JS part", sizeof modal_text);
312 262
 	window = window_create();
313 263
 	window_set_window_handlers(window, (WindowHandlers) {
314 264
 	    .load = window_load,