summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/display.cc38
-rw-r--r--src/display.h8
-rw-r--r--src/main.cc17
-rw-r--r--src/system.cc6
4 files changed, 43 insertions, 26 deletions
diff --git a/src/display.cc b/src/display.cc
index b0bc636..2059c9b 100644
--- a/src/display.cc
+++ b/src/display.cc
@@ -11,16 +11,8 @@ Display display;
Display::Display()
{
- disp_buf[0] = 0xff;
- disp_buf[1] = 0xfb;
- disp_buf[2] = 0xdd;
- disp_buf[3] = 0xfd;
- disp_buf[4] = 0xdd;
- disp_buf[5] = 0xfb;
- disp_buf[6] = 0xff;
- disp_buf[7] = 0xff;
char_pos = -1;
- scroll_delay = 400;
+ update_delay = 400;
}
void Display::disable()
@@ -45,8 +37,6 @@ void Display::enable()
void Display::multiplex()
{
static uint16_t scroll;
- uint8_t i, glyph_len;
- uint8_t *glyph_addr;
/*
* To avoid flickering, do not put any code (or expensive index
@@ -59,8 +49,17 @@ void Display::multiplex()
if (++active_col == 8)
active_col = 0;
- if (++scroll == scroll_delay) {
+ if (++scroll == update_delay) {
scroll = 0;
+ need_update = 1;
+ }
+}
+
+void Display::update() {
+ uint8_t i, glyph_len;
+ uint8_t *glyph_addr;
+ if (need_update) {
+ need_update = 0;
for (i = 0; i < 7; i++) {
disp_buf[i] = disp_buf[i+1];
@@ -89,12 +88,25 @@ void Display::multiplex()
void Display::reset()
{
- for (int i = 0; i < 8; i++)
+ for (uint8_t i = 0; i < 8; i++)
disp_buf[i] = 0xff;
str_pos = 0;
char_pos = -1;
}
+void Display::setString(const char *new_str)
+{
+ setString((char *)new_str);
+}
+
+void Display::setString(char *new_str)
+{
+ reset();
+ for (uint8_t i = 0; new_str[i] != 0; i++) {
+ string[i] = new_str[i];
+ }
+}
+
/*
* Draws a single display column. This function should be called at least once
* per millisecond.
diff --git a/src/display.h b/src/display.h
index 666648a..f48d1c3 100644
--- a/src/display.h
+++ b/src/display.h
@@ -6,18 +6,22 @@
class Display {
private:
- uint16_t scroll_delay;
+ uint16_t update_delay;
+ uint8_t need_update;
uint8_t active_col;
uint8_t disp_buf[8];
uint8_t str_pos;
int8_t char_pos;
+ char string[128];
public:
Display();
void enable(void);
void disable(void);
void multiplex(void);
void reset(void);
- char string[128];
+ void update(void);
+ void setString(const char *str);
+ void setString(char *str);
};
extern Display display;
diff --git a/src/main.cc b/src/main.cc
index 9558109..4398d02 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -20,13 +20,7 @@ int main (void)
// Enable pull-ups on PC3 and PC7 (button pins)
PORTC |= _BV(PC3) | _BV(PC7);
- display.string[0] = 'O';
- display.string[1] = 'h';
- display.string[2] = 'a';
- display.string[3] = 'i';
- display.string[4] = '!';
- display.string[5] = ' ';
- display.string[6] = 0;
+ display.setString("Ohai! ");
display.enable();
modem.enable();
@@ -37,9 +31,14 @@ int main (void)
// nothing to do here, go to idle to save power
SMCR = _BV(SE);
asm("sleep");
- // The display timer causes a wakeup after 256µs. Run the system
- // loop after the timer's ISR is done.
+ /*
+ * The display timer causes a wakeup after 256µs. Run the system
+ * loop after the timer's ISR is done.
+ * The Modem also causes wakeups, which is pretty convenient since
+ * it means we can immediately process the received data.
+ */
rocket.loop();
+ display.update();
}
return 0;
diff --git a/src/system.cc b/src/system.cc
index 6c44a30..5c7b177 100644
--- a/src/system.cc
+++ b/src/system.cc
@@ -12,6 +12,8 @@
System rocket;
+char disp_buf[128];
+
void System::loop()
{
static uint8_t i = 0;
@@ -70,12 +72,12 @@ void System::loop()
while (modem.buffer_available()) {
modem_char = modem.buffer_get();
- display.string[i++] = modem_char;
+ disp_buf[i++] = modem_char;
if (i == 127) {
i = 0;
} else if (modem_char == 0) {
i = 0;
- display.reset();
+ display.setString(disp_buf);
}
}
}