2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "lap_counter/lap_counter.h"
24 #include "cloud/cloud_communication.h"
25 #include "resource/resource_led.h"
27 #define MIN_LAP_TIME 5
28 #define MAX_NAME_LENGTH 256
30 #define CONFIG_LED_STATE_KEY_LAP "lap"
31 #define CONFIG_DEFAULT_LED_3BIT_LAP 0, 1, 0
32 #define CONFIG_DEFAULT_LED_24BIT_LAP 0, 255, 0
34 #define CONFIG_LED_STATE_KEY_FIRST_LAP "first.lap"
35 #define CONFIG_DEFAULT_LED_3BIT_FIRST_LAP 0, 0, 1
36 #define CONFIG_DEFAULT_LED_24BIT_FIRST_LAP 0, 0, 255
38 typedef struct lap_counter_data {
40 struct timespec last_timestamp;
43 static lap_counter_data_t s_info = {0, };
45 void lap_counter_init()
47 char buf[MAX_NAME_LENGTH];
48 snprintf(buf, MAX_NAME_LENGTH, "Default: %s %s", __DATE__, __TIME__); //
50 s_info.user_name = strdup(buf);
53 void lap_counter_set_user_name(const char *user_name)
55 retm_if(!user_name, "New user name is NULL");
57 free((void*)s_info.user_name);
58 s_info.user_name = strdup(user_name);
60 _D("User name set to %s", s_info.user_name);
63 const char *lap_counter_get_user_name(void)
65 return s_info.user_name;
68 void _print_time(const char *title, struct timespec *ts)
71 struct tm *_tm = localtime(&(ts->tv_sec));
72 strftime(&buf[0], PATH_MAX, "%H:%M:%S", _tm);
74 snprintf(&buf[strlen(buf)], PATH_MAX, ".%03ld", ts->tv_nsec / (long)1e6);
76 _D ("%s %s", title, buf);
79 static inline struct timespec _calculate_lap_time(struct timespec *prev, struct timespec *now)
83 lap.tv_sec = now->tv_sec - prev->tv_sec;
84 lap.tv_nsec = now->tv_nsec - prev->tv_nsec;
87 _D("----------------------------------------------");
88 _print_time("PREV:\t", prev);
89 _print_time("NOW:\t", now);
91 if (lap.tv_sec < MIN_LAP_TIME) {
99 _print_time("LAP:\t", &lap);
101 if (lap.tv_nsec < 0) {
103 lap.tv_nsec = 1e9 + lap.tv_nsec;
105 _print_time("LAP_MOD:\t", &lap);
107 _D("----------------------------------------------");
109 cloud_communication_post_lap(lap.tv_sec * 1e3 + lap.tv_nsec / 1e6, s_info.user_name);
110 resource_led_blink_rgb_colors(CONFIG_LED_STATE_KEY_LAP,
111 CONFIG_DEFAULT_LED_3BIT_LAP,
112 CONFIG_DEFAULT_LED_24BIT_LAP,
119 void lap_counter_get_lap_time()
121 struct timespec timestamp;
122 int ret = clock_gettime(CLOCK_MONOTONIC, ×tamp);
123 ret_error_message(ret != 0, ret);
125 if (s_info.last_timestamp.tv_nsec != 0 || s_info.last_timestamp.tv_sec != 0) {
126 _calculate_lap_time(&s_info.last_timestamp, ×tamp);
130 resource_led_blink_rgb_colors(CONFIG_LED_STATE_KEY_FIRST_LAP,
131 CONFIG_DEFAULT_LED_3BIT_FIRST_LAP,
132 CONFIG_DEFAULT_LED_24BIT_FIRST_LAP,
137 s_info.last_timestamp.tv_sec = timestamp.tv_sec;
138 s_info.last_timestamp.tv_nsec = timestamp.tv_nsec;
141 void lap_counter_set_start_lap()
143 s_info.last_timestamp.tv_nsec = 0;
144 s_info.last_timestamp.tv_sec = 0;
147 void lap_counter_shutdown()
149 free(s_info.user_name);