Moved boot splash to main AVR firmware
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Sat, 22 Jul 2017 08:42:23 +0000 (01:42 -0700)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Sat, 22 Jul 2017 08:42:23 +0000 (01:42 -0700)
13 files changed:
MANIFEST.in
Makefile
scripts/install.sh
src/avr/src/command.c
src/avr/src/command.h
src/avr/src/lcd.c [new file with mode: 0644]
src/avr/src/lcd.h [new file with mode: 0644]
src/avr/src/main.c
src/avr/src/rtc.c
src/boot/src/boot.c
src/boot/src/lcd.c [deleted file]
src/boot/src/lcd.h [deleted file]
src/py/lcd/__init__.py

index 9dec8922c24c06bdabe8e66c1a4d43e81f451d75..16bff19d6672079d93ad157e8809a7bde4349e33 100644 (file)
@@ -1,3 +1,4 @@
 recursive-include src/py/bbctrl/http *
-include package.json README.md scripts/install.sh src/avr/bbctrl-avr-firmware.hex
+include package.json README.md scripts/install.sh
+include src/avr/bbctrl-avr-firmware.hex
 include scripts/avr109-flash.py
index 167eeb65a84ae489cb5669d9d55ce460044cb485..a0f21e2a7faec1b1bda368f2dde67049c9e0419d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -40,9 +40,10 @@ endif
 WATCH := src/jade src/jade/templates src/stylus src/js src/resources Makefile
 
 all: html css js static
-       @for SUB in $(SUBPROJECTS); do \
-         $(MAKE) -C src/$$SUB; \
-       done
+       @$(MAKE) -C src/avr
+       @$(MAKE) -C src/boot
+       @$(MAKE) -C src/pwr
+       @$(MAKE) -C src/jig
 
 copy: pkg
        rsync $(RSYNC_OPTS) pkg/$(PKG_NAME)/ $(DEST)/bbctrl/
index 1b27c96707d5a49e84ee950b6b73e2f61a81bc5b..7e09eaed51f457855b08c74053a45e0a71f3e369 100755 (executable)
@@ -19,7 +19,7 @@ if $UPDATE_PY; then
 fi
 
 if $UPDATE_AVR; then
-    ./scripts/avr109-flash.py avr/bbctrl-avr-firmware.hex
+    ./scripts/avr109-flash.py src/avr/bbctrl-avr-firmware.hex
 fi
 
 if $UPDATE_PY; then
index 3939751a24c5f0fb24ce6d777179e61317eb817a..410487847ae341e1225a6d4979a04faf7a1ada72 100644 (file)
@@ -50,6 +50,7 @@
 
 
 static char *_cmd = 0;
+static bool _active = false;
 
 
 static void command_i2c_cb(i2c_cmd_t cmd, uint8_t *data, uint8_t length) {
@@ -254,12 +255,16 @@ void command_callback() {
   }
 
   _cmd = 0; // Command consumed
+  _active = true;
   report_request();
 
   if (status) status_error(status);
 }
 
 
+bool command_is_active() {return _active;}
+
+
 // Command functions
 void static print_command_help(int i) {
   static const char fmt[] PROGMEM = "  $%-12"PRPSTR"  %"PRPSTR"\n";
index 67397ac2fc0b64dccbb899c3be157ad2100a3b6b..08dd4683dfab9bf16f03ab4447cf2e657e86b4c2 100644 (file)
@@ -29,6 +29,7 @@
 
 
 #include <stdint.h>
+#include <stdbool.h>
 
 
 #define MAX_ARGS 16
@@ -48,3 +49,4 @@ void command_init();
 int command_find(const char *name);
 int command_exec(int argc, char *argv[]);
 void command_callback();
+bool command_is_active();
diff --git a/src/avr/src/lcd.c b/src/avr/src/lcd.c
new file mode 100644 (file)
index 0000000..2050b94
--- /dev/null
@@ -0,0 +1,132 @@
+/******************************************************************************\
+
+                This file is part of the Buildbotics firmware.
+
+                  Copyright (c) 2015 - 2017 Buildbotics LLC
+          Copyright (c) 2010 Alex Forencich <alex@alexforencich.com>
+                            All rights reserved.
+
+     This file ("the software") is free software: you can redistribute it
+     and/or modify it under the terms of the GNU General Public License,
+      version 2 as published by the Free Software Foundation. You should
+      have received a copy of the GNU General Public License, version 2
+     along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+     The software is distributed in the hope that it will be useful, but
+          WITHOUT ANY WARRANTY; without even the implied warranty of
+      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+               Lesser General Public License for more details.
+
+       You should have received a copy of the GNU Lesser General Public
+                License along with the software.  If not, see
+                       <http://www.gnu.org/licenses/>.
+
+                For information regarding this software email:
+                  "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#include "lcd.h"
+#include "rtc.h"
+#include "command.h"
+
+#include <avr/io.h>
+#include <util/delay.h>
+
+#include <stdbool.h>
+
+
+void lcd_init(uint8_t addr) {
+  // Enable I2C master
+  TWIC.MASTER.BAUD = 0x9b; // 100 KHz with 32MHz clock
+  TWIC.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
+  TWIC.MASTER.CTRLB = TWI_MASTER_TIMEOUT_DISABLED_gc;
+  TWIC.MASTER.STATUS |= 1; // Force idle
+
+  _delay_ms(50);
+  lcd_nibble(addr, 3 << 4); // Home
+  _delay_ms(50);
+  lcd_nibble(addr, 3 << 4); // Home
+  _delay_ms(50);
+  lcd_nibble(addr, 3 << 4); // Home
+  lcd_nibble(addr, 2 << 4); // 4-bit
+
+  lcd_write(addr,
+            LCD_FUNCTION_SET | LCD_2_LINE | LCD_5x8_DOTS | LCD_4_BIT_MODE, 0);
+  lcd_write(addr, LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON, 0);
+  lcd_write(addr, LCD_ENTRY_MODE_SET | LCD_ENTRY_SHIFT_INC, 0);
+
+  lcd_write(addr, LCD_CLEAR_DISPLAY, 0);
+  lcd_write(addr, LCD_RETURN_HOME, 0);
+}
+
+
+static void _write_i2c(uint8_t addr, uint8_t data) {
+  data |= BACKLIGHT_BIT;
+
+  TWIC.MASTER.ADDR = addr << 1;
+  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
+
+  TWIC.MASTER.DATA = data;
+  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
+
+  TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
+
+  _delay_us(100);
+}
+
+
+void lcd_nibble(uint8_t addr, uint8_t data) {
+  _write_i2c(addr, data);
+  _write_i2c(addr, data | ENABLE_BIT);
+  _delay_us(500);
+  _write_i2c(addr, data & ~ENABLE_BIT);
+  _delay_us(100);
+}
+
+
+void lcd_write(uint8_t addr, uint8_t cmd, uint8_t flags) {
+  lcd_nibble(addr, flags | (cmd & 0xf0));
+  lcd_nibble(addr, flags | ((cmd << 4) & 0xf0));
+}
+
+
+void lcd_goto(uint8_t addr, uint8_t x, uint8_t y) {
+  static uint8_t row[] = {0, 64, 20, 84};
+  lcd_write(addr, LCD_SET_DDRAM_ADDR | (row[y] + x), 0);
+}
+
+
+void lcd_putchar(uint8_t addr, uint8_t c) {
+  lcd_write(addr, c, REG_SELECT_BIT);
+}
+
+
+void lcd_pgmstr(uint8_t addr, const char *s) {
+  while (true) {
+    char c = pgm_read_byte(s++);
+    if (!c) break;
+    lcd_putchar(addr, c);
+  }
+}
+
+
+void _splash(uint8_t addr) {
+  lcd_init(addr);
+  lcd_goto(addr, 1, 1);
+  lcd_pgmstr(addr, PSTR("Controller booting"));
+  lcd_goto(addr, 3, 2);
+  lcd_pgmstr(addr, PSTR("Please wait..."));
+}
+
+
+void lcd_splash() {
+  _splash(0x27);
+  _splash(0x3f);
+}
+
+
+void lcd_rtc_callback() {
+  if (!command_is_active() && rtc_get_time() == 1000)
+    lcd_splash();
+}
diff --git a/src/avr/src/lcd.h b/src/avr/src/lcd.h
new file mode 100644 (file)
index 0000000..96826f0
--- /dev/null
@@ -0,0 +1,104 @@
+/******************************************************************************\
+
+                This file is part of the Buildbotics firmware.
+
+                  Copyright (c) 2015 - 2017 Buildbotics LLC
+          Copyright (c) 2010 Alex Forencich <alex@alexforencich.com>
+                            All rights reserved.
+
+     This file ("the software") is free software: you can redistribute it
+     and/or modify it under the terms of the GNU General Public License,
+      version 2 as published by the Free Software Foundation. You should
+      have received a copy of the GNU General Public License, version 2
+     along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+     The software is distributed in the hope that it will be useful, but
+          WITHOUT ANY WARRANTY; without even the implied warranty of
+      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+               Lesser General Public License for more details.
+
+       You should have received a copy of the GNU Lesser General Public
+                License along with the software.  If not, see
+                       <http://www.gnu.org/licenses/>.
+
+                For information regarding this software email:
+                  "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#include <avr/pgmspace.h>
+
+#include <stdint.h>
+
+
+// Control flags
+enum {
+  REG_SELECT_BIT          = 1 << 0,
+  READ_BIT                = 1 << 1,
+  ENABLE_BIT              = 1 << 2,
+  BACKLIGHT_BIT           = 1 << 3,
+};
+
+
+// Commands
+enum {
+  LCD_CLEAR_DISPLAY       = 1 << 0,
+  LCD_RETURN_HOME         = 1 << 1,
+  LCD_ENTRY_MODE_SET      = 1 << 2,
+  LCD_DISPLAY_CONTROL     = 1 << 3,
+  LCD_CURSOR_SHIFT        = 1 << 4,
+  LCD_FUNCTION_SET        = 1 << 5,
+  LCD_SET_CGRAM_ADDR      = 1 << 6,
+  LCD_SET_DDRAM_ADDR      = 1 << 7,
+};
+
+
+// Entry Mode Set flags
+#define LCD_ENTRY_SHIFT_DISPLAY (1 << 0)
+#define LCD_ENTRY_SHIFT_INC     (1 << 1)
+#define LCD_ENTRY_SHIFT_DEC     (0 << 1)
+
+
+// Display Control flags
+#define LCD_BLINK_ON            (1 << 0)
+#define LCD_BLINK_OFF           (0 << 0)
+#define LCD_CURSOR_ON           (1 << 1)
+#define LCD_CURSOR_OFF          (0 << 1)
+#define LCD_DISPLAY_ON          (1 << 2)
+#define LCD_DISPLAY_OFF         (0 << 2)
+
+
+// Cursor Shift flags
+#define LCD_SHIFT_RIGHT         (1 << 2)
+#define LCD_SHIFT_LEFT          (0 << 2)
+#define LCD_SHIFT_DISPLAY       (1 << 3)
+#define LCD_SHIFT_CURSOR        (0 << 3)
+
+
+// Function Set flags
+#define LCD_5x11_DOTS           (1 << 2)
+#define LCD_5x8_DOTS            (0 << 2)
+#define LCD_2_LINE              (1 << 3)
+#define LCD_1_LINE              (0 << 3)
+#define LCD_8_BIT_MODE          (1 << 4)
+#define LCD_4_BIT_MODE          (0 << 4)
+
+
+// Text justification flags
+enum {
+  JUSTIFY_LEFT            = 0,
+  JUSTIFY_RIGHT           = 1,
+  JUSTIFY_CENTER          = 2,
+};
+
+
+void lcd_init(uint8_t addr);
+void lcd_nibble(uint8_t addr, uint8_t data);
+void lcd_write(uint8_t addr, uint8_t cmd, uint8_t flags);
+void lcd_goto(uint8_t addr, uint8_t x, uint8_t y);
+void lcd_putchar(uint8_t addr, uint8_t c);
+void lcd_pgmstr(uint8_t addr, const char *s);
+void lcd_splash();
+void lcd_rtc_callback();
index 62508279f5ac132a8aaae8682c32898135f54d0f..3668c552a367ae074617e7eb52c5ed42ad600416 100644 (file)
@@ -42,6 +42,7 @@
 #include "i2c.h"
 #include "pgmspace.h"
 #include "outputs.h"
+#include "lcd.h"
 
 #include "plan/planner.h"
 #include "plan/arc.h"
index e09c584541fbb7a748e9cf70e879d92d39ace748..f3bc3f39610cccff3b83223bac1202f2a8ec97cf 100644 (file)
@@ -31,6 +31,7 @@
 #include "switch.h"
 #include "huanyang.h"
 #include "motor.h"
+#include "lcd.h"
 
 #include <avr/io.h>
 #include <avr/interrupt.h>
@@ -47,6 +48,7 @@ ISR(RTC_OVF_vect) {
   switch_rtc_callback();
   huanyang_rtc_callback();
   if (!(ticks & 255)) motor_rtc_callback();
+  lcd_rtc_callback();
 }
 
 
index a2a6c5ae6deae958ece7917ccc2023a474ac047c..2b6c54d04eaeba64f92a6d0917d427373103367f 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "boot.h"
 #include "sp_driver.h"
-#include "lcd.h"
 
 #include <util/delay.h>
 #include <util/crc16.h>
@@ -60,15 +59,6 @@ void clock_init() {
 }
 
 
-void lcd_splash(uint8_t addr) {
-  lcd_init(addr);
-  lcd_goto(addr, 1, 1);
-  lcd_pgmstr(addr, "Controller booting");
-  lcd_goto(addr, 3, 2);
-  lcd_pgmstr(addr, "Please wait...");
-}
-
-
 bool uart_has_char() {return UART_DEVICE.STATUS & USART_RXCIF_bm;}
 uint8_t uart_recv_char() {return UART_DEVICE.DATA;}
 
@@ -458,9 +448,6 @@ int main() {
   // Disable further self programming until next reset
   SP_LockSPM();
 
-  lcd_splash(0x27);
-  lcd_splash(0x3f);
-
   // Jump to application code
   asm("jmp 0");
 }
diff --git a/src/boot/src/lcd.c b/src/boot/src/lcd.c
deleted file mode 100644 (file)
index 7379a2f..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/******************************************************************************\
-
-                This file is part of the Buildbotics firmware.
-
-                  Copyright (c) 2015 - 2017 Buildbotics LLC
-          Copyright (c) 2010 Alex Forencich <alex@alexforencich.com>
-                            All rights reserved.
-
-     This file ("the software") is free software: you can redistribute it
-     and/or modify it under the terms of the GNU General Public License,
-      version 2 as published by the Free Software Foundation. You should
-      have received a copy of the GNU General Public License, version 2
-     along with the software. If not, see <http://www.gnu.org/licenses/>.
-
-     The software is distributed in the hope that it will be useful, but
-          WITHOUT ANY WARRANTY; without even the implied warranty of
-      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-               Lesser General Public License for more details.
-
-       You should have received a copy of the GNU Lesser General Public
-                License along with the software.  If not, see
-                       <http://www.gnu.org/licenses/>.
-
-                For information regarding this software email:
-                  "Joseph Coffland" <joseph@buildbotics.com>
-
-\******************************************************************************/
-
-#include "lcd.h"
-
-#include <avr/io.h>
-#include <util/delay.h>
-
-#include <stdbool.h>
-
-
-void lcd_init(uint8_t addr) {
-  // Enable I2C master
-  TWIC.MASTER.BAUD = 0x9b; // 100 KHz with 32MHz clock
-  TWIC.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
-  TWIC.MASTER.CTRLB = TWI_MASTER_TIMEOUT_DISABLED_gc;
-  TWIC.MASTER.STATUS |= 1; // Force idle
-
-  _delay_ms(50);
-  lcd_nibble(addr, 3 << 4); // Home
-  _delay_ms(50);
-  lcd_nibble(addr, 3 << 4); // Home
-  _delay_ms(50);
-  lcd_nibble(addr, 3 << 4); // Home
-  lcd_nibble(addr, 2 << 4); // 4-bit
-
-  lcd_write(addr,
-            LCD_FUNCTION_SET | LCD_2_LINE | LCD_5x8_DOTS | LCD_4_BIT_MODE, 0);
-  lcd_write(addr, LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON, 0);
-  lcd_write(addr, LCD_ENTRY_MODE_SET | LCD_ENTRY_SHIFT_INC, 0);
-
-  lcd_write(addr, LCD_CLEAR_DISPLAY, 0);
-  lcd_write(addr, LCD_RETURN_HOME, 0);
-}
-
-
-static void _write_i2c(uint8_t addr, uint8_t data) {
-  data |= BACKLIGHT_BIT;
-
-  TWIC.MASTER.ADDR = addr << 1;
-  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
-
-  TWIC.MASTER.DATA = data;
-  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
-
-  TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
-
-  _delay_us(100);
-}
-
-
-void lcd_nibble(uint8_t addr, uint8_t data) {
-  _write_i2c(addr, data);
-  _write_i2c(addr, data | ENABLE_BIT);
-  _delay_us(500);
-  _write_i2c(addr, data & ~ENABLE_BIT);
-  _delay_us(100);
-}
-
-
-void lcd_write(uint8_t addr, uint8_t cmd, uint8_t flags) {
-  lcd_nibble(addr, flags | (cmd & 0xf0));
-  lcd_nibble(addr, flags | ((cmd << 4) & 0xf0));
-}
-
-
-void lcd_goto(uint8_t addr, uint8_t x, uint8_t y) {
-  static uint8_t row[] = {0, 64, 20, 84};
-  lcd_write(addr, LCD_SET_DDRAM_ADDR | (row[y] + x), 0);
-}
-
-
-void lcd_putchar(uint8_t addr, uint8_t c) {
-  lcd_write(addr, c, REG_SELECT_BIT);
-}
-
-
-void lcd_pgmstr(uint8_t addr, const char *s) {
-  while (*s) lcd_putchar(addr, *s++);
-}
diff --git a/src/boot/src/lcd.h b/src/boot/src/lcd.h
deleted file mode 100644 (file)
index 29fc616..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/******************************************************************************\
-
-                This file is part of the Buildbotics firmware.
-
-                  Copyright (c) 2015 - 2017 Buildbotics LLC
-          Copyright (c) 2010 Alex Forencich <alex@alexforencich.com>
-                            All rights reserved.
-
-     This file ("the software") is free software: you can redistribute it
-     and/or modify it under the terms of the GNU General Public License,
-      version 2 as published by the Free Software Foundation. You should
-      have received a copy of the GNU General Public License, version 2
-     along with the software. If not, see <http://www.gnu.org/licenses/>.
-
-     The software is distributed in the hope that it will be useful, but
-          WITHOUT ANY WARRANTY; without even the implied warranty of
-      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-               Lesser General Public License for more details.
-
-       You should have received a copy of the GNU Lesser General Public
-                License along with the software.  If not, see
-                       <http://www.gnu.org/licenses/>.
-
-                For information regarding this software email:
-                  "Joseph Coffland" <joseph@buildbotics.com>
-
-\******************************************************************************/
-
-#pragma once
-
-#include <avr/pgmspace.h>
-
-#include <stdint.h>
-
-
-// Control flags
-enum {
-  REG_SELECT_BIT          = 1 << 0,
-  READ_BIT                = 1 << 1,
-  ENABLE_BIT              = 1 << 2,
-  BACKLIGHT_BIT           = 1 << 3,
-};
-
-
-// Commands
-enum {
-  LCD_CLEAR_DISPLAY       = 1 << 0,
-  LCD_RETURN_HOME         = 1 << 1,
-  LCD_ENTRY_MODE_SET      = 1 << 2,
-  LCD_DISPLAY_CONTROL     = 1 << 3,
-  LCD_CURSOR_SHIFT        = 1 << 4,
-  LCD_FUNCTION_SET        = 1 << 5,
-  LCD_SET_CGRAM_ADDR      = 1 << 6,
-  LCD_SET_DDRAM_ADDR      = 1 << 7,
-};
-
-
-// Entry Mode Set flags
-#define LCD_ENTRY_SHIFT_DISPLAY (1 << 0)
-#define LCD_ENTRY_SHIFT_INC     (1 << 1)
-#define LCD_ENTRY_SHIFT_DEC     (0 << 1)
-
-
-// Display Control flags
-#define LCD_BLINK_ON            (1 << 0)
-#define LCD_BLINK_OFF           (0 << 0)
-#define LCD_CURSOR_ON           (1 << 1)
-#define LCD_CURSOR_OFF          (0 << 1)
-#define LCD_DISPLAY_ON          (1 << 2)
-#define LCD_DISPLAY_OFF         (0 << 2)
-
-
-// Cursor Shift flags
-#define LCD_SHIFT_RIGHT         (1 << 2)
-#define LCD_SHIFT_LEFT          (0 << 2)
-#define LCD_SHIFT_DISPLAY       (1 << 3)
-#define LCD_SHIFT_CURSOR        (0 << 3)
-
-
-// Function Set flags
-#define LCD_5x11_DOTS           (1 << 2)
-#define LCD_5x8_DOTS            (0 << 2)
-#define LCD_2_LINE              (1 << 3)
-#define LCD_1_LINE              (0 << 3)
-#define LCD_8_BIT_MODE          (1 << 4)
-#define LCD_4_BIT_MODE          (0 << 4)
-
-
-// Text justification flags
-enum {
-  JUSTIFY_LEFT            = 0,
-  JUSTIFY_RIGHT           = 1,
-  JUSTIFY_CENTER          = 2,
-};
-
-
-void lcd_init(uint8_t addr);
-void lcd_nibble(uint8_t addr, uint8_t data);
-void lcd_write(uint8_t addr, uint8_t cmd, uint8_t flags);
-void lcd_goto(uint8_t addr, uint8_t x, uint8_t y);
-void lcd_putchar(uint8_t addr, uint8_t c);
-void lcd_pgmstr(uint8_t addr, const char *s);
index f8065f511f823819ac3d9df8e29e420ea977fc33..ab446ba471207c98a8f0c3b5b726d33547ad5959 100755 (executable)
@@ -69,6 +69,7 @@ class LCD:
 
 
     def reset(self):
+        self.clear()
         time.sleep(0.050)
         self.write_nibble(3 << 4) # Home
         time.sleep(0.050)