summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Pritz <bluewind@xinu.at>2013-04-13 16:30:44 +0200
committerFlorian Pritz <bluewind@xinu.at>2013-04-13 16:30:44 +0200
commit3592bd18dd45171387460a8c7ac94508559b9582 (patch)
treebdd1a103f102111550f722dd6f7a2e9719e65a99
parentbc0dd803e84498406bfbf7d2f8e852ea59222990 (diff)
downloadmpd-box-master.tar.gz
mpd-box-master.tar.xz
Make display size configurable and properly buffer inputHEADmaster
Signed-off-by: Florian Pritz <bluewind@xinu.at>
-rw-r--r--src/main.cpp47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp
index f246e3a..8c67729 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,8 +5,18 @@
void setup();
void loop();
-#define BUFFER_SIZE 64
+// buffer size must be > LCD_CHARS
+#define BUFFER_SIZE 80
+char display_data[BUFFER_SIZE];
char buf[BUFFER_SIZE];
+int buffered = 0;
+
+#define LCD_ROWS 2
+#define LCD_COLS 16
+#define LCD_CHARS (LCD_COLS * LCD_ROWS)
+#if LCD_CHARS > BUFFER_SIZE
+#error "BUFFER too small"
+#endif
// initialize the library with the numbers of the interface pins
#ifdef ENERGIA
@@ -28,7 +38,7 @@ Bounce bounce_buttons[NUMBUTTONS];
void setup() {
byte i;
- lcd.begin(16, 2);
+ lcd.begin(LCD_COLS, LCD_ROWS);
// The usb chip hangs if it tries to send data and no-one listens
// so we give the client time to start up first
@@ -54,7 +64,8 @@ void setup() {
}
Serial.println("ready");
- lcd.print("Serial ready");
+ memset(display_data, ' ', BUFFER_SIZE);
+ strcpy(display_data, "Waiting for data");
}
bool button_just_pressed(int i) {
@@ -75,16 +86,28 @@ void loop() {
Serial.println("next");
}
- // output what we got over serial
- if (Serial.available() >= 32) {
- lcd.setCursor(0, 0);
- Serial.readBytes(buf, 32);
- for (int i = 0; i < 32; i++) {
- if (i == 16) {
- lcd.setCursor(0, 1);
- }
- lcd.write(buf[i]);
+ // buffer serial input ourselves
+ if (Serial.available() >= 1) {
+ buffered += Serial.readBytes(buf + buffered, LCD_CHARS - buffered);
+ }
+
+ if (buffered >= LCD_CHARS) {
+ strcpy(display_data, buf);
+ buffered = 0;
+ }
+
+ // update display
+ lcd.setCursor(0, 0);
+ int line = -1;
+ for (int i = 0; i < LCD_CHARS; i++) {
+ if (display_data[i] == '\0') {
+ break;
+ }
+ if (i % LCD_COLS == 0) {
+ line++;
+ lcd.setCursor(0, line);
}
+ lcd.write(display_data[i]);
}
}