#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;
}