summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2016-03-12 22:07:12 +0100
committerDaniel Friesel <derf@finalrewind.org>2016-03-12 22:07:12 +0100
commit0ee7d763090e32118829fb897ff8ad4261c3c27e (patch)
tree4b1c4084adb70f10dd99b45a243b3ce467b834a6
parent31d40607ceaae5dcb78f41fcfe7dbd777f75d485 (diff)
>255byte pattern support, commit 2/2
-rw-r--r--src/display.cc16
-rw-r--r--src/display.h3
-rw-r--r--src/storage.cc9
-rw-r--r--src/storage.h2
-rw-r--r--src/system.cc5
5 files changed, 22 insertions, 13 deletions
diff --git a/src/display.cc b/src/display.cc
index ed1880e..025ebbf 100644
--- a/src/display.cc
+++ b/src/display.cc
@@ -15,6 +15,7 @@
#include "display.h"
#include "font.h"
+#include "storage.h"
Display display;
@@ -84,7 +85,7 @@ void Display::update() {
if (current_anim->direction == 0)
glyph_addr = (uint8_t *)pgm_read_ptr(&font[current_anim->data[str_pos]]);
else
- glyph_addr = (uint8_t *)pgm_read_ptr(&font[current_anim->data[current_anim->length - 1 - str_pos]]);
+ glyph_addr = (uint8_t *)pgm_read_ptr(&font[current_anim->data[current_anim->length - 1 - str_pos]]); // XXX Broken by str_chunk changes, FIXME!
glyph_len = pgm_read_byte(&glyph_addr[0]);
char_pos++;
@@ -113,11 +114,21 @@ void Display::update() {
}
str_pos += 8;
}
- if (str_pos >= current_anim->length) {
+ if ((current_anim->length >= 128) && (str_pos >= 128)) {
+ str_pos = 0;
+ str_chunk++;
+ storage.loadChunk(str_chunk, current_anim->data);
+ }
+ if ((str_chunk == (current_anim->length / 128))
+ && (str_pos >= (current_anim->length % 128))) {
+ str_chunk = 0;
str_pos = 0;
if (current_anim->delay > 0) {
status = PAUSED;
}
+ if (current_anim->length >= 128) {
+ storage.loadChunk(str_chunk, current_anim->data);
+ }
}
} else if (status == PAUSED) {
str_pos++;
@@ -134,6 +145,7 @@ void Display::reset()
for (uint8_t i = 0; i < 8; i++)
disp_buf[i] = 0xff;
str_pos = 0;
+ str_chunk = 0;
char_pos = -1;
need_update = 1;
status = RUNNING;
diff --git a/src/display.h b/src/display.h
index 41b3c83..b42c69e 100644
--- a/src/display.h
+++ b/src/display.h
@@ -34,7 +34,7 @@ struct animation {
/**
* Length of data in bytes
*/
- uint8_t length;
+ uint16_t length;
/**
* * If type == AnimationType::TEXT: Text scroll speed in columns per TODO
@@ -75,6 +75,7 @@ class Display {
uint8_t active_col;
uint8_t disp_buf[8];
uint8_t str_pos;
+ uint8_t str_chunk;
int8_t char_pos;
enum AnimationStatus : uint8_t {
diff --git a/src/storage.cc b/src/storage.cc
index e965589..7cf404b 100644
--- a/src/storage.cc
+++ b/src/storage.cc
@@ -268,13 +268,8 @@ void Storage::load(uint8_t idx, uint8_t *data)
header[0] = data[0];
header[1] = data[1];
- if (header[0] & 0x0f) {
- // read whole byte block
- i2c_read(1 + (page_offset / 8), (page_offset % 8) * 32 + 4, 128, data + 4);
- i2c_read(1 + (page_offset / 8), (page_offset % 8) * 32 + 4 + 128, 128, data + 4 + 128);
- } else {
- i2c_read(1 + (page_offset / 8), (page_offset % 8) * 32 + 4, header[1], data + 4);
- }
+ // always read 128 bytes - the system will ignore trailing bytes
+ i2c_read(1 + (page_offset / 8), (page_offset % 8) * 32 + 4, 128, data + 4);
}
void Storage::loadChunk(uint8_t chunk, uint8_t *data)
diff --git a/src/storage.h b/src/storage.h
index e7feedb..c72b766 100644
--- a/src/storage.h
+++ b/src/storage.h
@@ -80,7 +80,7 @@ class Storage {
*
* @param idx pattern index (starting with 0)
* @param data pointer to data structure for the pattern. Must be
- * at least 260 bytes
+ * at least 132 bytes
*/
void load(uint8_t idx, uint8_t *data);
diff --git a/src/system.cc b/src/system.cc
index 759c58e..37e9ea5 100644
--- a/src/system.cc
+++ b/src/system.cc
@@ -27,7 +27,7 @@ System rocket;
animation_t active_anim;
-uint8_t disp_buf[260]; // 4 byte header + 256 byte data
+uint8_t disp_buf[132]; // 4 byte header + 128 byte data
uint8_t *rx_buf = disp_buf + sizeof(disp_buf) - 33;
void System::initialize()
@@ -78,7 +78,8 @@ void System::loadPattern_P(const uint8_t *pattern_ptr)
void System::loadPattern_buf(uint8_t *pattern)
{
active_anim.type = (AnimationType)(pattern[0] >> 4);
- active_anim.length = pattern[1];
+ active_anim.length = (pattern[0] & 0x0f) << 8;
+ active_anim.length += pattern[1];
if (active_anim.type == AnimationType::TEXT) {
active_anim.speed = (pattern[2] & 0xf0) + 15;