#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_connected_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_connected_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_connected_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
+ default_frame_info_t *key_frame;
int idx;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
idx = ani_info->key_frame_cur;
key_frame = &ani_info->frames[idx];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
-
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= ani_info->frame_max)
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_connected_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_connected_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_pairing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_pairing_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_pairing_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
+ default_frame_info_t *key_frame;
int idx;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
}
idx = ani_info->key_frame_cur;
-
key_frame = &ani_info->frames[idx];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
ani_info->frame_idx++;
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_pairing_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_pairing_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
+
return e;
}
led_len = json_object_array_length(frame_data_obj);
ani_info->frames[frame_id - 1].num_led = led_len;
+ if (ani_info->max_leds < led_len) ani_info->max_leds = 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");
_ani_info_cleanup(ani_info);
}
+default_frame_info_t *
+backend_util_alloc_frame(default_ani_info *ani_info)
+{
+ default_frame_info_t *frame;
+
+ frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
+ ERROR_CHECK(frame, return NULL, "Failed to allocate memory for frame\n");
+
+ frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), ani_info->max_leds);
+ ERROR_CHECK(frame->leds, goto error, "Failed to allocate memory for led\n");
+
+ frame->num_led = ani_info->max_leds;
+
+ return frame;
+
+error:
+ free(frame);
+ return NULL;
+}
+
+void
+backend_util_cleanup_frame(default_frame_info_t *frame)
+{
+ ERROR_CHECK(frame, return, "Invalid frame to cleanup\n");
+
+ for (int i = 0; i < frame->num_led; i++)
+ {
+ frame->leds[i].color = 0x0;
+ }
+ frame->frame_duration = 0;
+}
+
+void
+backend_util_free_frame(default_frame_info_t *frame)
+{
+ if (!frame) return;
+
+ if (frame->leds) free(frame->leds);
+ free(frame);
+}
+
+
static pui_backend_module_data *
pui_default_backend_init(void)
{
unsigned int num_key_frames;
default_frame_info_t *frames;
int interval;
+ unsigned int max_leds;
pui_effect_func effect_func;
unsigned int repeat_cur;
unsigned int color;
};
+default_frame_info_t *backend_util_alloc_frame(default_ani_info *ani_info);
+void backend_util_cleanup_frame(default_frame_info_t *frame);
+void backend_util_free_frame(default_frame_info_t *frame);
+
void pui_default_backend_ani_listening_func_set(pui_backend_ani_func *func);
void pui_default_backend_ani_speaking_func_set(pui_backend_ani_func *func);
void pui_default_backend_ani_processing_func_set(pui_backend_ani_func *func);
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_alarm_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_alarm_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_alarm_get_frame(default_ani_info *ani_info)
{
/* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
#define ALARM_FRAME 18
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
idx = ani_info->key_frame_cur;
key_frame = &ani_info->frames[idx];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
-
if (ani_info->key_frame_cur < ALARM_FRAME)
{
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
}
else
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
}
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_alarm_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_alarm_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_emergency_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_emergency_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_emergency_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_emergency_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_emergency_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
+
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_error_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_error_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_error_get_frame(default_ani_info *ani_info)
{
/* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
#define BLINK_FRAME 2
- default_frame_info_t *frame, *key_frame;
-
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
+ default_frame_info_t *key_frame;
key_frame = &ani_info->frames[0];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
if (ani_info->frame_idx % BLINK_FRAME == 0)
{
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
}
else
{
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = 0x000000;
+ ani_frame->leds[i].color = 0x000000;
}
}
ani_info->frame_idx = 0;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_error_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_error_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_networkerror_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_networkerror_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_networkerror_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
+ default_frame_info_t *key_frame;
int idx;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
idx = ani_info->key_frame_cur;
key_frame = &ani_info->frames[idx];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
-
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
ani_info->frame_idx++;
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_networkerror_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_networkerror_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_normal_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_normal_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_normal_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= ani_info->frame_max)
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_normal_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_normal_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_easysetup_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_easysetup_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_easysetup_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= ani_info->frame_max)
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_easysetup_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_easysetup_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_micoff_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_micoff_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_micoff_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
-
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
+ default_frame_info_t *key_frame;
key_frame = &ani_info->frames[0];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
for (int i = 0; i < key_frame->num_led; i++)
{
- frame->leds[i].color = key_frame->leds[i].color;
+ ani_frame->leds[i].color = key_frame->leds[i].color;
}
if (ani_info->repeat >= 0)
ani_info->repeat_cur++;
- return frame;
+ return ani_frame;
}
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_micoff_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_micoff_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_swupdatedone_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_swupdatedone_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_swupdatedone_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_swupdatedone_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_swupdatedone_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_system_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_system_processing_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_system_processing_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
-
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
+ default_frame_info_t *key_frame;
key_frame = &ani_info->frames[0];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
for (int i = 0; i < key_frame->num_led; i++)
{
int idx = (i - ani_info->frame_idx + key_frame->num_led) % key_frame->num_led;
- frame->leds[idx] = key_frame->leds[i];
+ ani_frame->leds[idx] = key_frame->leds[i];
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= key_frame->num_led)
ani_info->frame_idx = 0;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_system_processing_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_system_processing_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_listening_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_listening_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_listening_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
+ default_frame_info_t *key_frame;
int division;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
key_frame = &ani_info->frames[0];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
- division = (int)(frame->num_led / 2);
+
+ division = (int)(key_frame->num_led / 2);
for (int i = 0; i < key_frame->num_led; i++)
{
int idx;
if (idx >= key_frame->num_led) continue;
}
}
- frame->leds[idx] = key_frame->leds[i];
+ ani_frame->leds[idx] = key_frame->leds[i];
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= key_frame->num_led)
ani_info->frame_idx = 0;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_listening_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_listening_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
+
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_processing_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_processing_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame;
-
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
+ default_frame_info_t *key_frame;
key_frame = &ani_info->frames[0];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
for (int i = 0; i < key_frame->num_led; i++)
{
int idx = (i - ani_info->frame_idx + key_frame->num_led) % key_frame->num_led;
- frame->leds[idx] = key_frame->leds[i];
+ ani_frame->leds[idx] = key_frame->leds[i];
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= key_frame->num_led)
ani_info->frame_idx = 0;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_processing_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_processing_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_speaking_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_speaking_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_speaking_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_speaking_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_speaking_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_streaming_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_streaming_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_streaming_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= ani_info->frame_max)
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_streaming_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_streaming_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
#include "../default_backend.h"
+static default_frame_info_t *ani_frame = NULL;
+
static void
_ani_backend_timeout_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
{
*b = (frame->leds[led_idx].color & LED_MASK_BLUE);
}
-static void
-_ani_backend_timeout_free_frame(default_frame_info_t *frame)
-{
- if (!frame) return;
-
- if (frame->leds) free(frame->leds);
- free(frame);
-}
-
static default_frame_info_t *
_ani_backend_timeout_get_frame(default_ani_info *ani_info)
{
- default_frame_info_t *frame, *key_frame, *key_frame2;
+ default_frame_info_t *key_frame, *key_frame2;
int idx, idx2;
unsigned int r, g, b, r2, g2, b2;
int r3, g3, b3;
double div;
- frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
- if (!frame) return NULL;
-
if (ani_info->frame_idx == 0)
{
ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
key_frame = &ani_info->frames[idx];
key_frame2 = &ani_info->frames[idx2];
- frame->num_led = key_frame->num_led;
- frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
- if (!frame->leds)
- {
- free(frame);
- return NULL;
- }
+
div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
r = g = b = r2 = g2 = b2 = 0x0;
for (int i = 0; i < key_frame->num_led; i++)
g3 = (int)(g2 - g) * div + g;
b3 = (int)(b2 - b) * div + b;
- frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+ ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
}
ani_info->frame_idx++;
if (ani_info->frame_idx >= ani_info->frame_max)
ani_info->repeat_cur++;
}
- return frame;
+ return ani_frame;
}
static pui_bool
buffer->ptr[4*i + 2] = g; /* GREEN */
buffer->ptr[4*i + 3] = r; /* RED */
}
- _ani_backend_timeout_free_frame(frame);
+ backend_util_cleanup_frame(frame);
e = pui_backend_ani_set_buffer(ani, buffer);
info->frame_idx = 0;
info->repeat_cur = 0;
+ if (!ani_frame)
+ ani_frame = backend_util_alloc_frame(info);
+ ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_timeout_frame_cb, info->interval / 1000.0);
if (!ret)
{
else
pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+ if (ani_frame)
+ {
+ backend_util_free_frame(ani_frame);
+ ani_frame = NULL;
+ }
return e;
}
func->ani_stop = _ani_timeout_stop;
}
-