*/
#include "default_backend.h"
+#include <limits.h>
pui_backend_ani_func *ani_func = NULL;
Eina_Hash *_animations_hash = NULL;
}
pui_error
-_ani_stop(pui_ani_t *ani)
+_ani_stop(pui_ani_t *ani, pui_bool force)
{
pui_int_error e = PUI_INT_ERROR_NONE;
pui_backend_ani_data *ani_data = NULL;
//TODO
(void) info;
- pui_info("... info->id: %s\n", info->id);
+ pui_info("... info->id: %s, force=%d\n", info->id, force);
pui_backend_ani_remove_frame_cb(ani);
- pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+ if (force)
+ pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+ else
+ pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
return e;
}
_read_json_file(const char *path, int *data_size)
{
FILE *fp = fopen(path, "rb");
- int size;
- char *buffer;
+ int size, ret;
+ char *buffer = NULL;
ERROR_CHECK(fp, return NULL, "Failed to open file: %s\n", path);
- fseek(fp, 0, SEEK_END);
- size = ftell(fp);
- fseek(fp, 0, SEEK_SET);
+ ret = fseek(fp, 0, SEEK_END);
+ ERROR_CHECK(ret == 0, goto error, "Failed to seek file. ret: %d\n", ret);
+ size = (long int)ftell(fp);
+ ERROR_CHECK(0 < size && size < INT_MAX, goto error, "Invalid file: %d size\n", size);
+ ret = fseek(fp, 0, SEEK_SET);
+ ERROR_CHECK(ret == 0, goto error, "Failed to seek file. ret: %d\n", ret);
buffer = (char *)calloc(sizeof(char), size + 1);
+ ERROR_CHECK(buffer, goto error, "Failed to allocate memory for buffer\n");
if (fread(buffer, size, 1, fp) < 1) {
- *data_size = 0;
- free(buffer);
- fclose(fp);
- return NULL;
+ goto error;
}
*data_size = size;
fclose(fp);
return buffer;
+
+error:
+ *data_size = 0;
+ if (buffer) free(buffer);
+ fclose(fp);
+ return NULL;
}
static default_ani_info *
int data_size = 0, i, j;
buffer = _read_json_file(path, &data_size);
- ERROR_CHECK(buffer && data_size > 0, return EINA_FALSE, "File %s has no data\n", path);
+ ERROR_CHECK(buffer && data_size > 0, goto error, "File %s has no data\n", path);
root_obj = json_tokener_parse(buffer);
ERROR_CHECK(root_obj, goto error, "Failed to tokenize json object\n");
ani_info->num_key_frames = frame_len;
ani_info->frames = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), frame_len);
ERROR_CHECK(ani_info->frames, goto error, "Failed to alloc for default_frame_info_t\n");
-
+
for (i = 0; i < frame_len; i++) {
frame_obj = json_object_array_get_idx(data_obj, i);
//printf("\tframe id: %d\n", json_object_get_int(frame_data_obj));
frame_id = json_object_get_int(frame_data_obj);
+ frame_data_obj = json_object_object_get(frame_obj, "frame_duration");
+ if (frame_data_obj)
+ ani_info->frames[frame_id - 1].frame_duration = json_object_get_int(frame_data_obj);
+ else
+ ani_info->frames[frame_id - 1].frame_duration = ani_info->interval;
+
frame_data_obj = json_object_object_get(frame_obj, "led");
led_len = json_object_array_length(frame_data_obj);
-
+
ani_info->frames[frame_id - 1].num_led = led_len;
ani_info->frames[frame_id - 1].leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), led_len);
ERROR_CHECK(ani_info->frames[frame_id - 1].leds, goto error, "Failed to alloc for default_led_info_t\n");
-
+
for (j = 0; j < led_len; j++) {
led_obj = json_object_array_get_idx(frame_data_obj, j);
return ani_info;
error:
- free(buffer);
+ if (buffer) free(buffer);
if (ani_info) {
if (ani_info->frames) {
for (i = 0; i < ani_info->num_key_frames; i++) {
return NULL;
}
-static int
-_scandir_filter(const struct dirent *dirent)
+int
+_find_directory(const char *path, Eina_List **json_list)
{
- if (!strncmp(dirent->d_name, ".", sizeof(".")) ||
- !strncmp(dirent->d_name, "..", sizeof("..")))
- return 0;
- if (!strstr(dirent->d_name, ".json"))
- return 0;
+ DIR *dir;
+ struct dirent *cur;
+ int count = 0, ret_cnt = 0;
- return 1;
+ dir = opendir(path);
+ if (!dir)
+ {
+ pui_err("Failed to open %s.\n", path);
+ return count;
+ }
+
+ while ((cur = readdir(dir)) != NULL)
+ {
+ char next_path[MAX_STR] = {0, };
+ if (cur->d_type == DT_DIR)
+ {
+ if (!strncmp(cur->d_name, ".", sizeof(".")) ||
+ !strncmp(cur->d_name, "..", sizeof("..")))
+ continue;
+
+ snprintf(next_path, MAX_STR, "%s/%s", path, cur->d_name);
+ ret_cnt = _find_directory(next_path, json_list);
+ count += ret_cnt;
+ }
+ else
+ {
+ if (strstr(cur->d_name, ".json"))
+ {
+ snprintf(next_path, MAX_STR, "%s/%s", path, cur->d_name);
+ *json_list = eina_list_append(*json_list, eina_stringshare_add(next_path));
+ count++;
+ }
+ }
+ }
+ closedir(dir);
+
+ return count;
}
{
pui_int_error e = PUI_INT_ERROR_NONE;
default_ani_info *ani_info;
- struct dirent **files;
- int count, i;
- char file_path[MAX_STR] = {0, };
+ Eina_List *json_list = NULL;
+ Eina_List *l, *l_next;
+ Eina_Stringshare *path;
// load and store all of animation data
- if ((count = scandir(ANI_COLLECTION_DIR, &files, _scandir_filter, alphasort)) == -1) {
- printf("Failed to get %s directory (%s)\n", ANI_COLLECTION_DIR, strerror(errno));
- e = PUI_INT_ERROR_INVALID_RESOURCES;
- return e;
- }
-
- for (i = 0; i < count; i++) {
- snprintf(file_path, sizeof(file_path), "%s%s", ANI_COLLECTION_DIR, files[i]->d_name);
+ _find_directory(ANI_COLLECTION_DIR, &json_list);
- ani_info = _read_json(file_path);
+ EINA_LIST_FOREACH_SAFE(json_list, l, l_next, path)
+ {
+ ani_info = _read_json(path);
if (ani_info) {
eina_hash_add(_animations_hash, ani_info->id, ani_info);
- printf("Success to load %s animation\n", files[i]->d_name);
+ pui_info("Success to load %s animation (id: %s)\n", path, ani_info->id);
}
+ eina_stringshare_del(path);
+ json_list = eina_list_remove_list(json_list, l);
}
- for (i = 0; i < count; i++) {
- free(files[i]);
- }
- free(files);
-
//TODO
return e;
}
+pui_bool
+_geometry_get(int *width, int *height)
+{
+ if (!width || !height)
+ return 0;
+
+ if (width)
+ *width = DEFAULT_BACKEND_GEOM_WIDTH;
+ if (height)
+ *height = DEFAULT_BACKEND_GEOM_HEIGHT;
+
+ return 1;
+}
+
pui_int_error
_is_ani_supported(pui_id id)
{
/* get animation info associate with the given id from animation collection */
ani_info = get_ani_info_from_ani_collection(id);
-
+
if (!ani_info)
{
pui_err("Failed to get ani info from animation collection !\n");
/* allocate backend ani_data and return it to pui ani core */
ani_data = (pui_backend_ani_data *)calloc(1, sizeof(pui_backend_ani_data));
-
+
if (!ani_data)
{
pui_err("Failed to allocate memory for pui backend ani data !\n");
}
/* Assign each function pointer that corresponds to the given id if needed. */
- if (!strncmp(ani_info->id, "processing", sizeof("processing")))
+ if (!strncmp(ani_info->id, "system/easy_setup", sizeof("system/easy_setup")))
{
- pui_default_backend_ani_processing_func_set(ani_func);
+ pui_default_backend_ani_easysetup_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "listening", sizeof("listening")))
+ else if (!strncmp(ani_info->id, "system/processing", sizeof("system/processing")))
{
- pui_default_backend_ani_listening_func_set(ani_func);
+ pui_default_backend_ani_system_processing_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "speaking", sizeof("speaking")))
+ else if (!strncmp(ani_info->id, "system/sw_update_done", sizeof("system/sw_update_done")))
{
- pui_default_backend_ani_speaking_func_set(ani_func);
+ pui_default_backend_ani_swupdatedone_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "system/mic_off", sizeof("system/mic_off")))
+ {
+ pui_default_backend_ani_micoff_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "streaming", sizeof("streaming")))
+ else if (!strncmp(ani_info->id, "voice/listening", sizeof("voice/listening")))
+ {
+ pui_default_backend_ani_listening_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "voice/streaming", sizeof("voice/streaming")))
{
pui_default_backend_ani_streaming_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "time_out", sizeof("time_out")))
+ else if (!strncmp(ani_info->id, "voice/processing", sizeof("voice/processing")))
+ {
+ pui_default_backend_ani_processing_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "voice/speaking", sizeof("voice/speaking")))
+ {
+ pui_default_backend_ani_speaking_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "voice/timeout", sizeof("voice/timeout")))
{
pui_default_backend_ani_timeout_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "normal", sizeof("normal")))
+ else if (!strncmp(ani_info->id, "notification/normal", sizeof("notification/normal")))
{
pui_default_backend_ani_normal_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "emergency", sizeof("emergency")))
+ else if (!strncmp(ani_info->id, "notification/emergency", sizeof("notification/emergency")))
{
pui_default_backend_ani_emergency_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "easy_setup", sizeof("easy_setup")))
+ else if (!strncmp(ani_info->id, "notification/network_error", sizeof("notification/network_error")))
{
- pui_default_backend_ani_easysetup_func_set(ani_func);
+ pui_default_backend_ani_networkerror_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "sw_update_done", sizeof("sw_update_done")))
+ else if (!strncmp(ani_info->id, "notification/error", sizeof("notification/error")))
{
- pui_default_backend_ani_swupdatedone_func_set(ani_func);
+ pui_default_backend_ani_error_func_set(ani_func);
}
- else if (!strncmp(ani_info->id, "mic_off", sizeof("mic_off")))
+ else if (!strncmp(ani_info->id, "notification/alarm", sizeof("notification/alarm")))
{
- pui_default_backend_ani_micoff_func_set(ani_func);
+ pui_default_backend_ani_alarm_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "bt/pairing", sizeof("bt/pairing")))
+ {
+ pui_default_backend_ani_pairing_func_set(ani_func);
+ }
+ else if (!strncmp(ani_info->id, "bt/connected", sizeof("bt/connected")))
+ {
+ pui_default_backend_ani_connected_func_set(ani_func);
}
else
{
ani_func->ani_start = _ani_start;
ani_func->ani_stop = _ani_stop;
}
-
+
ani_data->ani_func = ani_func;
ani_data->ani_info = (pui_backend_ani_info *)ani_info;
}
backend_data->create_ani_collection = _create_ani_collection;
+ backend_data->geometry_get = _geometry_get;
backend_data->ani_create = _ani_create;
backend_data->ani_destroy = _ani_destroy;
}
backend_data->create_ani_collection = NULL;
+ backend_data->geometry_get = NULL;
backend_data->ani_create = NULL;
backend_data->ani_destroy = NULL;