|
@@ -26,6 +26,7 @@
|
|
|
#include "gds.h"
|
|
|
#include "gds_text.h"
|
|
|
#include "gds_draw.h"
|
|
|
+#include "gds_image.h"
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
@@ -59,6 +60,12 @@ struct grfg_packet {
|
|
|
u16_t width; // # of pixels of scrollable
|
|
|
};
|
|
|
|
|
|
+struct grfa_packet {
|
|
|
+ char opcode[4];
|
|
|
+ u32_t length;
|
|
|
+ u32_t offset;
|
|
|
+};
|
|
|
+
|
|
|
struct visu_packet {
|
|
|
char opcode[4];
|
|
|
u8_t which;
|
|
@@ -130,6 +137,11 @@ static struct scroller_s {
|
|
|
u32_t width;
|
|
|
} scroller;
|
|
|
|
|
|
+static struct {
|
|
|
+ u8_t *data;
|
|
|
+ u32_t size;
|
|
|
+} artwork;
|
|
|
+
|
|
|
#define MAX_BARS 32
|
|
|
static EXT_RAM_ATTR struct {
|
|
|
int bar_gap, bar_width, bar_border;
|
|
@@ -174,6 +186,7 @@ static void grfe_handler( u8_t *data, int len);
|
|
|
static void grfb_handler(u8_t *data, int len);
|
|
|
static void grfs_handler(u8_t *data, int len);
|
|
|
static void grfg_handler(u8_t *data, int len);
|
|
|
+static void grfa_handler(u8_t *data, int len);
|
|
|
static void visu_handler(u8_t *data, int len);
|
|
|
|
|
|
static void displayer_task(void* arg);
|
|
@@ -360,6 +373,8 @@ static bool handler(u8_t *data, int len){
|
|
|
grfs_handler(data, len);
|
|
|
} else if (!strncmp((char*) data, "grfg", 4)) {
|
|
|
grfg_handler(data, len);
|
|
|
+ } else if (!strncmp((char*) data, "grfa", 4)) {
|
|
|
+ grfa_handler(data, len);
|
|
|
} else if (!strncmp((char*) data, "visu", 4)) {
|
|
|
visu_handler(data, len);
|
|
|
} else {
|
|
@@ -636,6 +651,33 @@ static void grfg_handler(u8_t *data, int len) {
|
|
|
vTaskResume(displayer.task);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/****************************************************************************************
|
|
|
+ * Artwork
|
|
|
+ */
|
|
|
+static void grfa_handler(u8_t *data, int len) {
|
|
|
+ struct grfa_packet *pkt = (struct grfa_packet*) data;
|
|
|
+ int size = len - sizeof(struct grfa_packet);
|
|
|
+ int offset = htonl(pkt->offset);
|
|
|
+ int length = htonl(pkt->length);
|
|
|
+
|
|
|
+ LOG_INFO("gfra l:%u o:%u s:%u", length, offset, size);
|
|
|
+
|
|
|
+ // new grfa artwork, allocate memory
|
|
|
+ if (!offset) {
|
|
|
+ if (artwork.data) free(artwork.data);
|
|
|
+ artwork.data = malloc(length);
|
|
|
+ artwork.size = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // copy artwork data
|
|
|
+ memcpy(artwork.data + offset, data + sizeof(struct grfa_packet), size);
|
|
|
+ artwork.size += size;
|
|
|
+ if (artwork.size == length) {
|
|
|
+ GDS_DrawJPEG(display, artwork.data, 0, 32, GDS_IMAGE_CENTER);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/****************************************************************************************
|
|
|
* Update visualization bars
|
|
|
*/
|