From 277fbf9265f48de8d2c4d7cdd1fe43c118ddc736 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 4 Jul 2015 12:19:46 +0200 Subject: [PATCH 001/109] readme update --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index 7dfdd455..856d5dc6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,33 @@ # u8glib + +A graphics library with support for many different monochrome displays. + +![http://wiki.u8glib.googlecode.com/hg/otherpic/nhd_oled180.jpg](nhd_oled180.jpg) ![http://wiki.u8glib.googlecode.com/hg/otherpic/dogs102_180.jpg](dogs102_180.jpg) + +Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) + +*U8glib:* + * [https://github.com/olikraus/u8glib/wiki](Documentation) + * [gallery](Gallery) + * [https://bintray.com/olikraus/u8glib Bintray] download links: + * U8glib for Arduino: ![https://bintray.com/olikraus/u8glib/Arduino https://api.bintray.com/packages/olikraus/u8glib/Arduino/images/download.png](Arduino) + * U8glib for AVR: ![https://bintray.com/olikraus/u8glib/AVR https://api.bintray.com/packages/olikraus/u8glib/AVR/images/download.png](AVR) + * U8glib for ARM: ![https://bintray.com/olikraus/u8glib/ARM https://api.bintray.com/packages/olikraus/u8glib/ARM/images/download.png](ARM) + * Converter for BDF fonts: [https://drive.google.com/folderview?id=0B5b6Dv0wCeCRLWJkYTh2TUlYVDg&usp=sharing](bdf2u8g_101.exe on google drive). + * Supported environments: + * [http://www.arduino.cc/](Arduino (ATMEGA and ARM)) + * [avr](AVR (ATMEGA)) + * [lpc1114](ARM (with example for LPC1114)) + * Library for graphic LCDs and OLEDs + * Complete [u8glib documentation and tutorials] + * Graphical user interface library (GUI) available: [http://code.google.com/p/m2tklib/ M2tklib] + * Monochrome, grayscale and indexed color (planned) + * COM interfaces: Software SPI, Hardware SPI, 8Bit parallel + * Large number of fonts (up to [fontsize 49 pixel height]) + * Monospaced and proportional fonts + * Mouse-Cursor support + * Landscape and portrait mode + * Many supported [device devices] (SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, SH1106, T6963, LD7032) + * Well-defined interface to the device subsystem + From 70a6dd096897e17fe0b9e7b2b24968e73c054d22 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 4 Jul 2015 12:26:44 +0200 Subject: [PATCH 002/109] readme update --- README.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 856d5dc6..823f6e50 100644 --- a/README.md +++ b/README.md @@ -8,23 +8,21 @@ A graphics library with support for many different monochrome displays. Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) *U8glib:* - * [https://github.com/olikraus/u8glib/wiki](Documentation) - * [gallery](Gallery) - * [https://bintray.com/olikraus/u8glib Bintray] download links: - * U8glib for Arduino: ![https://bintray.com/olikraus/u8glib/Arduino https://api.bintray.com/packages/olikraus/u8glib/Arduino/images/download.png](Arduino) - * U8glib for AVR: ![https://bintray.com/olikraus/u8glib/AVR https://api.bintray.com/packages/olikraus/u8glib/AVR/images/download.png](AVR) - * U8glib for ARM: ![https://bintray.com/olikraus/u8glib/ARM https://api.bintray.com/packages/olikraus/u8glib/ARM/images/download.png](ARM) - * Converter for BDF fonts: [https://drive.google.com/folderview?id=0B5b6Dv0wCeCRLWJkYTh2TUlYVDg&usp=sharing](bdf2u8g_101.exe on google drive). + * [Gallery](gallery) + * [Bintray](https://bintray.com/olikraus/u8glib) download links: + * [U8glib for Arduino](https://bintray.com/olikraus/u8glib/Arduino) + * [U8glib for AVR](https://bintray.com/olikraus/u8glib/AVR) + * [U8glib for ARM](https://bintray.com/olikraus/u8glib/ARM) + * Converter for BDF fonts: [bdf2u8g_101.exe on google drive](https://drive.google.com/folderview?id=0B5b6Dv0wCeCRLWJkYTh2TUlYVDg&usp=sharing). * Supported environments: - * [http://www.arduino.cc/](Arduino (ATMEGA and ARM)) - * [avr](AVR (ATMEGA)) - * [lpc1114](ARM (with example for LPC1114)) + * [Arduino (ATMEGA and ARM)](http://www.arduino.cc/) + * [AVR (ATMEGA)](avr) + * [ARM (with example for LPC1114)](lpc1114) * Library for graphic LCDs and OLEDs - * Complete [u8glib documentation and tutorials] - * Graphical user interface library (GUI) available: [http://code.google.com/p/m2tklib/ M2tklib] - * Monochrome, grayscale and indexed color (planned) + * [U8glib documentation and tutorials](https://github.com/olikraus/u8glib/wiki) + * Graphical user interface library (GUI) available: [M2tklib](http://code.google.com/p/m2tklib/) * COM interfaces: Software SPI, Hardware SPI, 8Bit parallel - * Large number of fonts (up to [fontsize 49 pixel height]) + * Large number of [fonts](fontsize) * Monospaced and proportional fonts * Mouse-Cursor support * Landscape and portrait mode From 8bd07a22f81e3aa8fd508514ea3ecfeb8849175a Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 4 Jul 2015 12:27:41 +0200 Subject: [PATCH 003/109] readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 823f6e50..41233ecd 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A graphics library with support for many different monochrome displays. -![http://wiki.u8glib.googlecode.com/hg/otherpic/nhd_oled180.jpg](nhd_oled180.jpg) ![http://wiki.u8glib.googlecode.com/hg/otherpic/dogs102_180.jpg](dogs102_180.jpg) +![nhd_oled180.jpg](http://wiki.u8glib.googlecode.com/hg/otherpic/nhd_oled180.jpg) ![dogs102_180.jpg](http://wiki.u8glib.googlecode.com/hg/otherpic/dogs102_180.jpg) Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) From 42d4070458c040d67bf758fdd6d783e4123d3646 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 4 Jul 2015 12:30:09 +0200 Subject: [PATCH 004/109] readme update --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 41233ecd..d9245a38 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ A graphics library with support for many different monochrome displays. -![nhd_oled180.jpg](http://wiki.u8glib.googlecode.com/hg/otherpic/nhd_oled180.jpg) ![dogs102_180.jpg](http://wiki.u8glib.googlecode.com/hg/otherpic/dogs102_180.jpg) +![nhd_oled180.jpg](https://github.com/olikraus/u8glib/wiki/otherpic/nhd_oled180.jpg) ![dogs102_180.jpg](https://github.com/olikraus/u8glib/wiki/otherpic/dogs102_180.jpg) Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) *U8glib:* - * [Gallery](gallery) + * [Gallery](https://github.com/olikraus/u8glib/wiki/gallery) * [Bintray](https://bintray.com/olikraus/u8glib) download links: * [U8glib for Arduino](https://bintray.com/olikraus/u8glib/Arduino) * [U8glib for AVR](https://bintray.com/olikraus/u8glib/AVR) @@ -16,16 +16,16 @@ Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) * Converter for BDF fonts: [bdf2u8g_101.exe on google drive](https://drive.google.com/folderview?id=0B5b6Dv0wCeCRLWJkYTh2TUlYVDg&usp=sharing). * Supported environments: * [Arduino (ATMEGA and ARM)](http://www.arduino.cc/) - * [AVR (ATMEGA)](avr) - * [ARM (with example for LPC1114)](lpc1114) + * [AVR (ATMEGA)](https://github.com/olikraus/u8glib/wiki/avr) + * [ARM (with example for LPC1114)](https://github.com/olikraus/u8glib/wiki/lpc1114) * Library for graphic LCDs and OLEDs * [U8glib documentation and tutorials](https://github.com/olikraus/u8glib/wiki) * Graphical user interface library (GUI) available: [M2tklib](http://code.google.com/p/m2tklib/) * COM interfaces: Software SPI, Hardware SPI, 8Bit parallel - * Large number of [fonts](fontsize) + * Large number of [fonts](https://github.com/olikraus/u8glib/wiki/fontsize) * Monospaced and proportional fonts * Mouse-Cursor support * Landscape and portrait mode - * Many supported [device devices] (SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, SH1106, T6963, LD7032) + * Many supported [devices](https://github.com/olikraus/u8glib/wiki/device) (SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, SH1106, T6963, LD7032) * Well-defined interface to the device subsystem From a72374b15c78bbe01b0455a2296cbd78517175bb Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 4 Jul 2015 12:34:36 +0200 Subject: [PATCH 005/109] readme update --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d9245a38..c624a7fe 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# u8glib +# U8glib A graphics library with support for many different monochrome displays. @@ -7,7 +7,6 @@ A graphics library with support for many different monochrome displays. Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) -*U8glib:* * [Gallery](https://github.com/olikraus/u8glib/wiki/gallery) * [Bintray](https://bintray.com/olikraus/u8glib) download links: * [U8glib for Arduino](https://bintray.com/olikraus/u8glib/Arduino) From a1bbd7ca65e431c749975baae71a005d5551bfcc Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 11 Jul 2015 18:12:54 +0200 Subject: [PATCH 006/109] issue 339 --- csrc/u8g_dev_uc1611_dogm240.c | 3 ++- csrc/u8g_dev_uc1611_dogxl240.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/csrc/u8g_dev_uc1611_dogm240.c b/csrc/u8g_dev_uc1611_dogm240.c index ce33dca5..88efe1e3 100644 --- a/csrc/u8g_dev_uc1611_dogm240.c +++ b/csrc/u8g_dev_uc1611_dogm240.c @@ -103,7 +103,8 @@ uint8_t u8g_dev_uc1611_dogm240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x81); - u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); /* set contrast from, keep gain at 0 */ + /* 11 Jul 2015: bugfix, github issue 339 */ + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ u8g_SetChipSelect(u8g, dev, 1); return 1; } diff --git a/csrc/u8g_dev_uc1611_dogxl240.c b/csrc/u8g_dev_uc1611_dogxl240.c index 6e66ff1d..216300d4 100644 --- a/csrc/u8g_dev_uc1611_dogxl240.c +++ b/csrc/u8g_dev_uc1611_dogxl240.c @@ -103,7 +103,8 @@ static uint8_t u8g_dev_uc1611_dogxl240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t ms u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x81); - u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); /* set contrast from, keep gain at 0 */ + /* 11 Jul 2015: bugfix, github issue 339 */ + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ u8g_SetChipSelect(u8g, dev, 1); return 1; } From 78e4e070ccf760e936db0b6592fd934f118a2b0d Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 11 Jul 2015 18:25:01 +0200 Subject: [PATCH 007/109] issue 326 (contrast setting) --- csrc/u8g_dev_ssd1309_128x64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csrc/u8g_dev_ssd1309_128x64.c b/csrc/u8g_dev_ssd1309_128x64.c index 1c11b029..4893f82c 100644 --- a/csrc/u8g_dev_ssd1309_128x64.c +++ b/csrc/u8g_dev_ssd1309_128x64.c @@ -124,7 +124,7 @@ uint8_t u8g_dev_ssd1309_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void u8g_SetChipSelect(u8g, dev, 1); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x081); - u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */ u8g_SetChipSelect(u8g, dev, 0); return 1; case U8G_DEV_MSG_SLEEP_ON: From 7a7ecf233c375f40c8f7e268db754648928a5461 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 12 Jul 2015 18:03:22 +0200 Subject: [PATCH 008/109] ssd1306 64x48 support, new arduino lib format --- ChangeLog | 6 +- cppsrc/U8glib.h | 28 +++ csrc/u8g.h | 9 + csrc/u8g_dev_ssd1306_64x48.c | 187 ++++++++++++++++++ sys/arduino/HelloWorld/HelloWorld.pde | 5 +- sys/arduino/U8gLogo/U8gLogo.pde | 11 +- .../arduino_new_lib_format/INSTALL.TXT | 26 +++ .../arduino_new_lib_format/create_release.sh | 61 ++++++ .../arduino_new_lib_format/library.properties | 9 + 9 files changed, 335 insertions(+), 7 deletions(-) create mode 100644 csrc/u8g_dev_ssd1306_64x48.c create mode 100644 tools/release/arduino_new_lib_format/INSTALL.TXT create mode 100755 tools/release/arduino_new_lib_format/create_release.sh create mode 100644 tools/release/arduino_new_lib_format/library.properties diff --git a/ChangeLog b/ChangeLog index 9bf4b34e..1ef2c78d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -154,8 +154,10 @@ u8glib ChangeLog * 400KHz option for I2C with U8G_I2C_OPT_FAST available for Due and Uno (Issue 303) * I2C support for Arduino Due. 100KHz/400KHz, TWI & TWI1, ACK will be ignored (issue 285) * Unifont update (Issue 297) - - +2015-xx-xx v1.18 Oliver Kraus + * Fixed contrast assignment for SSD1309 and UC1611 + * Fixed bug in u8g_DrawLine(), Github issue 343 + * Fixed bug in u8g_DrawStr90P(), Github issue 331 diff --git a/cppsrc/U8glib.h b/cppsrc/U8glib.h index 74b57756..db8e718e 100644 --- a/cppsrc/U8glib.h +++ b/cppsrc/U8glib.h @@ -968,6 +968,34 @@ class U8GLIB_SSD1306_128X32_2X : public U8GLIB { } }; +class U8GLIB_SSD1306_64X48 : public U8GLIB +{ + public: + U8GLIB_SSD1306_64X48(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_sw_spi, sck, mosi, cs, a0, reset) + { } + U8GLIB_SSD1306_64X48(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_hw_spi, cs, a0, reset) + { } + U8GLIB_SSD1306_64X48(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_i2c, options) + { } +}; + +class U8GLIB_SSD1306_64X48_2X : public U8GLIB +{ + public: + U8GLIB_SSD1306_64X48_2X(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_2x_sw_spi, sck, mosi, cs, a0, reset) + { } + U8GLIB_SSD1306_64X48_2X(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_2x_hw_spi, cs, a0, reset) + { } + U8GLIB_SSD1306_64X48_2X(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ssd1306_64x48_2x_i2c, options) + { } +}; + class U8GLIB_NHD27OLED_GR : public U8GLIB { diff --git a/csrc/u8g.h b/csrc/u8g.h index 48f81e0c..ecc57778 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -466,6 +466,15 @@ extern u8g_dev_t u8g_dev_ssd1306_128x32_2x_sw_spi; extern u8g_dev_t u8g_dev_ssd1306_128x32_2x_hw_spi; extern u8g_dev_t u8g_dev_ssd1306_128x32_2x_i2c; +/* OLED 64x48 Display with SSD1306 Controller */ +extern u8g_dev_t u8g_dev_ssd1306_64x48_sw_spi; +extern u8g_dev_t u8g_dev_ssd1306_64x48_hw_spi; +extern u8g_dev_t u8g_dev_ssd1306_64x48_i2c; + +extern u8g_dev_t u8g_dev_ssd1306_64x48_2x_sw_spi; +extern u8g_dev_t u8g_dev_ssd1306_64x48_2x_hw_spi; +extern u8g_dev_t u8g_dev_ssd1306_64x48_2x_i2c; + /* OLED 60x32 Display with LD7032 Controller */ extern u8g_dev_t u8g_dev_ld7032_60x32_sw_spi; extern u8g_dev_t u8g_dev_ld7032_60x32_hw_spi; diff --git a/csrc/u8g_dev_ssd1306_64x48.c b/csrc/u8g_dev_ssd1306_64x48.c new file mode 100644 index 00000000..1ca00e82 --- /dev/null +++ b/csrc/u8g_dev_ssd1306_64x48.c @@ -0,0 +1,187 @@ +/* + + u8g_dev_ssd1306_64x48.c + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +*/ + + +#include "u8g.h" + +#define WIDTH 64 +#define HEIGHT 48 +#define PAGE_HEIGHT 8 + + + +/* init sequence buydisplay.com 0.66" 64x48 OLED */ +/* http://www.buydisplay.com/download/manual/ER-OLED0.66-1_Series_Datasheet.pdf */ +static const uint8_t u8g_dev_ssd1306_64x48_init_seq[] PROGMEM = { + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ + U8G_ESC_CS(1), /* enable chip */ + + 0x0ae, /* display off, sleep mode */ + 0x0d5, 0x080, /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */ + 0x0a8, 0x02f, /* Multiplex Ration, Jul 12, 2015: From 0.66" OLED datasheet */ + + 0x0d3, 0x000, /* */ + + 0x040, /* start line */ + + 0x08d, 0x014, /* charge pump setting (p62): 0x014 enable, 0x010 disable */ + + //0x020, 0x002, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5), Feb 23, 2013: 64x48 OLED: 0x002, 64x48 OLED 0x012 */ + 0x0a1, /* segment remap a0/a1*/ + 0x0c8, /* c0: scan dir normal, c8: reverse */ + 0x0da, 0x012, /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5), Jul 12, 2015: From 0.66" OLED datasheet */ + 0x081, 0x0cf, /* set contrast control */ + 0x0d9, 0x022, /* pre-charge period 0x022/f1, from 0.66" OLED datasheet */ + 0x0db, 0x000, /* vcomh deselect level, from 0.66" OLED datasheet */ + + 0x02e, /* 2012-05-27: Deactivate scroll */ + 0x0a4, /* output ram to display */ + 0x0a6, /* none inverted normal display mode */ + 0x0af, /* display on */ + + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + + + + +static const uint8_t u8g_dev_ssd1306_64x48_data_start[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x010+2, /* set upper 4 bit of the col adr. to 0, 0.66" OLED starts with offset 32 */ + 0x000, /* set lower 4 bit of the col adr. to 4 */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0ae, /* display off */ + U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0af, /* display on */ + U8G_ESC_DLY(50), /* delay 50 ms */ + U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */ + U8G_ESC_END /* end of sequence */ +}; + +uint8_t u8g_dev_ssd1306_64x48_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) +{ + switch(msg) + { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_64x48_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_64x48_data_start); + u8g_WriteByte(u8g, dev, 0x0b0 | pb->p.page); /* select current page (SSD1306) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) + return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); + return 1; +} + + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_ssd1306_64x48_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) +{ + switch(msg) + { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_64x48_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_64x48_data_start); + u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2)); /* select current page (SSD1306) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_64x48_data_start); + u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2+1)); /* select current page (SSD1306) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_ssd1306_64x48_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_64x48_fn, U8G_COM_SW_SPI); +U8G_PB_DEV(u8g_dev_ssd1306_64x48_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_64x48_fn, U8G_COM_HW_SPI); +U8G_PB_DEV(u8g_dev_ssd1306_64x48_i2c, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ssd1306_64x48_fn, U8G_COM_SSD_I2C); + +uint8_t u8g_dev_ssd1306_64x48_2x_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_ssd1306_64x48_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_64x48_2x_buf}; +u8g_dev_t u8g_dev_ssd1306_64x48_2x_sw_spi = { u8g_dev_ssd1306_64x48_2x_fn, &u8g_dev_ssd1306_64x48_2x_pb, U8G_COM_SW_SPI }; +u8g_dev_t u8g_dev_ssd1306_64x48_2x_hw_spi = { u8g_dev_ssd1306_64x48_2x_fn, &u8g_dev_ssd1306_64x48_2x_pb, U8G_COM_HW_SPI }; +u8g_dev_t u8g_dev_ssd1306_64x48_2x_i2c = { u8g_dev_ssd1306_64x48_2x_fn, &u8g_dev_ssd1306_64x48_2x_pb, U8G_COM_SSD_I2C }; diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index 3f5de1d2..5f27755d 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI diff --git a/sys/arduino/U8gLogo/U8gLogo.pde b/sys/arduino/U8gLogo/U8gLogo.pde index 1c37f70e..3734b185 100644 --- a/sys/arduino/U8gLogo/U8gLogo.pde +++ b/sys/arduino/U8gLogo/U8gLogo.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 @@ -134,9 +140,6 @@ //U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) //U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) -//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); - //#define MINI_LOGO diff --git a/tools/release/arduino_new_lib_format/INSTALL.TXT b/tools/release/arduino_new_lib_format/INSTALL.TXT new file mode 100644 index 00000000..efcedd03 --- /dev/null +++ b/tools/release/arduino_new_lib_format/INSTALL.TXT @@ -0,0 +1,26 @@ + +U8GLIB +http://code.google.com/p/u8glib/ + +Install instructions for the Arduino environment. + + 1. Start Arduino IDE + 2. In the Arduino IDE, import the library from the "Add Library" Menu. + +Alternative install instructions for the Arduino environment. + + 1. Unzip u8glib_arduino_vX.XX.zip into the "libraries" folder of the + Arduino install directory + 2. Start Arduino IDE + +Install instructions for the Chipkit (Arduino) environment. + + 1. cd /libraries + 2. unzip u8glib_arduino_vX.XX.zip + 3. cd ///hardware/pic32/libraries + 4. again: u8glib_arduino_vX.XX.zip + 5. Open hardware/pic32/cores/pic32/Print.h + Remove line + #define BYTE 0 + from the file, use PRINT_BYTE instead of BYTE. + \ No newline at end of file diff --git a/tools/release/arduino_new_lib_format/create_release.sh b/tools/release/arduino_new_lib_format/create_release.sh new file mode 100755 index 00000000..5bfd5c53 --- /dev/null +++ b/tools/release/arduino_new_lib_format/create_release.sh @@ -0,0 +1,61 @@ +mkdir ../../../../U8glib_Arduino/examples/HelloWorld +mkdir ../../../../U8glib_Arduino/examples/Bitmap +mkdir ../../../../U8glib_Arduino/examples/Console +#mkdir ../../../../U8glib_Arduino/examples/Color +mkdir ../../../../U8glib_Arduino/examples/U8gLogo +mkdir ../../../../U8glib_Arduino/examples/Rotation +mkdir ../../../../U8glib_Arduino/examples/PrintTest +mkdir ../../../../U8glib_Arduino/examples/F +mkdir ../../../../U8glib_Arduino/examples/FPS +mkdir ../../../../U8glib_Arduino/examples/TextRotX +mkdir ../../../../U8glib_Arduino/examples/XBM +mkdir ../../../../U8glib_Arduino/examples/Chess +mkdir ../../../../U8glib_Arduino/examples/GraphicsTest +mkdir ../../../../U8glib_Arduino/examples/Menu +mkdir ../../../../U8glib_Arduino/examples/Scale +mkdir ../../../../U8glib_Arduino/examples/Touch4WSetup +mkdir ../../../../U8glib_Arduino/examples/Touch4WTest +mkdir ../../../../U8glib_Arduino/examples/A2Printer +#mkdir ../../../../U8glib_Arduino/utility +cp ../../../ChangeLog ./../../../../U8glib_Arduino/extras/. +# cp ../../../license.txt ./../../../../U8glib_Arduino/. +cp INSTALL.TXT ./../../../../U8glib_Arduino/extras/. +cp library.properties ../../../../U8glib_Arduino/. +cp ../../../cppsrc/*.cpp ./../../../../U8glib_Arduino/src/. +cp ../../../cppsrc/*.h ./../../../../U8glib_Arduino/src/. +sed -i 's|u8g.h|clib/u8g.h|g' ./../../../../U8glib_Arduino/src/U8glib.h +cp ../../../csrc/*.c ./../../../../U8glib_Arduino/src/clib/. +cp ../../../csrc/*.h ./../../../../U8glib_Arduino/src/clib/. +cp ../../../sfntsrc/*.c ./../../../../U8glib_Arduino/src/clib/. +cp ../../../sys/arduino/HelloWorld/HelloWorld.pde ./../../../../U8glib_Arduino/examples/HelloWorld/HelloWorld.ino +cp ../../../sys/arduino/Bitmap/Bitmap.pde ./../../../../U8glib_Arduino/examples/Bitmap/Bitmap.ino +cp ../../../sys/arduino/Console/Console.pde ./../../../../U8glib_Arduino/examples/Console/Console.ino +# cp ../../../sys/arduino/Color/*.pde ./../../../../U8glib_Arduino/examples/Color/. +cp ../../../sys/arduino/U8gLogo/U8gLogo.pde ./../../../../U8glib_Arduino/examples/U8gLogo/U8gLogo.ino +cp ../../../sys/arduino/Rotation/Rotation.pde ./../../../../U8glib_Arduino/examples/Rotation/Rotation.ino +cp ../../../sys/arduino/PrintTest/PrintTest.pde ./../../../../U8glib_Arduino/examples/PrintTest/PrintTest.ino +cp ../../../sys/arduino/F/F.pde ./../../../../U8glib_Arduino/examples/F/F.ino +cp ../../../sys/arduino/FPS/FPS.pde ./../../../../U8glib_Arduino/examples/FPS/FPS.ino +cp ../../../sys/arduino/TextRotX/TextRotX.pde ./../../../../U8glib_Arduino/examples/TextRotX/TextRotX.ino +cp ../../../sys/arduino/XBM/XBM.pde ./../../../../U8glib_Arduino/examples/XBM/XBM.ino +cp ../../../sys/arduino/Chess/Chess.pde ./../../../../U8glib_Arduino/examples/Chess/Chess.ino +cp ../../../sys/arduino/GraphicsTest/GraphicsTest.pde ./../../../../U8glib_Arduino/examples/GraphicsTest/GraphicsTest.ino +cp ../../../sys/arduino/Menu/Menu.pde ./../../../../U8glib_Arduino/examples/Menu/Menu.ino +cp ../../../sys/arduino/Scale/Scale.pde ./../../../../U8glib_Arduino/examples/Scale/Scale.ino +cp ../../../sys/arduino/Touch4WSetup/Touch4WSetup.pde ./../../../../U8glib_Arduino/examples/Touch4WSetup/Touch4WSetup.ino +cp ../../../sys/arduino/Touch4WTest/Touch4WTest.pde ./../../../../U8glib_Arduino/examples/Touch4WTest/Touch4WTest.ino +cp ../../../sys/arduino/A2Printer/A2Printer.pde ./../../../../U8glib_Arduino/examples/A2Printer/A2Printer.ino +# sed -i 's|U8glib.h|utility/U8glib.h|g' ./../../../../U8glib_Arduino/examples/HelloWorld/*.pde + + +# rename to .ino +# find . -name "*.pde" -exec /bin/sh -c 'f={}; mv ${f} ${f%.*}.ino' \; + +cd ../../../../Ucglib_Arduino + + +#chmod -R og=u libraries +#cd libraries +#zip -r ../u8glib_arduino_`../../print_release.sh`.zip * +#cd .. + diff --git a/tools/release/arduino_new_lib_format/library.properties b/tools/release/arduino_new_lib_format/library.properties new file mode 100644 index 00000000..b1249b64 --- /dev/null +++ b/tools/release/arduino_new_lib_format/library.properties @@ -0,0 +1,9 @@ +name=U8glib +version=1.18 +author=oliver +maintainer=oliver +sentence=A library for monochrome TFTs and OLEDs +paragraph=Supported display controller: SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SH1106, UC1601, UC1610, UC1611, UC1701, ST7565, ST7920, KS0108, LC7981, PCD8544, PCF8812, SBN1661, TLS8204, T6963. +category=Display +url=https://github.com/olikraus/u8glib +architectures=avr,sam \ No newline at end of file From f8e63a27fd4d46312475af35eb5cd603afde286b Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 12 Jul 2015 18:41:39 +0200 Subject: [PATCH 009/109] constructor updates for examples --- sys/arduino/Bitmap/Bitmap.pde | 8 +++++++- sys/arduino/Chess/Chess.pde | 9 +++++++-- sys/arduino/Console/Console.pde | 8 +++++++- sys/arduino/Contrast/Contrast.pde | 8 +++++++- sys/arduino/F/F.pde | 8 +++++++- sys/arduino/FPS/FPS.pde | 8 +++++++- sys/arduino/GraphicsTest/GraphicsTest.pde | 8 +++++++- sys/arduino/Menu/Menu.pde | 11 +++++++---- sys/arduino/Rotation/Rotation.pde | 8 +++++++- sys/arduino/Scale/Scale.pde | 8 +++++++- sys/arduino/TextRotX/TextRotX.pde | 8 +++++++- sys/arduino/Touch4WSetup/Touch4WSetup.pde | 8 +++++++- sys/arduino/Touch4WTest/Touch4WTest.pde | 8 +++++++- sys/arduino/XBM/XBM.pde | 8 +++++++- 14 files changed, 98 insertions(+), 18 deletions(-) diff --git a/sys/arduino/Bitmap/Bitmap.pde b/sys/arduino/Bitmap/Bitmap.pde index e9a30e2d..69fc5fa3 100644 --- a/sys/arduino/Bitmap/Bitmap.pde +++ b/sys/arduino/Bitmap/Bitmap.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Chess/Chess.pde b/sys/arduino/Chess/Chess.pde index 716fe07a..06707fbe 100644 --- a/sys/arduino/Chess/Chess.pde +++ b/sys/arduino/Chess/Chess.pde @@ -44,7 +44,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -96,6 +96,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -107,9 +110,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 @@ -135,7 +141,6 @@ //U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) //U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) -U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // DOGS102 shield configuration values uint8_t uiKeyPrev = 2; diff --git a/sys/arduino/Console/Console.pde b/sys/arduino/Console/Console.pde index 70e0e2f0..9b002ba4 100644 --- a/sys/arduino/Console/Console.pde +++ b/sys/arduino/Console/Console.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Contrast/Contrast.pde b/sys/arduino/Contrast/Contrast.pde index 5e4197ce..9d9027ae 100644 --- a/sys/arduino/Contrast/Contrast.pde +++ b/sys/arduino/Contrast/Contrast.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/F/F.pde b/sys/arduino/F/F.pde index 4393ddfe..9ff13bf4 100644 --- a/sys/arduino/F/F.pde +++ b/sys/arduino/F/F.pde @@ -45,7 +45,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -97,6 +97,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -108,9 +111,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/FPS/FPS.pde b/sys/arduino/FPS/FPS.pde index bcf93cd5..0c580d4e 100644 --- a/sys/arduino/FPS/FPS.pde +++ b/sys/arduino/FPS/FPS.pde @@ -123,7 +123,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -175,6 +175,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -186,9 +189,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index fc1c82fc..4913eceb 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -42,7 +42,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -94,6 +94,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -105,9 +108,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Menu/Menu.pde b/sys/arduino/Menu/Menu.pde index d8ab6f0d..01ca4a7e 100644 --- a/sys/arduino/Menu/Menu.pde +++ b/sys/arduino/Menu/Menu.pde @@ -42,12 +42,9 @@ #include "U8glib.h" -// setup u8g object, please remove comment from one of the following constructor calls -// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device - // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -99,6 +96,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -110,9 +110,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Rotation/Rotation.pde b/sys/arduino/Rotation/Rotation.pde index f4008138..9a317bd1 100644 --- a/sys/arduino/Rotation/Rotation.pde +++ b/sys/arduino/Rotation/Rotation.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Scale/Scale.pde b/sys/arduino/Scale/Scale.pde index 5fc5d331..61c4aa0d 100644 --- a/sys/arduino/Scale/Scale.pde +++ b/sys/arduino/Scale/Scale.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/TextRotX/TextRotX.pde b/sys/arduino/TextRotX/TextRotX.pde index 35278082..a94b04d1 100644 --- a/sys/arduino/TextRotX/TextRotX.pde +++ b/sys/arduino/TextRotX/TextRotX.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Touch4WSetup/Touch4WSetup.pde b/sys/arduino/Touch4WSetup/Touch4WSetup.pde index 9ce10e94..c0ed96f3 100644 --- a/sys/arduino/Touch4WSetup/Touch4WSetup.pde +++ b/sys/arduino/Touch4WSetup/Touch4WSetup.pde @@ -44,7 +44,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -96,6 +96,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -107,9 +110,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/Touch4WTest/Touch4WTest.pde b/sys/arduino/Touch4WTest/Touch4WTest.pde index ebe15838..afd642db 100644 --- a/sys/arduino/Touch4WTest/Touch4WTest.pde +++ b/sys/arduino/Touch4WTest/Touch4WTest.pde @@ -41,7 +41,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -93,6 +93,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -104,9 +107,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/arduino/XBM/XBM.pde b/sys/arduino/XBM/XBM.pde index 65b18318..a0ff72a0 100644 --- a/sys/arduino/XBM/XBM.pde +++ b/sys/arduino/XBM/XBM.pde @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -95,6 +95,9 @@ //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X32 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI +//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_64X48 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE); // I2C / TWI //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED) //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI @@ -106,9 +109,12 @@ //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) +//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 From cfc11956a7a76009f61c5e128d6e758f2a889cf6 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 12 Jul 2015 18:46:12 +0200 Subject: [PATCH 010/109] link update --- sys/arduino/A2Printer/A2Printer.pde | 2 +- sys/arduino/Bitmap/Bitmap.pde | 2 +- sys/arduino/Chess/Chess.pde | 2 +- sys/arduino/ChessDogm/Chess.pde | 2 +- sys/arduino/Color/Color.pde | 4 ++-- sys/arduino/Console/Console.pde | 2 +- sys/arduino/Contrast/Contrast.pde | 2 +- sys/arduino/F/F.pde | 2 +- sys/arduino/FPS/FPS.pde | 2 +- sys/arduino/GraphicsTest/GraphicsTest.pde | 2 +- sys/arduino/Hello0x0600/Hello0x0600.pde | 4 ++-- sys/arduino/HelloWorld/HelloWorld.pde | 2 +- sys/arduino/Menu/Menu.pde | 2 +- sys/arduino/PartialUpdate/PartialUpdate.pde | 2 +- sys/arduino/PrintTest/PrintTest.pde | 4 ++-- sys/arduino/Rotation/Rotation.pde | 2 +- sys/arduino/Scale/Scale.pde | 2 +- sys/arduino/ShowTGA/ShowTGA.pde | 4 ++-- sys/arduino/TextRotX/TextRotX.pde | 2 +- sys/arduino/Touch4WSetup/Touch4WSetup.pde | 2 +- sys/arduino/Touch4WTest/Touch4WTest.pde | 2 +- sys/arduino/TouchPanel4W/TouchPanel4W.pde | 4 ++-- sys/arduino/U8gLogo/U8gLogo.pde | 2 +- sys/arduino/XBM/XBM.pde | 2 +- sys/arduino/issue231/issue231_ino.pde | 2 +- 25 files changed, 30 insertions(+), 30 deletions(-) diff --git a/sys/arduino/A2Printer/A2Printer.pde b/sys/arduino/A2Printer/A2Printer.pde index d40bd791..b101f995 100644 --- a/sys/arduino/A2Printer/A2Printer.pde +++ b/sys/arduino/A2Printer/A2Printer.pde @@ -5,7 +5,7 @@ Special example code for the A2 Mciro Printer (https://www.sparkfun.com/products/10438) - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2013, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Bitmap/Bitmap.pde b/sys/arduino/Bitmap/Bitmap.pde index 69fc5fa3..fbe18ce3 100644 --- a/sys/arduino/Bitmap/Bitmap.pde +++ b/sys/arduino/Bitmap/Bitmap.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2011, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Chess/Chess.pde b/sys/arduino/Chess/Chess.pde index 06707fbe..58558437 100644 --- a/sys/arduino/Chess/Chess.pde +++ b/sys/arduino/Chess/Chess.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/ChessDogm/Chess.pde b/sys/arduino/ChessDogm/Chess.pde index f40e4a1d..10d7a443 100644 --- a/sys/arduino/ChessDogm/Chess.pde +++ b/sys/arduino/ChessDogm/Chess.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Color/Color.pde b/sys/arduino/Color/Color.pde index a389e322..e347cbd8 100644 --- a/sys/arduino/Color/Color.pde +++ b/sys/arduino/Color/Color.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/Console/Console.pde b/sys/arduino/Console/Console.pde index 9b002ba4..b04274b3 100644 --- a/sys/arduino/Console/Console.pde +++ b/sys/arduino/Console/Console.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2011, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Contrast/Contrast.pde b/sys/arduino/Contrast/Contrast.pde index 9d9027ae..e35429a4 100644 --- a/sys/arduino/Contrast/Contrast.pde +++ b/sys/arduino/Contrast/Contrast.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/F/F.pde b/sys/arduino/F/F.pde index 9ff13bf4..d631dbac 100644 --- a/sys/arduino/F/F.pde +++ b/sys/arduino/F/F.pde @@ -9,7 +9,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/FPS/FPS.pde b/sys/arduino/FPS/FPS.pde index 0c580d4e..89339a62 100644 --- a/sys/arduino/FPS/FPS.pde +++ b/sys/arduino/FPS/FPS.pde @@ -5,7 +5,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 4913eceb..b5d87fb5 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -5,7 +5,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Hello0x0600/Hello0x0600.pde b/sys/arduino/Hello0x0600/Hello0x0600.pde index 4f4ebf0c..24a02603 100644 --- a/sys/arduino/Hello0x0600/Hello0x0600.pde +++ b/sys/arduino/Hello0x0600/Hello0x0600.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. @@ -42,7 +42,7 @@ #include "U8glib.h" // setup u8g object, please remove comment from one of the following constructor calls -// IMPORTANT NOTE: The complete list of supported devices is here: http://code.google.com/p/u8glib/wiki/device +// IMPORTANT NOTE: The complete list of supported devices is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index 5f27755d..209eed66 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Menu/Menu.pde b/sys/arduino/Menu/Menu.pde index 01ca4a7e..bf14fa9f 100644 --- a/sys/arduino/Menu/Menu.pde +++ b/sys/arduino/Menu/Menu.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/PartialUpdate/PartialUpdate.pde b/sys/arduino/PartialUpdate/PartialUpdate.pde index 06e0e29d..87b9725d 100644 --- a/sys/arduino/PartialUpdate/PartialUpdate.pde +++ b/sys/arduino/PartialUpdate/PartialUpdate.pde @@ -9,7 +9,7 @@ U8GLIB_ST7920_128X64 u8g(18, 16, 17, U8G_PIN_NONE); // SPI Com: //U8GLIB_ST7920_192X32 u8g(18, 16, 17, U8G_PIN_NONE); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 /* - the pb object is (usually) the device name from http://code.google.com/p/u8glib/wiki/device + the pb object is (usually) the device name from https://github.com/olikraus/u8glib/wiki/device with "_pb" added at the end. */ extern u8g_pb_t u8g_dev_st7920_192x32_sw_spi_pb; diff --git a/sys/arduino/PrintTest/PrintTest.pde b/sys/arduino/PrintTest/PrintTest.pde index edc9afa8..6a64b185 100644 --- a/sys/arduino/PrintTest/PrintTest.pde +++ b/sys/arduino/PrintTest/PrintTest.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. @@ -43,7 +43,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/Rotation/Rotation.pde b/sys/arduino/Rotation/Rotation.pde index 9a317bd1..2c885ef7 100644 --- a/sys/arduino/Rotation/Rotation.pde +++ b/sys/arduino/Rotation/Rotation.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Scale/Scale.pde b/sys/arduino/Scale/Scale.pde index 61c4aa0d..27e3944b 100644 --- a/sys/arduino/Scale/Scale.pde +++ b/sys/arduino/Scale/Scale.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/ShowTGA/ShowTGA.pde b/sys/arduino/ShowTGA/ShowTGA.pde index 92d07f99..0caac1c6 100644 --- a/sys/arduino/ShowTGA/ShowTGA.pde +++ b/sys/arduino/ShowTGA/ShowTGA.pde @@ -11,7 +11,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. @@ -49,7 +49,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/TextRotX/TextRotX.pde b/sys/arduino/TextRotX/TextRotX.pde index a94b04d1..5cec6a44 100644 --- a/sys/arduino/TextRotX/TextRotX.pde +++ b/sys/arduino/TextRotX/TextRotX.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Touch4WSetup/Touch4WSetup.pde b/sys/arduino/Touch4WSetup/Touch4WSetup.pde index c0ed96f3..0f430419 100644 --- a/sys/arduino/Touch4WSetup/Touch4WSetup.pde +++ b/sys/arduino/Touch4WSetup/Touch4WSetup.pde @@ -8,7 +8,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/Touch4WTest/Touch4WTest.pde b/sys/arduino/Touch4WTest/Touch4WTest.pde index afd642db..b3f0c9fd 100644 --- a/sys/arduino/Touch4WTest/Touch4WTest.pde +++ b/sys/arduino/Touch4WTest/Touch4WTest.pde @@ -5,7 +5,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/TouchPanel4W/TouchPanel4W.pde b/sys/arduino/TouchPanel4W/TouchPanel4W.pde index 5aa9a4b6..1795d49c 100644 --- a/sys/arduino/TouchPanel4W/TouchPanel4W.pde +++ b/sys/arduino/TouchPanel4W/TouchPanel4W.pde @@ -5,7 +5,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. @@ -41,7 +41,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/U8gLogo/U8gLogo.pde b/sys/arduino/U8gLogo/U8gLogo.pde index 3734b185..41b3106f 100644 --- a/sys/arduino/U8gLogo/U8gLogo.pde +++ b/sys/arduino/U8gLogo/U8gLogo.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/XBM/XBM.pde b/sys/arduino/XBM/XBM.pde index a0ff72a0..c0227c45 100644 --- a/sys/arduino/XBM/XBM.pde +++ b/sys/arduino/XBM/XBM.pde @@ -7,7 +7,7 @@ >>> Before compiling: Please remove comment from the constructor of the >>> connected graphics display (see below). - Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ + Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/ Copyright (c) 2012, olikraus@gmail.com All rights reserved. diff --git a/sys/arduino/issue231/issue231_ino.pde b/sys/arduino/issue231/issue231_ino.pde index 5d699a5f..877d5a86 100644 --- a/sys/arduino/issue231/issue231_ino.pde +++ b/sys/arduino/issue231/issue231_ino.pde @@ -2,7 +2,7 @@ // setup u8g object, please remove comment from one of the following constructor calls // IMPORTANT NOTE: The following list is incomplete. The complete list of supported -// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device +// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 From a9a75898dce45eb119c2ab2671feba3d167388f3 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 12 Jul 2015 21:54:45 +0200 Subject: [PATCH 011/109] added INPUT_PULLUP, github issue #309 --- sys/arduino/Chess/Chess.pde | 30 ++- sys/arduino/Chess/Makefile.105.uno | 285 +++++++++++++++++++++++++++++ sys/arduino/Menu/Makefile.105.uno | 285 +++++++++++++++++++++++++++++ sys/arduino/Menu/Menu.pde | 16 +- 4 files changed, 589 insertions(+), 27 deletions(-) create mode 100644 sys/arduino/Chess/Makefile.105.uno create mode 100644 sys/arduino/Menu/Makefile.105.uno diff --git a/sys/arduino/Chess/Chess.pde b/sys/arduino/Chess/Chess.pde index 58558437..af85c41b 100644 --- a/sys/arduino/Chess/Chess.pde +++ b/sys/arduino/Chess/Chess.pde @@ -55,7 +55,7 @@ //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 @@ -143,17 +143,17 @@ // DOGS102 shield configuration values -uint8_t uiKeyPrev = 2; -uint8_t uiKeyNext = 4; -uint8_t uiKeySelect = 5; -uint8_t uiKeyBack = 3; +// uint8_t uiKeyPrev = 2; +// uint8_t uiKeyNext = 4; +// uint8_t uiKeySelect = 5; +// uint8_t uiKeyBack = 3; // DOGM128-Shield configuration values // DOGXL60-Shield configuration values -//uint8_t uiKeyPrev = 7; -//uint8_t uiKeyNext = 3; -//uint8_t uiKeySelect = 2; -//uint8_t uiKeyBack = 8; +uint8_t uiKeyPrev = 7; +uint8_t uiKeyNext = 3; +uint8_t uiKeySelect = 2; +uint8_t uiKeyBack = 8; uint8_t uiKeyCodeFirst = CHESS_KEY_NONE; uint8_t uiKeyCodeSecond = CHESS_KEY_NONE; @@ -163,14 +163,10 @@ uint8_t uiKeyCode = CHESS_KEY_NONE; void uiSetup(void) { // configure input keys #if defined(ARDUINO) - pinMode(uiKeyPrev, INPUT); // set pin to input - digitalWrite(uiKeyPrev, HIGH); // turn on pullup resistors - pinMode(uiKeyNext, INPUT); // set pin to input - digitalWrite(uiKeyNext, HIGH); // turn on pullup resistors - pinMode(uiKeySelect, INPUT); // set pin to input - digitalWrite(uiKeySelect, HIGH); // turn on pullup resistors - pinMode(uiKeyBack, INPUT); // set pin to input - digitalWrite(uiKeyBack, HIGH); // turn on pullup resistors + pinMode(uiKeyPrev, INPUT_PULLUP); // set pin to input + pinMode(uiKeyNext, INPUT_PULLUP); // set pin to input + pinMode(uiKeySelect, INPUT_PULLUP); // set pin to input + pinMode(uiKeyBack, INPUT_PULLUP); // set pin to input #endif } diff --git a/sys/arduino/Chess/Makefile.105.uno b/sys/arduino/Chess/Makefile.105.uno new file mode 100644 index 00000000..bbf951d8 --- /dev/null +++ b/sys/arduino/Chess/Makefile.105.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/sys/arduino/Menu/Makefile.105.uno b/sys/arduino/Menu/Makefile.105.uno new file mode 100644 index 00000000..bbf951d8 --- /dev/null +++ b/sys/arduino/Menu/Makefile.105.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/sys/arduino/Menu/Menu.pde b/sys/arduino/Menu/Menu.pde index bf14fa9f..ba0479ba 100644 --- a/sys/arduino/Menu/Menu.pde +++ b/sys/arduino/Menu/Menu.pde @@ -55,7 +55,7 @@ //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 @@ -169,14 +169,10 @@ uint8_t uiKeyCode = KEY_NONE; void uiSetup(void) { // configure input keys - pinMode(uiKeyPrev, INPUT); // set pin to input - digitalWrite(uiKeyPrev, HIGH); // turn on pullup resistors - pinMode(uiKeyNext, INPUT); // set pin to input - digitalWrite(uiKeyNext, HIGH); // turn on pullup resistors - pinMode(uiKeySelect, INPUT); // set pin to input - digitalWrite(uiKeySelect, HIGH); // turn on pullup resistors - pinMode(uiKeyBack, INPUT); // set pin to input - digitalWrite(uiKeyBack, HIGH); // turn on pullup resistors + pinMode(uiKeyPrev, INPUT_PULLUP); // set pin to input with pullup + pinMode(uiKeyNext, INPUT_PULLUP); // set pin to input with pullup + pinMode(uiKeySelect, INPUT_PULLUP); // set pin to input with pullup + pinMode(uiKeyBack, INPUT_PULLUP); // set pin to input with pullup } void uiStep(void) { @@ -200,7 +196,7 @@ void uiStep(void) { #define MENU_ITEMS 4 -char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" }; +const char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" }; uint8_t menu_current = 0; uint8_t menu_redraw_required = 0; From add401abf92c90bf4d6aad478c696206777cb0db Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 14 Jul 2015 19:05:11 +0200 Subject: [PATCH 012/109] v1.18 --- sys/arduino/Chess/Chess.pde | 2 +- sys/arduino/GraphicsTest/GraphicsTest.pde | 2 -- sys/arduino/Menu/Menu.pde | 2 +- .../arduino_new_lib_format/create_release.sh | 13 +++++++++++-- tools/release/print_release.sh | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/sys/arduino/Chess/Chess.pde b/sys/arduino/Chess/Chess.pde index af85c41b..bb6ab954 100644 --- a/sys/arduino/Chess/Chess.pde +++ b/sys/arduino/Chess/Chess.pde @@ -55,7 +55,7 @@ //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index b5d87fb5..456f631a 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -139,8 +139,6 @@ //U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) //U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED) -U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); - void u8g_prepare(void) { u8g.setFont(u8g_font_6x10); u8g.setFontRefHeightExtendedText(); diff --git a/sys/arduino/Menu/Menu.pde b/sys/arduino/Menu/Menu.pde index ba0479ba..edda1a0b 100644 --- a/sys/arduino/Menu/Menu.pde +++ b/sys/arduino/Menu/Menu.pde @@ -55,7 +55,7 @@ //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 diff --git a/tools/release/arduino_new_lib_format/create_release.sh b/tools/release/arduino_new_lib_format/create_release.sh index 5bfd5c53..fccc7954 100755 --- a/tools/release/arduino_new_lib_format/create_release.sh +++ b/tools/release/arduino_new_lib_format/create_release.sh @@ -51,11 +51,20 @@ cp ../../../sys/arduino/A2Printer/A2Printer.pde ./../../../../U8glib_Arduino/exa # rename to .ino # find . -name "*.pde" -exec /bin/sh -c 'f={}; mv ${f} ${f%.*}.ino' \; -cd ../../../../Ucglib_Arduino +cd ../../../../U8glib_Arduino #chmod -R og=u libraries #cd libraries #zip -r ../u8glib_arduino_`../../print_release.sh`.zip * -#cd .. +#cd ..cd ../../../../Ucglib_Arduino + +git commit -a -m `../u8glib/tools/release/print_release.sh` +git push + +echo now create a release in gitub for U8glib_Arduino, tag/namex = v1.xx +# Relases in github: +# Tag: 1.02pre3 +# Release name: 1.02pre3 + diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index 68932f89..c712c764 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1 +1 @@ -echo -n "v1.18pre1" +echo -n "v1.18" From df8b99bfcee78b641586a1fd52adc978b994442a Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 14 Jul 2015 19:09:11 +0200 Subject: [PATCH 013/109] v1.18.1 --- ChangeLog | 3 ++- tools/release/print_release.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1ef2c78d..32f2828b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -154,10 +154,11 @@ u8glib ChangeLog * 400KHz option for I2C with U8G_I2C_OPT_FAST available for Due and Uno (Issue 303) * I2C support for Arduino Due. 100KHz/400KHz, TWI & TWI1, ACK will be ignored (issue 285) * Unifont update (Issue 297) -2015-xx-xx v1.18 Oliver Kraus +2015-07-14 v1.18 Oliver Kraus * Fixed contrast assignment for SSD1309 and UC1611 * Fixed bug in u8g_DrawLine(), Github issue 343 * Fixed bug in u8g_DrawStr90P(), Github issue 331 + * Support for SSD1306 with 64x48 pixel diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index c712c764..1da561e0 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1 +1 @@ -echo -n "v1.18" +echo -n "v1.18.1" From b37543e20ed31f0a923c3caddb631c1427bf6dda Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 15 Jul 2015 23:51:55 +0200 Subject: [PATCH 014/109] lib manager --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c624a7fe..e9026262 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ A graphics library with support for many different monochrome displays. Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) * [Gallery](https://github.com/olikraus/u8glib/wiki/gallery) + * Latest version of U8glib for Arduino is available in the Library Manager * [Bintray](https://bintray.com/olikraus/u8glib) download links: * [U8glib for Arduino](https://bintray.com/olikraus/u8glib/Arduino) * [U8glib for AVR](https://bintray.com/olikraus/u8glib/AVR) From 554c97c778cb9e24d97aafa090fb92d6a173cf38 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 15 Jul 2015 23:55:27 +0200 Subject: [PATCH 015/109] github --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e9026262..0a4b18f7 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Left: NHD-2.7-12864 OLED (SSD1325), right: EA DOGS102 LCD (UC1701) * [Gallery](https://github.com/olikraus/u8glib/wiki/gallery) * Latest version of U8glib for Arduino is available in the Library Manager + * [Download Arduino Version from Github](https://github.com/olikraus/U8glib_Arduino/releases/latest) * [Bintray](https://bintray.com/olikraus/u8glib) download links: * [U8glib for Arduino](https://bintray.com/olikraus/u8glib/Arduino) * [U8glib for AVR](https://bintray.com/olikraus/u8glib/AVR) From 6c133d376d09aefe6cb1a83c8e3c8c2d21380e03 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 1 Aug 2015 10:41:52 +0200 Subject: [PATCH 016/109] change log --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 32f2828b..1bcd8e1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -159,7 +159,8 @@ u8glib ChangeLog * Fixed bug in u8g_DrawLine(), Github issue 343 * Fixed bug in u8g_DrawStr90P(), Github issue 331 * Support for SSD1306 with 64x48 pixel +2015-xx-xx v1.19 + - \ No newline at end of file From da22af637fd0527945d798373deb54db1401c903 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 2 Aug 2015 00:12:06 +0200 Subject: [PATCH 017/109] ESP8266 header file fixes --- csrc/u8g.h | 28 ++++++++++++++----- .../arduino_new_lib_format/create_release.sh | 9 +++--- tools/release/print_release.sh | 3 +- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/csrc/u8g.h b/csrc/u8g.h index ecc57778..d36cb029 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -80,10 +80,14 @@ extern "C" { # if defined(__MSPGCC__) /* mspgcc does not have .progmem sections. Use -fdata-sections. */ # define U8G_FONT_SECTION(name) -# endif +# endif # if defined(__AVR__) # define U8G_FONT_SECTION(name) U8G_SECTION(".progmem." name) # endif +# if defined(__XTENSA__) +//# define U8G_FONT_SECTION(name) U8G_SECTION(".irom.text." name) +# define U8G_FONT_SECTION(name) U8G_SECTION(".irom0.text" ) +# endif #else # define U8G_NOINLINE # define U8G_PURE @@ -120,16 +124,26 @@ typedef uint8_t PROGMEM u8g_pgm_uint8_t; typedef uint8_t u8g_fntpgm_uint8_t; #define u8g_pgm_read(adr) pgm_read_byte_near(adr) #define U8G_PSTR(s) ((u8g_pgm_uint8_t *)PSTR(s)) +#endif -#else - -#define U8G_PROGMEM -#define PROGMEM +#if defined(__XTENSA__) +# ifndef PROGMEM +# define PROGMEM __attribute__ ((section (".irom0.text"))) +# endif +# define U8G_PROGMEM PROGMEM typedef uint8_t u8g_pgm_uint8_t; typedef uint8_t u8g_fntpgm_uint8_t; -#define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr)) -#define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s)) +# define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr)) +# define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s)) +#endif +#ifndef U8G_PROGMEM +# define U8G_PROGMEM +# define PROGMEM +typedef uint8_t u8g_pgm_uint8_t; +typedef uint8_t u8g_fntpgm_uint8_t; +# define u8g_pgm_read(adr) (*(const u8g_pgm_uint8_t *)(adr)) +# define U8G_PSTR(s) ((u8g_pgm_uint8_t *)(s)) #endif /*===============================================================*/ diff --git a/tools/release/arduino_new_lib_format/create_release.sh b/tools/release/arduino_new_lib_format/create_release.sh index fccc7954..04dcc218 100755 --- a/tools/release/arduino_new_lib_format/create_release.sh +++ b/tools/release/arduino_new_lib_format/create_release.sh @@ -53,16 +53,15 @@ cp ../../../sys/arduino/A2Printer/A2Printer.pde ./../../../../U8glib_Arduino/exa cd ../../../../U8glib_Arduino +ver=`../u8glib/tools/release/print_release.sh` + +sed -i -e "s/version=.*/version=${ver}/" library.properties -#chmod -R og=u libraries -#cd libraries -#zip -r ../u8glib_arduino_`../../print_release.sh`.zip * -#cd ..cd ../../../../Ucglib_Arduino git commit -a -m `../u8glib/tools/release/print_release.sh` git push -echo now create a release in gitub for U8glib_Arduino, tag/namex = v1.xx +echo now create a release in gitub for U8glib_Arduino, tag/namex = ${ver] # Relases in github: # Tag: 1.02pre3 # Release name: 1.02pre3 diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index 1da561e0..a0769252 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1 +1,2 @@ -echo -n "v1.18.1" +# without 'v' prefix +echo -n "1.18.1" From a288d8413779ee4fbc64f1c6b46e6ad4037e4c2c Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 9 Aug 2015 17:23:59 +0200 Subject: [PATCH 018/109] added 165 makefile --- sys/arduino/HelloWorld/Makefile.165.uno | 285 ++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 sys/arduino/HelloWorld/Makefile.165.uno diff --git a/sys/arduino/HelloWorld/Makefile.165.uno b/sys/arduino/HelloWorld/Makefile.165.uno new file mode 100644 index 00000000..bbf951d8 --- /dev/null +++ b/sys/arduino/HelloWorld/Makefile.165.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + From 22598046b79e88d29f4bc625fca84d4505121354 Mon Sep 17 00:00:00 2001 From: christof65 Date: Tue, 11 Aug 2015 14:12:40 +0200 Subject: [PATCH 019/109] PSoC 5 support via parallel interface --- csrc/u8g.h | 7 ++ csrc/u8g_com_psoc5_ssd_hw_parallel.c | 107 ++++++++++++++++++++++++ csrc/u8g_delay.c | 8 ++ csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c | 1 + 4 files changed, 123 insertions(+) create mode 100644 csrc/u8g_com_psoc5_ssd_hw_parallel.c diff --git a/csrc/u8g.h b/csrc/u8g.h index d36cb029..897388cf 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -415,6 +415,7 @@ extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_hw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_bw_parallel; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_sw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_hw_spi; +extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_gr_parallel; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_sw_spi; extern u8g_dev_t u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi; @@ -703,6 +704,8 @@ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */ +uint8_t u8g_com_psoc5_ssd_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_spi.c */ +uint8_t u8g_com_psoc5_ssd_hw_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_parallel.c */ /* Translation of system specific com drives to generic com names @@ -856,6 +859,10 @@ defined(__18CXX) || defined(__PIC32MX) #define U8G_COM_SSD_I2C u8g_com_raspberrypi_ssd_i2c_fn #endif #endif +#if defined(U8G_CYPRESS_PSOC5) +#define U8G_COM_HW_SPI u8g_com_psoc5_ssd_hw_spi_fn +#define U8G_COM_FAST_PARALLEL u8g_com_psoc5_ssd_hw_parallel_fn +#endif #ifndef U8G_COM_SSD_I2C #define U8G_COM_SSD_I2C u8g_com_null_fn diff --git a/csrc/u8g_com_psoc5_ssd_hw_parallel.c b/csrc/u8g_com_psoc5_ssd_hw_parallel.c new file mode 100644 index 00000000..668c61ba --- /dev/null +++ b/csrc/u8g_com_psoc5_ssd_hw_parallel.c @@ -0,0 +1,107 @@ +/* + + u8g_com_psoc5_ssd_hw_parallel.c + + com interface for Cypress PSoC5 and the SSDxxxx chip variant + I2C protocol + + Universal 8bit Graphics Library + + Copyright (c) 2015, olikraus@gmail.com, schmidt.ronny@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + +#include "u8g.h" + +#if defined(U8G_CYPRESS_PSOC5) + +#include + +static uint8 dc = 0; // need to store whether next write is data or command + +uint8_t u8g_com_psoc5_ssd_hw_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_STOP: + // stop the device + GraphicLCDIntf_Stop(); + break; + + case U8G_COM_MSG_INIT: + // init hardware interfaces, timers, gpios, ... + GraphicLCDIntf_Init(); + break; + + case U8G_COM_MSG_ADDRESS: + // switch from cmd (arg_val = 0) to data mode (arg_val = 1) or vice versa + dc = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + /* done by the hardware */ + break; + + case U8G_COM_MSG_RESET: + // toggle the reset pin of the display by value in arg_val + nRES_Write(0); + u8g_10MicroDelay(); + nRES_Write(1); + break; + + case U8G_COM_MSG_WRITE_BYTE: + // write byte to the device + GraphicLCDIntf_Write8(dc, arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: + case U8G_COM_MSG_WRITE_SEQ_P: + { + // write a sequence of bytes to the device + register uint8_t *ptr = arg_ptr; + while (arg_val-- > 0) + { + GraphicLCDIntf_Write8(dc, *ptr++); + } + } + break; + + + } + return 1; +} + +#else + +uint8_t u8g_com_psoc5_ssd_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + return 1; +} + +#endif diff --git a/csrc/u8g_delay.c b/csrc/u8g_delay.c index d38e02a5..01401e53 100644 --- a/csrc/u8g_delay.c +++ b/csrc/u8g_delay.c @@ -71,6 +71,8 @@ # define USE_AVR_DELAY #elif defined(__18CXX) # define USE_PIC18_DELAY +#elif defined(U8G_CYPRESS_PSOC5) +#define USE_PSOC5_DELAY #elif defined(__arm__) /* do not define anything, all procedures are expected to be defined outside u8glib */ @@ -293,6 +295,12 @@ void u8g_10MicroDelay(void) __delay_cycles(F_CPU/100000UL); } #endif +#if defined USE_PSOC5_DELAY + #include + void u8g_Delay(uint16_t val) {CyDelay(val);}; + void u8g_MicroDelay(void) {CyDelay(1);}; + void u8g_10MicroDelay(void) {CyDelay(10);}; +#endif /*== Any other systems: Dummy Delay ==*/ diff --git a/csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c b/csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c index 9ac51f2f..0667ca3c 100644 --- a/csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c +++ b/csrc/u8g_dev_ssd1325_nhd27oled_gr_new.c @@ -220,6 +220,7 @@ static uint8_t u8g_dev_ssd1325_nhd27oled_2x_gr_fn(u8g_t *u8g, u8g_dev_t *dev, ui U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_sw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_SW_SPI); U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_hw_spi , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_HW_SPI); +U8G_PB_DEV(u8g_dev_ssd1325_nhd27oled_gr_parallel , WIDTH, HEIGHT, 4, u8g_dev_ssd1325_nhd27oled_gr_fn, U8G_COM_FAST_PARALLEL); uint8_t u8g_dev_ssd1325_nhd27oled_2x_buf[WIDTH*2] U8G_NOCOMMON ; u8g_pb_t u8g_dev_ssd1325_nhd27oled_2x_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1325_nhd27oled_2x_buf}; From 036cd7660d27e25b7cd525c3e2f987a32eff7500 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 00:14:34 +0200 Subject: [PATCH 020/109] u8g2 --- u8g2/csrc/u8g2.c | 31 +++ u8g2/csrc/u8g2.h | 266 +++++++++++++++++++++++ u8g2/csrc/u8g2_byte.c | 27 +++ u8g2/csrc/u8g2_cad.c | 241 +++++++++++++++++++++ u8g2/csrc/u8g2_d_stdio.c | 158 ++++++++++++++ u8g2/csrc/u8g2_d_uc1701_dogs102.c | 131 ++++++++++++ u8g2/csrc/u8g2_display.c | 51 +++++ u8g2/sys/arduino/test/Makefile.165.uno | 285 +++++++++++++++++++++++++ u8g2/sys/arduino/test/test.ino | 153 +++++++++++++ u8g2/sys/stdio/Makefile | 15 ++ u8g2/sys/stdio/test.c | 15 ++ 11 files changed, 1373 insertions(+) create mode 100644 u8g2/csrc/u8g2.c create mode 100644 u8g2/csrc/u8g2.h create mode 100644 u8g2/csrc/u8g2_byte.c create mode 100644 u8g2/csrc/u8g2_cad.c create mode 100644 u8g2/csrc/u8g2_d_stdio.c create mode 100644 u8g2/csrc/u8g2_d_uc1701_dogs102.c create mode 100644 u8g2/csrc/u8g2_display.c create mode 100644 u8g2/sys/arduino/test/Makefile.165.uno create mode 100644 u8g2/sys/arduino/test/test.ino create mode 100644 u8g2/sys/stdio/Makefile create mode 100644 u8g2/sys/stdio/test.c diff --git a/u8g2/csrc/u8g2.c b/u8g2/csrc/u8g2.c new file mode 100644 index 00000000..5f1b8f42 --- /dev/null +++ b/u8g2/csrc/u8g2.c @@ -0,0 +1,31 @@ +/* + + u8g2.c + +*/ + + +#include "u8g2.h" + +uint8_t u8g2_dummy_cb(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + /* the dummy callback will not handle any message and will fail for all messages */ + return 0; +} + + +/* + Description: + Setup u8g2 + Args: + u8g2 An empty u8g2 structure +*/ +void u8g2_Init(u8g2_t *u8g2) +{ + u8g2->display_info = NULL; + u8g2->display_cb = u8g2_dummy_cb; + u8g2->cad_cb = u8g2_dummy_cb; + u8g2->byte_cb = u8g2_dummy_cb; + u8g2->gpio_and_delay_cb = u8g2_dummy_cb; +} + diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h new file mode 100644 index 00000000..1afd4f9a --- /dev/null +++ b/u8g2/csrc/u8g2.h @@ -0,0 +1,266 @@ +/* + u8g2.h + + + + + U8glib has several layers. Each layer is implemented with a callback function. + This callback function handels the messages for the layer. + + The topmost level is the display layer. It includes the following messages: + + U8G2_MSG_DISPLAY_INIT + U8G2_MSG_DISPLAY_POWER_DOWN + U8G2_MSG_DISPLAY_POWER_UP + U8G2_MSG_DISPLAY_SET_CONTRAST + U8G2_MSG_DISPLAY_DRAW_TILE + U8G2_MSG_DISPLAY_GET_LAYOUT + + A display driver may decided to breakdown these messages to a lower level interface or + implement this functionality directly. + + + One layer is the Command/Arg/Data interface. It can be used by the display layer + to communicate with the display hardware. + U8G2_MSG_CAD_INIT + U8G2_MSG_CAD_SEND_CMD + U8G2_MSG_CAD_SEND_ARG + U8G2_MSG_CAD_SEND_DATA + U8G2_MSG_CAD_RESET + U8G2_MSG_CAD_CHIP_SELECT + U8G2_MSG_CAD_SET_I2C_ADR + U8G2_MSG_CAD_SET_DEVICE + + The byte interface is there to send 1 byte (8 bits) to the display hardware. + This layer depends on the hardware of a microcontroller, if a specific hardware + should be used (I2C or SPI). + If this interface is implemented via software, it may use the GPIO level for sending + bytes. + U8G2_MSG_BYTE_INIT + U8G2_MSG_BYTE_SEND 30 + U8G2_MSG_BYTE_SET_DC 31 + U8G2_MSG_BYTE_RESET + U8G2_MSG_BYTE_CHIP_SELECT + U8G2_MSG_BYTE_SET_I2C_ADR + U8G2_MSG_BYTE_SET_DEVICE + + GPIO and Delay + U8G2_MSG_GPIO_INIT + U8G2_MSG_DELAY_MILLI + U8G2_MSG_DELAY_10MICRO + U8G2_MSG_DELAY_100NANO + +*/ + +#ifndef _U8G2_H +#define _U8G2_H + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct u8g2_struct u8g2_t; +typedef struct u8g2_display_info_struct u8g2_display_info_t; + +typedef struct u8g2_tile_struct u8g2_tile_t; + + + +typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); + + +//struct u8g2_mcd_struct +//{ +// u8g2_msg_cb cb; /* current callback function */ +// u8g2_t *u8g2; /* pointer to the u8g2 parent to minimize the number of args */ +// u8g2_mcd_t *next; +//}; + +struct u8g2_tile_struct +{ + uint8_t *tile_ptr; /* pointer to one or more tiles */ + uint8_t cnt; /* number of tiles */ + uint8_t x_pos; /* tile x position */ + uint8_t y_pos; /* tile x position */ +}; + + +struct u8g2_display_info_struct +{ + /* == general == */ + + uint8_t post_chip_enable_wait_ns; /* UC1601: 5ns */ + uint8_t pre_chip_disable_wait_ns; /* UC1601: 5ns */ + uint8_t reset_pulse_width_ms; /* UC1601: 0.003ms --> 1ms */ + uint8_t post_reset_wait_ms; /* UC1601: 6ms */ + + + /* == SPI interface == */ + + /* after SDA has been applied, wait this much time for the SCK data takeover edge */ + uint8_t sda_setup_time_ns; /* UC1601: 12ns */ + /* the pulse width of the the clock signal, cycle time is twice this value */ + /* max freq is 1/(2*sck_pulse_width_ns) */ + uint8_t sck_pulse_width_ns; /* UC1601: 15ns */ + /* data takeover edge: 0=falling edge, 1=rising edge*/ + /* initial default value for sck is low (0) for falling edge and high for rising edge */ + uint8_t sck_takeover_edge; /* UC1601: rising edge (1) */ + + /* == I2C == */ + uint8_t i2c_bus_clock_100kHz; /* UC1601: 1000000000/275 = 37 *100k */ + + + /* == 8 bit interface == */ + + /* how long to wait after all data line are set */ + uint8_t data_setup_time_ns; /* UC1601: 30ns */ + /* write enable pulse width */ + uint8_t write_pulse_width_ns; /* UC1601: 40ns */ +}; + +struct u8g2_struct +{ + //u8g2_t *u8g2_root; /* root of the message call chain */ + u8g2_display_info_t *display_info; + u8g2_msg_cb display_cb; + u8g2_msg_cb cad_cb; + u8g2_msg_cb byte_cb; + u8g2_msg_cb gpio_and_delay_cb; +}; + + +/*==========================================*/ +/* Display Interface */ + +/* + Name: U8G2_MSG_DISPLAY_INIT + Args: None + Tasks: + 1) setup u8g2->display_info + 2) put interface into default state + 3) execute display reset (gpio interface) + 4) send setup sequence to display, do not activate display, "power on" will follow +*/ +#define U8G2_MSG_DISPLAY_INIT 10 + +/* no args */ +#define U8G2_MSG_DISPLAY_POWER_DOWN 11 + +/* no args */ +#define U8G2_MSG_DISPLAY_POWER_UP 12 + +/* arg_int: 0..255 contrast value */ +#define U8G2_MSG_DISPLAY_SET_CONTRAST 13 + +/* arg_ptr: u8g2_tile_t */ +#define U8G2_MSG_DISPLAY_DRAW_TILE 14 + +/* arg_ptr: layout struct */ +#define U8G2_MSG_DISPLAY_GET_LAYOUT 15 + +/* u8g2_display.c */ +uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); +void u8g2_display_Init(u8g2_t *u8g2); + + + + + +/*==========================================*/ +/* Command Arg Data (CAD) Interface */ + +#define U8G2_MSG_CAD_SEND_CMD 20 +/* arg_int: cmd byte */ +#define U8G2_MSG_CAD_SEND_ARG 21 +/* arg_int: arg byte */ +#define U8G2_MSG_CAD_SEND_DATA 22 +/* arg_int: # of data, arg_ptr = uint8_t * with data */ +#define U8G2_MSG_CAD_RESET 23 +/* arg_int: expected cs level after processing this msg */ +#define U8G2_MSG_CAD_START_TRANSFER 24 +/* arg_int: expected cs level after processing this msg */ +#define U8G2_MSG_CAD_END_TRANSFER 25 +/* arg_int = 0: disable chip, arg_int = 1: enable chip */ +#define U8G2_MSG_CAD_SET_I2C_ADR 26 +#define U8G2_MSG_CAD_SET_DEVICE 27 + +/* u8g_cad.c */ +uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd); +uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg); +uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data); +uint8_t u8g2_cad_Reset1(u8g2_t *u8g2); +uint8_t u8g2_cad_Reset0(u8g2_t *u8g2); +uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs); +uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs); + +#define U8G2_C(c0) (0x04), (c0) +#define U8G2_CA(c0,a0) (0x05), (c0), (a0) +#define U8G2_CAA(c0,a0,a1) (0x06), (c0), (a0), (a1) +#define U8G2_DATA() (0x10) +#define U8G2_D1(d0) (0x11), (d0) +#define U8G2_START_CS0() (0xf0) +#define U8G2_START_CS1() (0xf1) +#define U8G2_END_CS0() (0xf2) +#define U8G2_END_CS1() (0xf3) +#define U8G2_DLY(m) (0xfe),(m) +#define U8G2_END() (0xff) + +void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data); +uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); +uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); + + +/*==========================================*/ +/* Byte Interface */ +#define U8G2_MSG_BYTE_SEND 30 +#define U8G2_MSG_BYTE_SET_DC 31 + +/* arg_int: level */ +#define U8G2_MSG_BYTE_RESET U8G2_MSG_CAD_RESET + + +#define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER +#define U8G2_MSG_BYTE_END_TRANSFER U8G2_MSG_CAD_END_TRANSFER + +#define U8G2_MSG_BYTE_SET_I2C_ADR U8G2_MSG_CAD_SET_I2C_ADR +#define U8G2_MSG_BYTE_SET_DEVICE U8G2_MSG_CAD_SET_DEVICE + +uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc); +uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); + +/*==========================================*/ +/* GPIO Interface */ + +/* arg_int: milliseconds */ +#define U8G2_MSG_DELAY_MILLI 40 + +#define U8G2_MSG_DELAY_10MICRO 41 +#define U8G2_MSG_DELAY_100NANO 42 + +/*==========================================*/ +/* u8g2.c */ +void u8g2_Init(u8g2_t *u8g2); +//void u8g2_Chain(u8g2_t *u8g2, u8g2_t *u8g2, u8g2_msg_cb cb); OBSOLETE + + +/*==========================================*/ +/* u8g2_d_stdio.c */ +void u8g2_InitStdio(u8g2_t *u8g2); + +/*==========================================*/ +/* u8g2_d_uc1701_dogs102.c */ +uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _U8G2_H */ + diff --git a/u8g2/csrc/u8g2_byte.c b/u8g2/csrc/u8g2_byte.c new file mode 100644 index 00000000..40710b04 --- /dev/null +++ b/u8g2/csrc/u8g2_byte.c @@ -0,0 +1,27 @@ +/* + + u8g2_byte.c + +*/ + +#include "u8g2.h" + +uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) +{ + return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SET_DC, dc, NULL); +} + +uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte) +{ + return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SEND, byte, NULL); +} + +uint8_t u8g2_byte_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8G2_MSG_BYTE_SEND: + break; + } + return 0; +} diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c new file mode 100644 index 00000000..9a9876e8 --- /dev/null +++ b/u8g2/csrc/u8g2_cad.c @@ -0,0 +1,241 @@ +/* + + u8g2_cad.c + + "command arg data" interface to the graphics controller + +*/ +/* +uint8_t u8g2_cad_template(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8G2_MSG_CAD_SEND_CMD: + u8g2_mcd_byte_SetDC(mcd->next, 1); + u8g2_mcd_byte_Send(mcd->next, arg_int); + break; + case U8G2_MSG_CAD_SEND_ARG: + u8g2_mcd_byte_SetDC(mcd->next, 1); + u8g2_mcd_byte_Send(mcd->next, arg_int); + break; + case U8G2_MSG_CAD_SEND_DATA: + u8g2_mcd_byte_SetDC(mcd->next, 0); + for( i = 0; i < 8; i++ ) + u8g2_mcd_byte_Send(mcd->next, ((uint8_t *)arg_ptr)[i]); + break; + case U8G2_MSG_CAD_RESET: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_START_TRANSFER: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_END_TRANSFER: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_I2C_ADR: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_DEVICE: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + default: + break; + } + return 1; +} + +*/ + +#include "u8g2.h" + +uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_CMD, cmd, NULL); +} + +uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_ARG, arg, NULL); +} + +uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_DATA, cnt, data); +} + +uint8_t u8g2_cad_Reset1(u8g2_t *u8g2) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 1, NULL); +} + +uint8_t u8g2_cad_Reset0(u8g2_t *u8g2) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 0, NULL); +} + +uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_START_TRANSFER, cs, NULL); +} + +uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs) +{ + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_END_TRANSFER, cs, NULL); +} + +/* + 0000ccaa command arg combination, aa = no of args, cc = no of commands + 0001dddd data sequence + 11110000 CS Off + 11110001 CS On + 11111110 xxxxxxxx delay in millis + 11111111 End of sequence + +*/ + +void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) +{ + uint8_t hi, lo; + uint8_t v; + + for(;;) + { + hi = *data; + lo = hi; + hi >>= 4; + lo &= 0x0f; + data++; + switch( hi ) + { + case 0: + while( lo > 3 ) + { + v = *data; + u8g2_cad_SendCmd(u8g2, v); + data++; + lo-=4; + } + while( lo > 0 ) + { + v = *data; + u8g2_cad_SendArg(u8g2, v); + data++; + lo--; + } + break; + case 1: + while( lo > 0 ) + { + v = *data; + u8g2_cad_SendData(u8g2, 1, &v); + data++; + lo--; + } + break; + case 15: + switch(lo) + { + case 0: + u8g2_cad_StartTransfer(u8g2, 0); + break; + case 1: + u8g2_cad_StartTransfer(u8g2, 1); + break; + case 2: + u8g2_cad_EndTransfer(u8g2, 0); + break; + case 3: + u8g2_cad_EndTransfer(u8g2, 1); + break; + case 14: + v = *data++; + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, v, NULL); + break; + default: + return; + } + break; + default: + return; + } + } +} + + +/* + convert to bytes by using + dc = 1 for commands and args and + dc = 0 for data +*/ +uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8G2_MSG_CAD_SEND_CMD: + u8g2_byte_SetDC(u8g2, 1); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_ARG: + u8g2_byte_SetDC(u8g2, 1); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_DATA: + u8g2_byte_SetDC(u8g2, 0); + for( i = 0; i < arg_int; i++ ) + u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); + break; + case U8G2_MSG_CAD_RESET: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_START_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_END_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_I2C_ADR: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_DEVICE: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + default: + return 0; + } + return 1; +} + +/* + convert to bytes by using + dc = 0 for commands and args and + dc = 1 for data +*/ +uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8G2_MSG_CAD_SEND_CMD: + u8g2_byte_SetDC(u8g2, 0); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_ARG: + u8g2_byte_SetDC(u8g2, 0); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_DATA: + u8g2_byte_SetDC(u8g2, 1); + for( i = 0; i < arg_int; i++ ) + u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); + break; + case U8G2_MSG_CAD_RESET: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_START_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_END_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_I2C_ADR: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_DEVICE: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + default: + return 0; + } + return 1; +} + diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c new file mode 100644 index 00000000..c4cc47ad --- /dev/null +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -0,0 +1,158 @@ + +#include "u8g2.h" + +#include + +#define W 4 +#define H 2 + +uint8_t bitmap[4*2*8]; + +void bitmap_place_tile(uint8_t x, uint8_t y, uint8_t *tile) +{ + uint8_t i; + for(i = 0; i < 8; i++ ) + bitmap[x+y*W*8+i*W] = tile[i]; +} + +void bitmap_show(void) +{ + int x, y; + for( y = 0; y < H*8; y++ ) + { + for( x = 0; x < W*8; x++ ) + { + if ( (bitmap[x/8+y*W] & (1<<(7-(x&7)))) != 0 ) + { + printf("*"); + } + else + { + printf("."); + } + } + printf("\n"); + } +} + +uint8_t u8g2_byte_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + static uint8_t x,y,i; + static uint8_t dc; + static uint8_t buf[8]; + + switch(msg) + { + case U8G2_MSG_BYTE_SEND: + if ( dc == 0 ) + { + buf[i] = arg_int; + i++; + if ( i >= 8 ) + { + bitmap_place_tile(x, y, buf); + i = 0; + } + } + else + { + if ( arg_int <= 15 ) + x = arg_int; + else + y = arg_int & 0x0f; + } + break; + case U8G2_MSG_BYTE_SET_DC: + dc = arg_int; + break; + case U8G2_MSG_BYTE_RESET: + break; + case U8G2_MSG_BYTE_START_TRANSFER: + break; + case U8G2_MSG_BYTE_END_TRANSFER: + bitmap_show(); + break; + case U8G2_MSG_BYTE_SET_I2C_ADR: + break; + case U8G2_MSG_BYTE_SET_DEVICE: + break; + default: + break; + } + return 1; +} + + +uint8_t u8g2_cad_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8G2_MSG_CAD_SEND_CMD: + u8g2_byte_SetDC(u8g2, 1); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_ARG: + u8g2_byte_SetDC(u8g2, 1); + u8g2_byte_Send(u8g2, arg_int); + break; + case U8G2_MSG_CAD_SEND_DATA: + u8g2_byte_SetDC(u8g2, 0); + for( i = 0; i < 8; i++ ) + u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); + break; + case U8G2_MSG_CAD_RESET: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_START_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_END_TRANSFER: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_I2C_ADR: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_SET_DEVICE: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + default: + break; + } + return 1; +} + + +uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8G2_MSG_DISPLAY_INIT: + break; + case U8G2_MSG_DISPLAY_POWER_DOWN: + break; + case U8G2_MSG_DISPLAY_POWER_UP: + break; + case U8G2_MSG_DISPLAY_SET_CONTRAST: + break; + case U8G2_MSG_DISPLAY_DRAW_TILE: + u8g2_cad_StartTransfer(u8g2, 0); + u8g2_cad_SendCmd(u8g2, ((u8g2_tile_t *)arg_ptr)->x_pos); + u8g2_cad_SendCmd(u8g2, 0xf0 | ((u8g2_tile_t *)arg_ptr)->y_pos); + u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + u8g2_cad_EndTransfer(u8g2, 1); + break; + case U8G2_MSG_DISPLAY_GET_LAYOUT: + break; + default: + break; + } + return 1; +} + + + +void u8g2_InitStdio(u8g2_t *u8g2) +{ + u8g2_Init(u8g2); + u8g2->display_cb = u8g2_d_stdio; + u8g2->cad_cb = u8g2_cad_stdio; + u8g2->byte_cb = u8g2_byte_stdio; +} + diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c new file mode 100644 index 00000000..d1642deb --- /dev/null +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -0,0 +1,131 @@ + +#include "u8g2.h" + + + + +static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { + + /* the following sequence ensures that the chip select is high */ + U8G2_START_CS0(), /* enable chip */ + U8G2_DLY(1), /* delay 1 ms */ + U8G2_END_CS1(), /* ensure that chip is disabled */ + U8G2_DLY(1), /* delay 1 ms */ + + U8G2_START_CS0(), /* enable chip */ + U8G2_DLY(1), /* delay 1 ms */ + + U8G2_C(0x0e2), /* soft reset */ + U8G2_C(0x0ae), /* display off */ + U8G2_C(0x040), /* set display start line to 0 */ + U8G2_C(0x0a1), /* ADC set to reverse */ + U8G2_C(0x0c0), /* common output mode */ + U8G2_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */ + U8G2_C(0x0a2), /* LCD bias 1/9 */ + U8G2_C(0x02f), /* all power control circuits on */ + U8G2_C(0x027), /* regulator, booster and follower */ + U8G2_C(0x081), /* set contrast */ + U8G2_C(0x00e), /* contrast value, EA default: 0x010, previous value for S102: 0x0e */ + U8G2_C(0x0fa), /* Set Temp compensation */ + U8G2_C(0x090), /* 0.11 deg/c WP Off WC Off*/ + U8G2_C(0x0a4), /* normal display */ + U8G2_C(0x0af), /* display on */ + + + //U8G2_DLY(50), /* delay 100 ms */ + //U8G2_C(0x0a5), /* display all points, ST7565, UC1610 */ + //U8G2_DLY(50), /* delay 100 ms */ + //U8G2_DLY(50), /* delay 100 ms */ + //U8G2_C(0x0a4), /* normal display */ + + //U8G2_C(0x010), /* col hi adr 0 */ + //U8G2_C(0x000), /* col lo adr 0 */ + //U8G2_C(0x0b0), /* page 0 */ + + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + + + U8G2_END_CS1(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static u8g2_display_info_t u8g2_uc1601_display_info = +{ + /* post_chip_enable_wait_ns = */ 5, + /* pre_chip_disable_wait_ns = */ 5, + /* reset_pulse_width_ms = */ 1, + /* post_reset_wait_ms = */ 6, + /* sda_setup_time_ns = */ 12, + /* sck_pulse_width_ns = */ 15, + /* sck_takeover_edge = */ 1, /* rising edge */ + /* i2c_bus_clock_100kHz = */ 37, + /* data_setup_time_ns = */ 30, + /* write_pulse_width_ns = */ 40 +}; + +uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t x; + switch(msg) + { + case U8G2_MSG_DISPLAY_INIT: + /* 1) set display info struct */ + u8g2->display_info = u8g2_uc1601_display_info; + + /* 3) do reset */ + u8g2_cad_Reset1(u8g2); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.reset_pulse_width_ms, NULL); + u8g2_cad_Reset0(u8g2); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.reset_pulse_width_ms, NULL); + u8g2_cad_Reset1(u8g2); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.post_reset_wait_ms, NULL); + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); + //u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, 100, NULL); + //u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); + break; + case U8G2_MSG_DISPLAY_POWER_DOWN: + break; + case U8G2_MSG_DISPLAY_POWER_UP: + break; + case U8G2_MSG_DISPLAY_SET_CONTRAST: + break; + case U8G2_MSG_DISPLAY_DRAW_TILE: + u8g2_cad_StartTransfer(u8g2, /* cs = */ 0); + x = ((u8g2_tile_t *)arg_ptr)->x_pos; + + u8g2_cad_SendCmd(u8g2, 0x010 | (x>>1) ); + u8g2_cad_SendCmd(u8g2, 0x000 | ((x&1) << 3)); + u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); + u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + u8g2_cad_EndTransfer(u8g2, /* cs = */ 1); + break; + case U8G2_MSG_DISPLAY_GET_LAYOUT: + break; + default: + return 0; + } + return 1; +} + + +/* +static u8g2_mcd_t u8g2_mcd_byte_stdio; +static u8g2_mcd_t u8g2_mcd_cad; +static u8g2_mcd_t u8g2_mcd_display; + + +void u8g2_InitUC1701DOGS102(u8g2_t *u8g2) +{ + u8g2_Init(u8g2); + u8g2_Chain(u8g2, &u8g2_mcd_byte_stdio, u8g2_byte_stdio); + u8g2_Chain(u8g2, &u8g2_cad_110, u8g2_mcd_cad); + u8g2_Chain(u8g2, &u8g2_d_uc1701_dogs102, u8g2_mcd_display); +} +*/ diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c new file mode 100644 index 00000000..ab9b7e85 --- /dev/null +++ b/u8g2/csrc/u8g2_display.c @@ -0,0 +1,51 @@ +/* + + u8g2_display.c + + Abstraction layer for the graphics controller. + Main goal is the placement of a 8x8 pixel block on the display. + +*/ + +/* +template + +uint8_t u8g2_d_xyz(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8G2_MSG_DISPLAY_INIT: + break; + case U8G2_MSG_DISPLAY_POWER_DOWN: + break; + case U8G2_MSG_DISPLAY_POWER_UP: + break; + case U8G2_MSG_DISPLAY_SET_CONTRAST: + break; + case U8G2_MSG_DISPLAY_DRAW_TILE: + break; + case U8G2_MSG_DISPLAY_GET_LAYOUT: + break; + default: + break; + } + return 1; +} +*/ + +#include "u8g2.h" + +uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) +{ + u8g2_tile_t tile; + tile.x_pos = x; + tile.y_pos = y; + tile.cnt = cnt; + tile.tile_ptr = tile_ptr; + return u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, 0, (void *)&tile); +} + +void u8g2_display_Init(u8g2_t *u8g2) +{ + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_INIT, 0, NULL); +} diff --git a/u8g2/sys/arduino/test/Makefile.165.uno b/u8g2/sys/arduino/test/Makefile.165.uno new file mode 100644 index 00000000..ff49fd87 --- /dev/null +++ b/u8g2/sys/arduino/test/Makefile.165.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .ino file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +#U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +#U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +INOSRC:=$(shell ls *.ino) +TARGETNAME=$(basename $(INOSRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(INOSRC:.ino=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .ino + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.ino + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino new file mode 100644 index 00000000..887b0370 --- /dev/null +++ b/u8g2/sys/arduino/test/test.ino @@ -0,0 +1,153 @@ + + + +#include +#include +#include "u8g2.h" + +uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8G2_MSG_DELAY_MILLI: + delay(arg_int); + break; + default: + return 0; + } + return 1; +} + + + +uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + //uint8_t i; + + switch(msg) + { + case U8G2_MSG_BYTE_SEND: + SPI.begin(); + + //for( i = 0; i < arg_int; i++ ) + // SPI.transfer(((uint8_t *)arg_ptr)[i]); + SPI.transfer((uint8_t)arg_int); + SPI.end(); + break; + case U8G2_MSG_BYTE_SET_DC: + digitalWrite(9, arg_int); + break; + case U8G2_MSG_BYTE_RESET: + digitalWrite(8, arg_int); + break; + case U8G2_MSG_BYTE_START_TRANSFER: + pinMode(8, OUTPUT); + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + digitalWrite(10, arg_int); + break; + case U8G2_MSG_BYTE_END_TRANSFER: + digitalWrite(10, arg_int); + break; + case U8G2_MSG_BYTE_SET_I2C_ADR: + break; + case U8G2_MSG_BYTE_SET_DEVICE: + break; + default: + return 0; + } + return 1; +} + + +uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8G2_MSG_BYTE_SEND: + for( i = 0; i < 8; i++ ) + { + if ( arg_int & 128 ) + digitalWrite(11, 1); + else + digitalWrite(11, 0); + arg_int <<= 1; + delay(1); + digitalWrite(13, 0); + delay(1); + digitalWrite(13, 1); + delay(1); + + } + + + //SPI.begin(); + + //for( i = 0; i < arg_int; i++ ) + // SPI.transfer(((uint8_t *)arg_ptr)[i]); + //SPI.transfer((uint8_t)arg_int); + //SPI.end(); + break; + case U8G2_MSG_BYTE_SET_DC: + digitalWrite(9, arg_int); + break; + case U8G2_MSG_BYTE_RESET: + digitalWrite(8, arg_int); + break; + case U8G2_MSG_BYTE_START_TRANSFER: + pinMode(8, OUTPUT); + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + pinMode(11, OUTPUT); + pinMode(13, OUTPUT); + digitalWrite(13, 1); + digitalWrite(10, arg_int); + break; + case U8G2_MSG_BYTE_END_TRANSFER: + digitalWrite(10, arg_int); + break; + case U8G2_MSG_BYTE_SET_I2C_ADR: + break; + case U8G2_MSG_BYTE_SET_DEVICE: + break; + default: + return 0; + } + return 1; +} + +void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) +{ + u8g2_Init(u8g2); + u8g2->display_cb = u8g2_d_uc1701_dogs102; + u8g2->cad_cb = u8g2_cad_001; + u8g2->byte_cb = u8g2_byte_arduino_sw_spi; + u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; +} + + +u8g2_t u8g2; +uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; + +void setup(void) +{ + u8g2_Setup_UC1701_DOGS102(&u8g2); + //u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); +} + +void loop(void) +{ + u8g2_display_Init(&u8g2); + u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); + u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); + u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); + u8g2_display_DrawTile(&u8g2, 4, 4, 1, tile); + u8g2_display_DrawTile(&u8g2, 5, 5, 1, tile); + u8g2_display_DrawTile(&u8g2, 6, 6, 1, tile); + delay(1000); + for(;;) + ; +} + diff --git a/u8g2/sys/stdio/Makefile b/u8g2/sys/stdio/Makefile new file mode 100644 index 00000000..5470f6cf --- /dev/null +++ b/u8g2/sys/stdio/Makefile @@ -0,0 +1,15 @@ +CFLAGS = -I../../csrc -g -Wall +#CFLAGS = -O4 -Wall + +SRC = $(shell ls ../../csrc/*.c 2>/dev/null) test.c + +OBJ = $(SRC:.c=.o) + +stdio: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o stdio + +clean: + -rm $(OBJ) stdio + +test: + ./stdio \ No newline at end of file diff --git a/u8g2/sys/stdio/test.c b/u8g2/sys/stdio/test.c new file mode 100644 index 00000000..1e7bffaf --- /dev/null +++ b/u8g2/sys/stdio/test.c @@ -0,0 +1,15 @@ + + + +#include "u8g2.h" + +u8g2_t u8g2; + +int main(void) +{ + uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; + u8g2_InitStdio(&u8g2); + u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); + + return 0; +} \ No newline at end of file From 49272bec5da2bf6811d005a9762e8436647b99b0 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 12:20:45 +0200 Subject: [PATCH 021/109] gpio msg --- sys/arduino/GraphicsTest/GraphicsTest.pde | 2 +- sys/arduino/HelloWorld/Makefile.165.uno | 11 ++++++----- u8g2/csrc/u8g2.h | 4 ++++ u8g2/csrc/u8g2_d_uc1701_dogs102.c | 8 ++++---- u8g2/sys/arduino/test/test.ino | 17 +++++++++++++++-- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 456f631a..85c6a68e 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -51,7 +51,7 @@ //U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -//U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 diff --git a/sys/arduino/HelloWorld/Makefile.165.uno b/sys/arduino/HelloWorld/Makefile.165.uno index bbf951d8..c10d6d52 100644 --- a/sys/arduino/HelloWorld/Makefile.165.uno +++ b/sys/arduino/HelloWorld/Makefile.165.uno @@ -23,12 +23,13 @@ # 002 05 Oct 2010 added 'uno' # 003 06 Dec 2011 arduino 1.0 # 004 11 Feb 2012 u8glib +# 004 09 Aug 2015 Arduino 1.6.5 # #=== user configuration === # All ...PATH variables must have a '/' at the end -# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/avr/boards.txt # Some examples: # BOARD DESCRIPTION # uno Arduino Uno @@ -41,7 +42,7 @@ BOARD:=uno # additional definitions -#DEFS:=-DARDUINO=105 +#DEFS:=-DARDUINO=165 U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ @@ -54,10 +55,10 @@ U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ AVR_TOOLS_PATH:=/usr/bin/ # Install path of the arduino software. Requires a '/' at the end. -ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ +ARDUINO_PATH:=/home/kraus/prg/arduino-1.6.5/ # Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. -AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/avr/bin/ # The unix device where we can reach the arduino board # Uno: /dev/ttyACM0 @@ -74,7 +75,7 @@ EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ #=== fetch parameter from boards.txt processor parameter === # the basic idea is to get most of the information from boards.txt -BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/avr/boards.txt # get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 1afd4f9a..3cd40722 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -242,6 +242,10 @@ uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); #define U8G2_MSG_DELAY_10MICRO 41 #define U8G2_MSG_DELAY_100NANO 42 +#define U8G2_MSG_GPIO_DC 45 +#define U8G2_MSG_GPIO_CS 46 +#define U8G2_MSG_GPIO_RESET 47 + /*==========================================*/ /* u8g2.c */ void u8g2_Init(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index d1642deb..deb654e7 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -77,15 +77,15 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void { case U8G2_MSG_DISPLAY_INIT: /* 1) set display info struct */ - u8g2->display_info = u8g2_uc1601_display_info; + u8g2->display_info = &u8g2_uc1601_display_info; /* 3) do reset */ u8g2_cad_Reset1(u8g2); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.reset_pulse_width_ms, NULL); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); u8g2_cad_Reset0(u8g2); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.reset_pulse_width_ms, NULL); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); u8g2_cad_Reset1(u8g2); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info.post_reset_wait_ms, NULL); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms, NULL); u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); //u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, 100, NULL); //u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 887b0370..46469b5f 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -12,6 +12,19 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, case U8G2_MSG_DELAY_MILLI: delay(arg_int); break; + + case U8G2_MSG_GPIO_DC: + digitalWrite(9, arg_int); + break; + + case U8G2_MSG_GPIO_CS: + digitalWrite(10, arg_int); + break; + + case U8G2_MSG_GPIO_RESET: + digitalWrite(8, arg_int); + break; + default: return 0; } @@ -103,10 +116,10 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo pinMode(11, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, 1); - digitalWrite(10, arg_int); + digitalWrite(10, arg_int); // TODO: call gpio cb break; case U8G2_MSG_BYTE_END_TRANSFER: - digitalWrite(10, arg_int); + digitalWrite(10, arg_int); // TODO: call gpio cb break; case U8G2_MSG_BYTE_SET_I2C_ADR: break; From 149abdfde927df7404e071913217da023d756b7b Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 14:32:45 +0200 Subject: [PATCH 022/109] gpio init --- u8g2/csrc/u8g2.h | 15 ++++++++++++--- u8g2/csrc/u8g2_cad.c | 14 ++++++++++++++ u8g2/csrc/u8g2_d_uc1701_dogs102.c | 6 ++++-- u8g2/sys/arduino/test/test.ino | 12 ++++++++++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 3cd40722..4f4fdfcd 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -237,15 +237,24 @@ uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); /* GPIO Interface */ /* arg_int: milliseconds */ -#define U8G2_MSG_DELAY_MILLI 40 -#define U8G2_MSG_DELAY_10MICRO 41 -#define U8G2_MSG_DELAY_100NANO 42 +#define U8G2_MSG_GPIO_AND_DELAY_INIT 40 + +#define U8G2_MSG_DELAY_MILLI 41 + +#define U8G2_MSG_DELAY_10MICRO 42 +#define U8G2_MSG_DELAY_100NANO 43 #define U8G2_MSG_GPIO_DC 45 #define U8G2_MSG_GPIO_CS 46 #define U8G2_MSG_GPIO_RESET 47 +#define u8g2_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) + +#define u8g2_gpio_SetDC(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_DC, (v), NULL )) +#define u8g2_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_CS, (v), NULL )) +#define u8g2_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_RESET, (v), NULL )) + /*==========================================*/ /* u8g2.c */ void u8g2_Init(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 9a9876e8..02a800d5 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -3,7 +3,21 @@ u8g2_cad.c "command arg data" interface to the graphics controller + + The following sequence must be used for any data, which is set to the display: + + + uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs) + + any of the following calls + uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) + uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) + uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) + uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs) + + + */ /* uint8_t u8g2_cad_template(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index deb654e7..5ffea4c5 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -79,6 +79,9 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void /* 1) set display info struct */ u8g2->display_info = &u8g2_uc1601_display_info; + /* 2) apply default values to the GPIO lines */ + u8g2_gpio_Init(u8g2); + /* 3) do reset */ u8g2_cad_Reset1(u8g2); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); @@ -87,8 +90,7 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void u8g2_cad_Reset1(u8g2); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms, NULL); u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); - //u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, 100, NULL); - //u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); + break; case U8G2_MSG_DISPLAY_POWER_DOWN: break; diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 46469b5f..d0303e5e 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -116,10 +116,12 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo pinMode(11, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, 1); - digitalWrite(10, arg_int); // TODO: call gpio cb + //digitalWrite(10, arg_int); // TODO: call gpio cb + u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_END_TRANSFER: - digitalWrite(10, arg_int); // TODO: call gpio cb + //digitalWrite(10, arg_int); // TODO: call gpio cb + u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_SET_I2C_ADR: break; @@ -133,11 +135,17 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) { + /* setup defaults */ u8g2_Init(u8g2); + + /* setup specific callbacks */ u8g2->display_cb = u8g2_d_uc1701_dogs102; u8g2->cad_cb = u8g2_cad_001; u8g2->byte_cb = u8g2_byte_arduino_sw_spi; u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; + + /* display init (done later) */ + //u8g2_display_Init(&u8g2); } From a8716b042f6b31a19b7462f4c03034e8cd679d90 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 14:33:05 +0200 Subject: [PATCH 023/109] gpio init --- u8g2/sys/arduino/test/test.ino | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index d0303e5e..05a74f83 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -9,6 +9,12 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, { switch(msg) { + case U8G2_MSG_GPIO_AND_DELAY_INIT: + pinMode(8, OUTPUT); + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + break; + case U8G2_MSG_DELAY_MILLI: delay(arg_int); break; @@ -54,9 +60,9 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo digitalWrite(8, arg_int); break; case U8G2_MSG_BYTE_START_TRANSFER: - pinMode(8, OUTPUT); - pinMode(9, OUTPUT); - pinMode(10, OUTPUT); + //pinMode(8, OUTPUT); + //pinMode(9, OUTPUT); + //pinMode(10, OUTPUT); digitalWrite(10, arg_int); break; case U8G2_MSG_BYTE_END_TRANSFER: From 2b9c75cd147c29197837cffc192659daed7a5bbd Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 18:22:55 +0200 Subject: [PATCH 024/109] msg simplification --- u8g2/csrc/u8g2.h | 8 ++-- u8g2/csrc/u8g2_cad.c | 10 +++-- u8g2/csrc/u8g2_d_stdio.c | 4 -- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 8 ++-- u8g2/sys/arduino/test/test.ino | 62 ++++++++++--------------------- 5 files changed, 35 insertions(+), 57 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 4f4fdfcd..b274fa2a 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -180,7 +180,7 @@ void u8g2_display_Init(u8g2_t *u8g2); /* arg_int: arg byte */ #define U8G2_MSG_CAD_SEND_DATA 22 /* arg_int: # of data, arg_ptr = uint8_t * with data */ -#define U8G2_MSG_CAD_RESET 23 +//#define U8G2_MSG_CAD_RESET 23 /* arg_int: expected cs level after processing this msg */ #define U8G2_MSG_CAD_START_TRANSFER 24 /* arg_int: expected cs level after processing this msg */ @@ -193,8 +193,8 @@ void u8g2_display_Init(u8g2_t *u8g2); uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd); uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg); uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data); -uint8_t u8g2_cad_Reset1(u8g2_t *u8g2); -uint8_t u8g2_cad_Reset0(u8g2_t *u8g2); +//uint8_t u8g2_cad_Reset1(u8g2_t *u8g2); +//uint8_t u8g2_cad_Reset0(u8g2_t *u8g2); uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs); uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs); @@ -221,7 +221,7 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) #define U8G2_MSG_BYTE_SET_DC 31 /* arg_int: level */ -#define U8G2_MSG_BYTE_RESET U8G2_MSG_CAD_RESET +//#define U8G2_MSG_BYTE_RESET U8G2_MSG_CAD_RESET #define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 02a800d5..d98d6822 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -74,6 +74,7 @@ uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_DATA, cnt, data); } +/* uint8_t u8g2_cad_Reset1(u8g2_t *u8g2) { return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 1, NULL); @@ -83,6 +84,7 @@ uint8_t u8g2_cad_Reset0(u8g2_t *u8g2) { return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 0, NULL); } +*/ uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs) { @@ -197,8 +199,8 @@ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) for( i = 0; i < arg_int; i++ ) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; - case U8G2_MSG_CAD_RESET: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + //case U8G2_MSG_CAD_RESET: + // return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: @@ -237,8 +239,8 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) for( i = 0; i < arg_int; i++ ) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; - case U8G2_MSG_CAD_RESET: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + //case U8G2_MSG_CAD_RESET: + // return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c index c4cc47ad..a91541d5 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -65,8 +65,6 @@ uint8_t u8g2_byte_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_p case U8G2_MSG_BYTE_SET_DC: dc = arg_int; break; - case U8G2_MSG_BYTE_RESET: - break; case U8G2_MSG_BYTE_START_TRANSFER: break; case U8G2_MSG_BYTE_END_TRANSFER: @@ -102,8 +100,6 @@ uint8_t u8g2_cad_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_pt for( i = 0; i < 8; i++ ) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; - case U8G2_MSG_CAD_RESET: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 5ffea4c5..435cbda5 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -83,12 +83,14 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void u8g2_gpio_Init(u8g2); /* 3) do reset */ - u8g2_cad_Reset1(u8g2); + u8g2_gpio_SetReset(u8g2, 1); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); - u8g2_cad_Reset0(u8g2); + u8g2_gpio_SetReset(u8g2, 0); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); - u8g2_cad_Reset1(u8g2); + u8g2_gpio_SetReset(u8g2, 1); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms, NULL); + + /* 4) send startup code */ u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); break; diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 05a74f83..ba8eab87 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -13,23 +13,25 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); + pinMode(11, OUTPUT); + pinMode(13, OUTPUT); break; case U8G2_MSG_DELAY_MILLI: delay(arg_int); break; - case U8G2_MSG_GPIO_DC: - digitalWrite(9, arg_int); - break; - - case U8G2_MSG_GPIO_CS: - digitalWrite(10, arg_int); - break; - - case U8G2_MSG_GPIO_RESET: - digitalWrite(8, arg_int); - break; + case U8G2_MSG_GPIO_DC: + digitalWrite(9, arg_int); + break; + + case U8G2_MSG_GPIO_CS: + digitalWrite(10, arg_int); + break; + + case U8G2_MSG_GPIO_RESET: + digitalWrite(8, arg_int); + break; default: return 0; @@ -54,19 +56,14 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo SPI.end(); break; case U8G2_MSG_BYTE_SET_DC: - digitalWrite(9, arg_int); - break; - case U8G2_MSG_BYTE_RESET: - digitalWrite(8, arg_int); + //digitalWrite(9, arg_int); // TODO: Call to GPIO callback + u8g2_gpio_SetDC(u8g2, arg_int); break; case U8G2_MSG_BYTE_START_TRANSFER: - //pinMode(8, OUTPUT); - //pinMode(9, OUTPUT); - //pinMode(10, OUTPUT); - digitalWrite(10, arg_int); + u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_END_TRANSFER: - digitalWrite(10, arg_int); + u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_SET_I2C_ADR: break; @@ -97,36 +94,17 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo digitalWrite(13, 0); delay(1); digitalWrite(13, 1); - delay(1); - - } - - - //SPI.begin(); - - //for( i = 0; i < arg_int; i++ ) - // SPI.transfer(((uint8_t *)arg_ptr)[i]); - //SPI.transfer((uint8_t)arg_int); - //SPI.end(); + delay(1); + } break; case U8G2_MSG_BYTE_SET_DC: - digitalWrite(9, arg_int); - break; - case U8G2_MSG_BYTE_RESET: - digitalWrite(8, arg_int); + u8g2_gpio_SetDC(u8g2, arg_int); break; case U8G2_MSG_BYTE_START_TRANSFER: - pinMode(8, OUTPUT); - pinMode(9, OUTPUT); - pinMode(10, OUTPUT); - pinMode(11, OUTPUT); - pinMode(13, OUTPUT); digitalWrite(13, 1); - //digitalWrite(10, arg_int); // TODO: call gpio cb u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_END_TRANSFER: - //digitalWrite(10, arg_int); // TODO: call gpio cb u8g2_gpio_SetCS(u8g2, arg_int); break; case U8G2_MSG_BYTE_SET_I2C_ADR: From 49263d729dd4b15695513a2cca070abe6530b1e1 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 2 Sep 2015 19:57:40 +0200 Subject: [PATCH 025/109] msg simplification --- u8g2/csrc/u8g2.h | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index b274fa2a..b0af6e3c 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -22,14 +22,15 @@ One layer is the Command/Arg/Data interface. It can be used by the display layer to communicate with the display hardware. + This layer only deals with data, commands and arguments. D/C line is unknown. U8G2_MSG_CAD_INIT + U8G2_MSG_CAD_SET_I2C_ADR + U8G2_MSG_CAD_SET_DEVICE + U8G2_MSG_CAD_START_TRANSFER U8G2_MSG_CAD_SEND_CMD U8G2_MSG_CAD_SEND_ARG U8G2_MSG_CAD_SEND_DATA - U8G2_MSG_CAD_RESET - U8G2_MSG_CAD_CHIP_SELECT - U8G2_MSG_CAD_SET_I2C_ADR - U8G2_MSG_CAD_SET_DEVICE + U8G2_MSG_CAD_END_TRANSFER The byte interface is there to send 1 byte (8 bits) to the display hardware. This layer depends on the hardware of a microcontroller, if a specific hardware @@ -39,8 +40,8 @@ U8G2_MSG_BYTE_INIT U8G2_MSG_BYTE_SEND 30 U8G2_MSG_BYTE_SET_DC 31 - U8G2_MSG_BYTE_RESET - U8G2_MSG_BYTE_CHIP_SELECT + U8G2_MSG_BYTE_START_TRANSFER + U8G2_MSG_BYTE_END_TRANSFER U8G2_MSG_BYTE_SET_I2C_ADR U8G2_MSG_BYTE_SET_DEVICE @@ -169,8 +170,6 @@ void u8g2_display_Init(u8g2_t *u8g2); - - /*==========================================*/ /* Command Arg Data (CAD) Interface */ @@ -220,9 +219,6 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) #define U8G2_MSG_BYTE_SEND 30 #define U8G2_MSG_BYTE_SET_DC 31 -/* arg_int: level */ -//#define U8G2_MSG_BYTE_RESET U8G2_MSG_CAD_RESET - #define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER #define U8G2_MSG_BYTE_END_TRANSFER U8G2_MSG_CAD_END_TRANSFER From b1a89338932f333ad407c684320dd95f692b758e Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 11:54:11 +0200 Subject: [PATCH 026/109] u8g2 --- u8g2/csrc/u8g2.h | 43 ++++++++++++++++++++++--------- u8g2/csrc/u8g2_cad.c | 28 ++++++++++---------- u8g2/csrc/u8g2_d_stdio.c | 4 +-- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 18 +++++++++---- u8g2/sys/arduino/test/test.ino | 6 +++-- 5 files changed, 64 insertions(+), 35 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index b0af6e3c..9f067455 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -94,6 +94,9 @@ struct u8g2_tile_struct struct u8g2_display_info_struct { /* == general == */ + + uint8_t chip_enable_level; /* UC1601: 0 */ + uint8_t chip_disable_level; /* opposite of chip_enable_level */ uint8_t post_chip_enable_wait_ns; /* UC1601: 5ns */ uint8_t pre_chip_disable_wait_ns; /* UC1601: 5ns */ @@ -173,13 +176,20 @@ void u8g2_display_Init(u8g2_t *u8g2); /*==========================================*/ /* Command Arg Data (CAD) Interface */ -#define U8G2_MSG_CAD_SEND_CMD 20 +/* + U8G2_MSG_CAD_INIT + no args + call U8G2_MSG_BYTE_INIT + setup default values for the I/O lines +*/ +#define U8G2_MSG_CAD_INIT 20 + + +#define U8G2_MSG_CAD_SEND_CMD 21 /* arg_int: cmd byte */ -#define U8G2_MSG_CAD_SEND_ARG 21 +#define U8G2_MSG_CAD_SEND_ARG 22 /* arg_int: arg byte */ -#define U8G2_MSG_CAD_SEND_DATA 22 -/* arg_int: # of data, arg_ptr = uint8_t * with data */ -//#define U8G2_MSG_CAD_RESET 23 +#define U8G2_MSG_CAD_SEND_DATA 23 /* arg_int: expected cs level after processing this msg */ #define U8G2_MSG_CAD_START_TRANSFER 24 /* arg_int: expected cs level after processing this msg */ @@ -188,14 +198,15 @@ void u8g2_display_Init(u8g2_t *u8g2); #define U8G2_MSG_CAD_SET_I2C_ADR 26 #define U8G2_MSG_CAD_SET_DEVICE 27 + +#define u8g2_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8G2_MSG_CAD_INIT, 0, NULL )) + /* u8g_cad.c */ uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd); uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg); uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data); -//uint8_t u8g2_cad_Reset1(u8g2_t *u8g2); -//uint8_t u8g2_cad_Reset0(u8g2_t *u8g2); -uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs); -uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs); +uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2); +uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2); #define U8G2_C(c0) (0x04), (c0) #define U8G2_CA(c0,a0) (0x05), (c0), (a0) @@ -216,8 +227,10 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) /*==========================================*/ /* Byte Interface */ -#define U8G2_MSG_BYTE_SEND 30 -#define U8G2_MSG_BYTE_SET_DC 31 + +#define U8G2_MSG_BYTE_INIT U8G2_MSG_CAD_INIT +#define U8G2_MSG_BYTE_SEND 31 +#define U8G2_MSG_BYTE_SET_DC 32 #define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER @@ -226,16 +239,22 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) #define U8G2_MSG_BYTE_SET_I2C_ADR U8G2_MSG_CAD_SET_I2C_ADR #define U8G2_MSG_BYTE_SET_DEVICE U8G2_MSG_CAD_SET_DEVICE + uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc); uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); /*==========================================*/ /* GPIO Interface */ -/* arg_int: milliseconds */ +/* + U8G2_MSG_GPIO_AND_DELAY_INIT + no args + setup port directions, do not set IO levels, this is done with BYTE/CAD_INIT +*/ #define U8G2_MSG_GPIO_AND_DELAY_INIT 40 +/* arg_int: milliseconds */ #define U8G2_MSG_DELAY_MILLI 41 #define U8G2_MSG_DELAY_10MICRO 42 diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index d98d6822..457f25c2 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -7,14 +7,14 @@ The following sequence must be used for any data, which is set to the display: - uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs) + uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) any of the following calls uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) - uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs) + uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) @@ -86,14 +86,14 @@ uint8_t u8g2_cad_Reset0(u8g2_t *u8g2) } */ -uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2, uint8_t cs) +uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) { - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_START_TRANSFER, cs, NULL); + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_START_TRANSFER, 0, NULL); } -uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2, uint8_t cs) +uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) { - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_END_TRANSFER, cs, NULL); + return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_END_TRANSFER, 0, NULL); } /* @@ -149,16 +149,16 @@ void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) switch(lo) { case 0: - u8g2_cad_StartTransfer(u8g2, 0); + u8g2_cad_StartTransfer(u8g2); break; case 1: - u8g2_cad_StartTransfer(u8g2, 1); + u8g2_cad_StartTransfer(u8g2); break; case 2: - u8g2_cad_EndTransfer(u8g2, 0); + u8g2_cad_EndTransfer(u8g2); break; case 3: - u8g2_cad_EndTransfer(u8g2, 1); + u8g2_cad_EndTransfer(u8g2); break; case 14: v = *data++; @@ -199,8 +199,8 @@ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) for( i = 0; i < arg_int; i++ ) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; - //case U8G2_MSG_CAD_RESET: - // return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_INIT: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: @@ -239,8 +239,8 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) for( i = 0; i < arg_int; i++ ) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; - //case U8G2_MSG_CAD_RESET: - // return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + case U8G2_MSG_CAD_INIT: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c index a91541d5..abf049d1 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -128,11 +128,11 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) case U8G2_MSG_DISPLAY_SET_CONTRAST: break; case U8G2_MSG_DISPLAY_DRAW_TILE: - u8g2_cad_StartTransfer(u8g2, 0); + u8g2_cad_StartTransfer(u8g2); u8g2_cad_SendCmd(u8g2, ((u8g2_tile_t *)arg_ptr)->x_pos); u8g2_cad_SendCmd(u8g2, 0xf0 | ((u8g2_tile_t *)arg_ptr)->y_pos); u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); - u8g2_cad_EndTransfer(u8g2, 1); + u8g2_cad_EndTransfer(u8g2); break; case U8G2_MSG_DISPLAY_GET_LAYOUT: break; diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 435cbda5..9eab5ea0 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -58,6 +58,9 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { static u8g2_display_info_t u8g2_uc1601_display_info = { + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + /* post_chip_enable_wait_ns = */ 5, /* pre_chip_disable_wait_ns = */ 5, /* reset_pulse_width_ms = */ 1, @@ -79,10 +82,15 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void /* 1) set display info struct */ u8g2->display_info = &u8g2_uc1601_display_info; - /* 2) apply default values to the GPIO lines */ + /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ u8g2_gpio_Init(u8g2); + u8g2_cad_Init(u8g2); + + /* 3) apply default value for chip select */ + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ - /* 3) do reset */ + /* 4) do reset */ u8g2_gpio_SetReset(u8g2, 1); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); u8g2_gpio_SetReset(u8g2, 0); @@ -90,7 +98,7 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void u8g2_gpio_SetReset(u8g2, 1); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms, NULL); - /* 4) send startup code */ + /* 5) send startup code */ u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); break; @@ -101,14 +109,14 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void case U8G2_MSG_DISPLAY_SET_CONTRAST: break; case U8G2_MSG_DISPLAY_DRAW_TILE: - u8g2_cad_StartTransfer(u8g2, /* cs = */ 0); + u8g2_cad_StartTransfer(u8g2); x = ((u8g2_tile_t *)arg_ptr)->x_pos; u8g2_cad_SendCmd(u8g2, 0x010 | (x>>1) ); u8g2_cad_SendCmd(u8g2, 0x000 | ((x&1) << 3)); u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); - u8g2_cad_EndTransfer(u8g2, /* cs = */ 1); + u8g2_cad_EndTransfer(u8g2); break; case U8G2_MSG_DISPLAY_GET_LAYOUT: break; diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index ba8eab87..b2a88816 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -102,10 +102,12 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo break; case U8G2_MSG_BYTE_START_TRANSFER: digitalWrite(13, 1); - u8g2_gpio_SetCS(u8g2, arg_int); + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_chip_enable_wait_ns, NULL); break; case U8G2_MSG_BYTE_END_TRANSFER: - u8g2_gpio_SetCS(u8g2, arg_int); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); break; case U8G2_MSG_BYTE_SET_I2C_ADR: break; From 7d0b86e87dd283ef77668bfeea839ebbbb472a22 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:12:47 +0200 Subject: [PATCH 027/109] u8g2 --- u8g2/csrc/u8g2.h | 56 +++++++++++++++++++++---------- u8g2/csrc/u8g2_cad.c | 28 +--------------- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 52 +++++++++------------------- u8g2/csrc/u8g2_gpio.c | 7 ++++ u8g2/sys/arduino/test/test.ino | 4 +-- 5 files changed, 64 insertions(+), 83 deletions(-) create mode 100644 u8g2/csrc/u8g2_gpio.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 9f067455..da66b367 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -65,6 +65,15 @@ extern "C" { #endif +#ifdef __GNUC__ +# define U8G2_NOINLINE __attribute__((noinline)) +#else +# define U8G2_NOINLINE +#endif + + + + typedef struct u8g2_struct u8g2_t; typedef struct u8g2_display_info_struct u8g2_display_info_t; @@ -202,23 +211,30 @@ void u8g2_display_Init(u8g2_t *u8g2); #define u8g2_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8G2_MSG_CAD_INIT, 0, NULL )) /* u8g_cad.c */ -uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd); -uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg); -uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data); -uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2); -uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2); - -#define U8G2_C(c0) (0x04), (c0) -#define U8G2_CA(c0,a0) (0x05), (c0), (a0) +uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) U8G2_NOINLINE; +uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) U8G2_NOINLINE; +uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; +uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) U8G2_NOINLINE; +uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; + +#define U8G2_C(c0) (0x04), (c0) +#define U8G2_CA(c0,a0) (0x05), (c0), (a0) #define U8G2_CAA(c0,a0,a1) (0x06), (c0), (a0), (a1) -#define U8G2_DATA() (0x10) -#define U8G2_D1(d0) (0x11), (d0) -#define U8G2_START_CS0() (0xf0) -#define U8G2_START_CS1() (0xf1) -#define U8G2_END_CS0() (0xf2) -#define U8G2_END_CS1() (0xf3) -#define U8G2_DLY(m) (0xfe),(m) -#define U8G2_END() (0xff) +#define U8G2_DATA() (0x10) +#define U8G2_D1(d0) (0x11), (d0) + +/* +#define U8G2_C(c0) (0x80), (c0) +#define U8G2_CA(c0,a0) (0x80), (c0), (0x81), (a0) +#define U8G2_CAA(c0,a0,a1) (0x80), (c0), (0x81), (a0), (0x81), (a1) +#define U8G2_DATA() (0x82) +#define U8G2_D1(d0) (0x83), (d0) +*/ + +#define U8G2_START_TRANSFER() (0xf0) +#define U8G2_END_TRANSFER() (0xf2) +#define U8G2_DLY(m) (0xfe),(m) +#define U8G2_END() (0xff) void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data); uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); @@ -240,8 +256,8 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) #define U8G2_MSG_BYTE_SET_DEVICE U8G2_MSG_CAD_SET_DEVICE -uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc); -uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); +uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) U8G2_NOINLINE; +uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte) U8G2_NOINLINE; /*==========================================*/ /* GPIO Interface */ @@ -259,6 +275,7 @@ uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); #define U8G2_MSG_DELAY_10MICRO 42 #define U8G2_MSG_DELAY_100NANO 43 +#define U8G2_MSG_DELAY_NANO 44 #define U8G2_MSG_GPIO_DC 45 #define U8G2_MSG_GPIO_CS 46 @@ -270,6 +287,9 @@ uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte); #define u8g2_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_CS, (v), NULL )) #define u8g2_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_RESET, (v), NULL )) +void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) U8G2_NOINLINE; + + /*==========================================*/ /* u8g2.c */ void u8g2_Init(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 457f25c2..2b7f2fbd 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -74,18 +74,6 @@ uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_DATA, cnt, data); } -/* -uint8_t u8g2_cad_Reset1(u8g2_t *u8g2) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 1, NULL); -} - -uint8_t u8g2_cad_Reset0(u8g2_t *u8g2) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_RESET, 0, NULL); -} -*/ - uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) { return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_START_TRANSFER, 0, NULL); @@ -151,18 +139,12 @@ void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) case 0: u8g2_cad_StartTransfer(u8g2); break; - case 1: - u8g2_cad_StartTransfer(u8g2); - break; case 2: u8g2_cad_EndTransfer(u8g2); break; - case 3: - u8g2_cad_EndTransfer(u8g2); - break; case 14: v = *data++; - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, v, NULL); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, v); break; default: return; @@ -200,13 +182,9 @@ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; case U8G2_MSG_CAD_INIT: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_SET_I2C_ADR: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_SET_DEVICE: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); default: @@ -240,13 +218,9 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); break; case U8G2_MSG_CAD_INIT: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_START_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_END_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_SET_I2C_ADR: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); case U8G2_MSG_CAD_SET_DEVICE: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); default: diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 9eab5ea0..765ca3e5 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -6,14 +6,8 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { - /* the following sequence ensures that the chip select is high */ - U8G2_START_CS0(), /* enable chip */ - U8G2_DLY(1), /* delay 1 ms */ - U8G2_END_CS1(), /* ensure that chip is disabled */ - U8G2_DLY(1), /* delay 1 ms */ - U8G2_START_CS0(), /* enable chip */ - U8G2_DLY(1), /* delay 1 ms */ + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0e2), /* soft reset */ U8G2_C(0x0ae), /* display off */ @@ -38,21 +32,21 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { //U8G2_DLY(50), /* delay 100 ms */ //U8G2_C(0x0a4), /* normal display */ - //U8G2_C(0x010), /* col hi adr 0 */ - //U8G2_C(0x000), /* col lo adr 0 */ - //U8G2_C(0x0b0), /* page 0 */ + U8G2_C(0x010), /* col hi adr 0 */ + U8G2_C(0x000), /* col lo adr 0 */ + U8G2_C(0x0b0), /* page 0 */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ - U8G2_END_CS1(), /* disable chip */ + U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; @@ -92,11 +86,11 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void /* 4) do reset */ u8g2_gpio_SetReset(u8g2, 1); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); u8g2_gpio_SetReset(u8g2, 0); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms, NULL); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); u8g2_gpio_SetReset(u8g2, 1); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms, NULL); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); /* 5) send startup code */ u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); @@ -127,17 +121,3 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void } -/* -static u8g2_mcd_t u8g2_mcd_byte_stdio; -static u8g2_mcd_t u8g2_mcd_cad; -static u8g2_mcd_t u8g2_mcd_display; - - -void u8g2_InitUC1701DOGS102(u8g2_t *u8g2) -{ - u8g2_Init(u8g2); - u8g2_Chain(u8g2, &u8g2_mcd_byte_stdio, u8g2_byte_stdio); - u8g2_Chain(u8g2, &u8g2_cad_110, u8g2_mcd_cad); - u8g2_Chain(u8g2, &u8g2_d_uc1701_dogs102, u8g2_mcd_display); -} -*/ diff --git a/u8g2/csrc/u8g2_gpio.c b/u8g2/csrc/u8g2_gpio.c new file mode 100644 index 00000000..f6508ebd --- /dev/null +++ b/u8g2/csrc/u8g2_gpio.c @@ -0,0 +1,7 @@ + +#include "u8g2.h" + +void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) +{ + u8g2->gpio_and_delay_cb(u8g2, msg, dly, NULL); +} \ No newline at end of file diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index b2a88816..22f1e71d 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -103,10 +103,10 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo case U8G2_MSG_BYTE_START_TRANSFER: digitalWrite(13, 1); u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_chip_enable_wait_ns, NULL); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); break; case U8G2_MSG_BYTE_END_TRANSFER: - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); break; case U8G2_MSG_BYTE_SET_I2C_ADR: From 8a71c78404f8c7aafe535ef831a2a309d2bb41d4 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:14:26 +0200 Subject: [PATCH 028/109] u8g2 --- u8g2/csrc/u8g2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index da66b367..cdcf4733 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -231,6 +231,7 @@ uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; #define U8G2_D1(d0) (0x83), (d0) */ + #define U8G2_START_TRANSFER() (0xf0) #define U8G2_END_TRANSFER() (0xf2) #define U8G2_DLY(m) (0xfe),(m) From 01e7ca246e1b25290b5fb5ff8258fd44b6531ec1 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:19:03 +0200 Subject: [PATCH 029/109] u8g2 --- u8g2/csrc/u8g2.h | 7 ++--- u8g2/csrc/u8g2_cad.c | 70 ++++++++++++++++---------------------------- 2 files changed, 28 insertions(+), 49 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index cdcf4733..91773c30 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -217,19 +217,18 @@ uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLIN uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) U8G2_NOINLINE; uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; +/* #define U8G2_C(c0) (0x04), (c0) #define U8G2_CA(c0,a0) (0x05), (c0), (a0) #define U8G2_CAA(c0,a0,a1) (0x06), (c0), (a0), (a1) #define U8G2_DATA() (0x10) #define U8G2_D1(d0) (0x11), (d0) +*/ -/* #define U8G2_C(c0) (0x80), (c0) #define U8G2_CA(c0,a0) (0x80), (c0), (0x81), (a0) #define U8G2_CAA(c0,a0,a1) (0x80), (c0), (0x81), (a0), (0x81), (a1) -#define U8G2_DATA() (0x82) -#define U8G2_D1(d0) (0x83), (d0) -*/ +#define U8G2_D1(d0) (0x82), (d0) #define U8G2_START_TRANSFER() (0xf0) diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 2b7f2fbd..784a64c6 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -96,59 +96,39 @@ uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) { - uint8_t hi, lo; + uint8_t cmd; uint8_t v; for(;;) { - hi = *data; - lo = hi; - hi >>= 4; - lo &= 0x0f; + cmd = *data; data++; - switch( hi ) + switch( cmd ) { - case 0: - while( lo > 3 ) - { - v = *data; - u8g2_cad_SendCmd(u8g2, v); - data++; - lo-=4; - } - while( lo > 0 ) - { - v = *data; - u8g2_cad_SendArg(u8g2, v); - data++; - lo--; - } + case 0x080: + v = *data; + u8g2_cad_SendCmd(u8g2, v); + data++; break; - case 1: - while( lo > 0 ) - { - v = *data; - u8g2_cad_SendData(u8g2, 1, &v); - data++; - lo--; - } + case 0x081: + v = *data; + u8g2_cad_SendArg(u8g2, v); + data++; break; - case 15: - switch(lo) - { - case 0: - u8g2_cad_StartTransfer(u8g2); - break; - case 2: - u8g2_cad_EndTransfer(u8g2); - break; - case 14: - v = *data++; - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, v); - break; - default: - return; - } + case 0x082: + v = *data; + u8g2_cad_SendData(u8g2, 1, &v); + data++; + break; + case 0x0f0: + u8g2_cad_StartTransfer(u8g2); + break; + case 0x0f2: + u8g2_cad_EndTransfer(u8g2); + break; + case 0x0fe: + v = *data++; + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, v); break; default: return; From bf8865fe8bf531fa28514705608601a8e909bde6 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:32:03 +0200 Subject: [PATCH 030/109] simplified cmd sequence --- u8g2/csrc/u8g2.h | 12 ++++++------ u8g2/csrc/u8g2_cad.c | 23 +++++++++-------------- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 22 +++++++++++----------- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 91773c30..15ade3f8 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -225,14 +225,14 @@ uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; #define U8G2_D1(d0) (0x11), (d0) */ -#define U8G2_C(c0) (0x80), (c0) -#define U8G2_CA(c0,a0) (0x80), (c0), (0x81), (a0) -#define U8G2_CAA(c0,a0,a1) (0x80), (c0), (0x81), (a0), (0x81), (a1) -#define U8G2_D1(d0) (0x82), (d0) +#define U8G2_C(c0) (U8G2_MSG_CAD_SEND_CMD), (c0) +#define U8G2_CA(c0,a0) (U8G2_MSG_CAD_SEND_CMD), (c0), (U8G2_MSG_CAD_SEND_ARG), (a0) +#define U8G2_CAA(c0,a0,a1) (U8G2_MSG_CAD_SEND_CMD), (c0), (U8G2_MSG_CAD_SEND_ARG), (a0), (U8G2_MSG_CAD_SEND_ARG), (a1) +#define U8G2_D1(d0) (U8G2_MSG_CAD_SEND_DATA), (d0) -#define U8G2_START_TRANSFER() (0xf0) -#define U8G2_END_TRANSFER() (0xf2) +#define U8G2_START_TRANSFER() (U8G2_MSG_CAD_START_TRANSFER) +#define U8G2_END_TRANSFER() (U8G2_MSG_CAD_END_TRANSFER) #define U8G2_DLY(m) (0xfe),(m) #define U8G2_END() (0xff) diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 784a64c6..6c917f74 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -105,30 +105,25 @@ void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) data++; switch( cmd ) { - case 0x080: + case U8G2_MSG_CAD_SEND_CMD: + case U8G2_MSG_CAD_SEND_ARG: v = *data; - u8g2_cad_SendCmd(u8g2, v); + u8g2->cad_cb(u8g2, cmd, v, NULL); data++; break; - case 0x081: - v = *data; - u8g2_cad_SendArg(u8g2, v); - data++; - break; - case 0x082: + case U8G2_MSG_CAD_SEND_DATA: v = *data; u8g2_cad_SendData(u8g2, 1, &v); data++; break; - case 0x0f0: - u8g2_cad_StartTransfer(u8g2); - break; - case 0x0f2: - u8g2_cad_EndTransfer(u8g2); + case U8G2_MSG_CAD_START_TRANSFER: + case U8G2_MSG_CAD_END_TRANSFER: + u8g2->cad_cb(u8g2, cmd, 0, NULL); break; case 0x0fe: - v = *data++; + v = *data; u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, v); + data++; break; default: return; diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 765ca3e5..417d4238 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -32,18 +32,18 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { //U8G2_DLY(50), /* delay 100 ms */ //U8G2_C(0x0a4), /* normal display */ - U8G2_C(0x010), /* col hi adr 0 */ - U8G2_C(0x000), /* col lo adr 0 */ - U8G2_C(0x0b0), /* page 0 */ + //U8G2_C(0x010), /* col hi adr 0 */ + //U8G2_C(0x000), /* col lo adr 0 */ + //U8G2_C(0x0b0), /* page 0 */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ U8G2_END_TRANSFER(), /* disable chip */ From ba408632e54690bc67b2378c52d4e98c6c83a9b0 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:33:12 +0200 Subject: [PATCH 031/109] simplified cmd sequence --- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 417d4238..765ca3e5 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -32,18 +32,18 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { //U8G2_DLY(50), /* delay 100 ms */ //U8G2_C(0x0a4), /* normal display */ - //U8G2_C(0x010), /* col hi adr 0 */ - //U8G2_C(0x000), /* col lo adr 0 */ - //U8G2_C(0x0b0), /* page 0 */ + U8G2_C(0x010), /* col hi adr 0 */ + U8G2_C(0x000), /* col lo adr 0 */ + U8G2_C(0x0b0), /* page 0 */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ + U8G2_D1(0x0ff), /* data */ U8G2_END_TRANSFER(), /* disable chip */ From 1f491bf2bb82857c46725798dc258af64689c695 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 14:55:33 +0200 Subject: [PATCH 032/109] simplified cmd sequence --- u8g2/csrc/u8g2.h | 7 ++++- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 43 +++++++++++++++++++++---------- u8g2/csrc/u8g2_display.c | 10 +++++++ u8g2/sys/arduino/test/test.ino | 1 + 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 15ade3f8..64682ddd 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -10,11 +10,11 @@ The topmost level is the display layer. It includes the following messages: U8G2_MSG_DISPLAY_INIT - U8G2_MSG_DISPLAY_POWER_DOWN U8G2_MSG_DISPLAY_POWER_UP U8G2_MSG_DISPLAY_SET_CONTRAST U8G2_MSG_DISPLAY_DRAW_TILE U8G2_MSG_DISPLAY_GET_LAYOUT + U8G2_MSG_DISPLAY_POWER_DOWN A display driver may decided to breakdown these messages to a lower level interface or implement this functionality directly. @@ -178,7 +178,12 @@ struct u8g2_struct /* u8g2_display.c */ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); + +/* Init display, but keep display in power save mode. Usually this command must be followed by u8g2_display_PowerUp() */ void u8g2_display_Init(u8g2_t *u8g2); +/* wake up display from power save mode */ +void u8g2_display_PowerUp(u8g2_t *u8g2); +void u8g2_display_PowerDown(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 765ca3e5..328fcdeb 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -5,8 +5,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { - - + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0e2), /* soft reset */ @@ -23,7 +22,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_C(0x0fa), /* Set Temp compensation */ U8G2_C(0x090), /* 0.11 deg/c WP Off WC Off*/ U8G2_C(0x0a4), /* normal display */ - U8G2_C(0x0af), /* display on */ + //U8G2_C(0x0af), /* display on */ //U8G2_DLY(50), /* delay 100 ms */ @@ -32,24 +31,38 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { //U8G2_DLY(50), /* delay 100 ms */ //U8G2_C(0x0a4), /* normal display */ - U8G2_C(0x010), /* col hi adr 0 */ - U8G2_C(0x000), /* col lo adr 0 */ - U8G2_C(0x0b0), /* page 0 */ + //U8G2_C(0x010), /* col hi adr 0 */ + //U8G2_C(0x000), /* col lo adr 0 */ + //U8G2_C(0x0b0), /* page 0 */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ - U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ + //U8G2_D1(0x0ff), /* data */ U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; +static const uint8_t u8g2_d_uc1701_dogs102_power_up_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0af), /* display on */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static const uint8_t u8g2_d_uc1701_dogs102_power_down_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0ae), /* display off */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + static u8g2_display_info_t u8g2_uc1601_display_info = { /* chip_enable_level = */ 0, @@ -97,8 +110,10 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void break; case U8G2_MSG_DISPLAY_POWER_DOWN: + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_power_down_seq); break; case U8G2_MSG_DISPLAY_POWER_UP: + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_power_up_seq); break; case U8G2_MSG_DISPLAY_SET_CONTRAST: break; diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c index ab9b7e85..e4e69072 100644 --- a/u8g2/csrc/u8g2_display.c +++ b/u8g2/csrc/u8g2_display.c @@ -49,3 +49,13 @@ void u8g2_display_Init(u8g2_t *u8g2) { u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_INIT, 0, NULL); } + +void u8g2_display_PowerUp(u8g2_t *u8g2) +{ + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_UP, 0, NULL); +} + +void u8g2_display_PowerDown(u8g2_t *u8g2) +{ + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_DOWN, 0, NULL); +} diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 22f1e71d..7071cd8e 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -147,6 +147,7 @@ void setup(void) void loop(void) { u8g2_display_Init(&u8g2); + u8g2_display_PowerUp(&u8g2); u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); From f05765b5b2160c8f520b08e0bf2909c76ef6c86c Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 12 Sep 2015 17:14:22 +0200 Subject: [PATCH 033/109] u8g2 optimization --- u8g2/csrc/u8g2.c | 2 +- u8g2/csrc/u8g2.h | 8 ++++---- u8g2/csrc/u8g2_byte.c | 9 +++++++-- u8g2/csrc/u8g2_cad.c | 24 +++++++++------------- u8g2/csrc/u8g2_d_stdio.c | 9 +++++---- u8g2/sys/arduino/test/test.ino | 37 +++++++++++++++++++++------------- 6 files changed, 50 insertions(+), 39 deletions(-) diff --git a/u8g2/csrc/u8g2.c b/u8g2/csrc/u8g2.c index 5f1b8f42..29d75a66 100644 --- a/u8g2/csrc/u8g2.c +++ b/u8g2/csrc/u8g2.c @@ -20,7 +20,7 @@ uint8_t u8g2_dummy_cb(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr Args: u8g2 An empty u8g2 structure */ -void u8g2_Init(u8g2_t *u8g2) +void u8g2_SetupDefaults(u8g2_t *u8g2) { u8g2->display_info = NULL; u8g2->display_cb = u8g2_dummy_cb; diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 64682ddd..e9336e2a 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -250,9 +250,9 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) /* Byte Interface */ #define U8G2_MSG_BYTE_INIT U8G2_MSG_CAD_INIT -#define U8G2_MSG_BYTE_SEND 31 #define U8G2_MSG_BYTE_SET_DC 32 +#define U8G2_MSG_BYTE_SEND U8G2_MSG_CAD_SEND_DATA #define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER #define U8G2_MSG_BYTE_END_TRANSFER U8G2_MSG_CAD_END_TRANSFER @@ -262,7 +262,8 @@ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) U8G2_NOINLINE; -uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte) U8G2_NOINLINE; +uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) U8G2_NOINLINE; +uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; /*==========================================*/ /* GPIO Interface */ @@ -297,8 +298,7 @@ void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) U8G2_NOINLINE; /*==========================================*/ /* u8g2.c */ -void u8g2_Init(u8g2_t *u8g2); -//void u8g2_Chain(u8g2_t *u8g2, u8g2_t *u8g2, u8g2_msg_cb cb); OBSOLETE +void u8g2_SetupDefaults(u8g2_t *u8g2); /*==========================================*/ diff --git a/u8g2/csrc/u8g2_byte.c b/u8g2/csrc/u8g2_byte.c index 40710b04..99392c7c 100644 --- a/u8g2/csrc/u8g2_byte.c +++ b/u8g2/csrc/u8g2_byte.c @@ -11,9 +11,14 @@ uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SET_DC, dc, NULL); } -uint8_t u8g2_byte_Send(u8g2_t *u8g2, uint8_t byte) +uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) { - return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SEND, byte, NULL); + return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SEND, cnt, (void *)data); +} + +uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) +{ + return u8g2_byte_SendBytes(u8g2, 1, &byte); } uint8_t u8g2_byte_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index 6c917f74..f721b59d 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -139,23 +139,21 @@ void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) */ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) { - uint8_t i; - switch(msg) { case U8G2_MSG_CAD_SEND_CMD: u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_ARG: u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_DATA: u8g2_byte_SetDC(u8g2, 0); - for( i = 0; i < arg_int; i++ ) - u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); - break; + //u8g2_byte_SendBytes(u8g2, arg_int, arg_ptr); + //break; + /* fall through */ case U8G2_MSG_CAD_INIT: case U8G2_MSG_CAD_START_TRANSFER: case U8G2_MSG_CAD_END_TRANSFER: @@ -175,23 +173,21 @@ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) */ uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) { - uint8_t i; - switch(msg) { case U8G2_MSG_CAD_SEND_CMD: u8g2_byte_SetDC(u8g2, 0); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_ARG: u8g2_byte_SetDC(u8g2, 0); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_DATA: u8g2_byte_SetDC(u8g2, 1); - for( i = 0; i < arg_int; i++ ) - u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); - break; + //u8g2_byte_SendBytes(u8g2, arg_int, arg_ptr); + //break; + /* fall through */ case U8G2_MSG_CAD_INIT: case U8G2_MSG_CAD_START_TRANSFER: case U8G2_MSG_CAD_END_TRANSFER: diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c index abf049d1..9a09e089 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -44,6 +44,7 @@ uint8_t u8g2_byte_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_p switch(msg) { case U8G2_MSG_BYTE_SEND: + /* 12 sep 15: wrong, args have changed, code must be updated to support multiple bytes */ if ( dc == 0 ) { buf[i] = arg_int; @@ -89,16 +90,16 @@ uint8_t u8g2_cad_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_pt { case U8G2_MSG_CAD_SEND_CMD: u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_ARG: u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_Send(u8g2, arg_int); + u8g2_byte_SendByte(u8g2, arg_int); break; case U8G2_MSG_CAD_SEND_DATA: u8g2_byte_SetDC(u8g2, 0); for( i = 0; i < 8; i++ ) - u8g2_byte_Send(u8g2, ((uint8_t *)arg_ptr)[i]); + u8g2_byte_SendByte(u8g2, ((uint8_t *)arg_ptr)[i]); break; case U8G2_MSG_CAD_START_TRANSFER: return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); @@ -146,7 +147,7 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) void u8g2_InitStdio(u8g2_t *u8g2) { - u8g2_Init(u8g2); + u8g2_SetupDefaults(u8g2); u8g2->display_cb = u8g2_d_stdio; u8g2->cad_cb = u8g2_cad_stdio; u8g2->byte_cb = u8g2_byte_stdio; diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 7071cd8e..08c9c832 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -78,24 +78,33 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) { - uint8_t i; + uint8_t i, b; + uint8_t *data; + switch(msg) { case U8G2_MSG_BYTE_SEND: - for( i = 0; i < 8; i++ ) + data = (uint8_t *)arg_ptr; + while( arg_int > 0 ) { - if ( arg_int & 128 ) - digitalWrite(11, 1); - else - digitalWrite(11, 0); - arg_int <<= 1; - delay(1); - digitalWrite(13, 0); - delay(1); - digitalWrite(13, 1); - delay(1); - } + b = *data; + data++; + arg_int--; + for( i = 0; i < 8; i++ ) + { + if ( b & 128 ) + digitalWrite(11, 1); + else + digitalWrite(11, 0); + b <<= 1; + delay(1); + digitalWrite(13, 0); + delay(1); + digitalWrite(13, 1); + delay(1); + } + } break; case U8G2_MSG_BYTE_SET_DC: u8g2_gpio_SetDC(u8g2, arg_int); @@ -122,7 +131,7 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) { /* setup defaults */ - u8g2_Init(u8g2); + u8g2_SetupDefaults(u8g2); /* setup specific callbacks */ u8g2->display_cb = u8g2_d_uc1701_dogs102; From 549e460b7e2d0d2aab02608d8f18cd1ed4428912 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 13 Sep 2015 21:49:01 +0200 Subject: [PATCH 034/109] u8g2 optimization --- u8g2/csrc/u8g2.c | 3 +- u8g2/csrc/u8g2.h | 47 ++++++++++-- u8g2/csrc/u8g2_8x8.c | 55 ++++++++++++++ u8g2/csrc/u8g2_cad.c | 4 +- u8g2/csrc/u8g2_d_stdio.c | 103 +++----------------------- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 2 +- u8g2/csrc/u8g2_display.c | 25 +++++++ u8g2/csrc/u8g2_gpio.c | 10 ++- u8g2/sys/arduino/test/test.ino | 115 +++++++++++++++++++++++++----- u8g2/sys/stdio/test.c | 60 +++++++++++++++- 10 files changed, 300 insertions(+), 124 deletions(-) create mode 100644 u8g2/csrc/u8g2_8x8.c diff --git a/u8g2/csrc/u8g2.c b/u8g2/csrc/u8g2.c index 29d75a66..87a33f7a 100644 --- a/u8g2/csrc/u8g2.c +++ b/u8g2/csrc/u8g2.c @@ -7,7 +7,7 @@ #include "u8g2.h" -uint8_t u8g2_dummy_cb(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_dummy_cb(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { /* the dummy callback will not handle any message and will fail for all messages */ return 0; @@ -29,3 +29,4 @@ void u8g2_SetupDefaults(u8g2_t *u8g2) u8g2->gpio_and_delay_cb = u8g2_dummy_cb; } + diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index e9336e2a..81d60e87 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -59,6 +59,9 @@ #include #include +#if defined(__GNUC__) && defined(__AVR__) +#include +#endif #ifdef __cplusplus extern "C" { @@ -71,6 +74,17 @@ extern "C" { # define U8G2_NOINLINE #endif +#if defined(__GNUC__) && defined(__AVR__) +# define U8G2_SECTION(name) __attribute__ ((section (name))) +# define U8G2_FONT_SECTION(name) U8G2_SECTION(".progmem." name) +# define u8g2_pgm_read(adr) pgm_read_byte_near(adr) +#endif + +#ifndef U8G2_SECTION +# define U8G2_SECTION(name) __attribute__ ((section (name))) +# define U8G2_FONT_SECTION(name) +# define u8g2_pgm_read(adr) (*(const uint8_t *)(adr)) +#endif @@ -81,7 +95,7 @@ typedef struct u8g2_tile_struct u8g2_tile_t; -typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); +typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); //struct u8g2_mcd_struct @@ -144,6 +158,7 @@ struct u8g2_struct u8g2_msg_cb cad_cb; u8g2_msg_cb byte_cb; u8g2_msg_cb gpio_and_delay_cb; + const uint8_t *font; }; @@ -213,9 +228,11 @@ void u8g2_display_PowerDown(u8g2_t *u8g2); #define U8G2_MSG_CAD_SET_DEVICE 27 -#define u8g2_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8G2_MSG_CAD_INIT, 0, NULL )) /* u8g_cad.c */ + +#define u8g2_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8G2_MSG_CAD_INIT, 0, NULL )) + uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) U8G2_NOINLINE; uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) U8G2_NOINLINE; uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; @@ -242,8 +259,8 @@ uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; #define U8G2_END() (0xff) void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data); -uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); -uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); +uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ @@ -289,11 +306,20 @@ uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINL #define u8g2_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) +/* #define u8g2_gpio_SetDC(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_DC, (v), NULL )) #define u8g2_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_CS, (v), NULL )) #define u8g2_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_RESET, (v), NULL )) +*/ + +#define u8g2_gpio_SetDC(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_DC, (v)) +#define u8g2_gpio_SetCS(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) +#define u8g2_gpio_SetReset(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) + +void u8g2_gpio_call(u8g2_t *u8g2, uint8_t msg, uint8_t arg) U8G2_NOINLINE; -void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) U8G2_NOINLINE; +#define u8g2_gpio_Delay(u8g2, msg, dly) u8g2_gpio_call((u8g2), (msg), (dly)) +//void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) U8G2_NOINLINE; /*==========================================*/ @@ -303,11 +329,18 @@ void u8g2_SetupDefaults(u8g2_t *u8g2); /*==========================================*/ /* u8g2_d_stdio.c */ -void u8g2_InitStdio(u8g2_t *u8g2); +void u8g2_SetupStdio(u8g2_t *u8g2); /*==========================================*/ /* u8g2_d_uc1701_dogs102.c */ -uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr); +uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); + + +/*==========================================*/ +/* u8g2_8x8.c */ +void u8g2_Set8x8Font(u8g2_t *u8g2, const uint8_t *font_8x8); +void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); +void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s); #ifdef __cplusplus diff --git a/u8g2/csrc/u8g2_8x8.c b/u8g2/csrc/u8g2_8x8.c new file mode 100644 index 00000000..f4e72eb7 --- /dev/null +++ b/u8g2/csrc/u8g2_8x8.c @@ -0,0 +1,55 @@ +/* + + u8g2_8x8.c + + font procedures, directly interfaces display procedures + +*/ + +#include "u8g2.h" + +void u8g2_Set8x8Font(u8g2_t *u8g2, const uint8_t *font_8x8) +{ + u8g2->font = font_8x8; +} + +void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) +{ + uint8_t first, last, i; + uint8_t buf[8]; + uint16_t offset; + first = u8g2_pgm_read(u8g2->font+0); + last = u8g2_pgm_read(u8g2->font+1); + + if ( first <= encoding && encoding <= last ) + { + offset = encoding; + offset -= first; + offset *= 8; + offset +=2; + for( i = 0; i < 8; i++ ) + { + buf[i] = u8g2_pgm_read(u8g2->font+offset); + offset++; + } + } + else + { + for( i = 0; i < 8; i++ ) + { + buf[i] = 0; + } + } + u8g2_display_DrawTile(u8g2, x, y, 1, buf); +} + +void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s) +{ + while( *s != '\0' ) + { + u8g2_Draw8x8Glyph(u8g2, x, y, (uint8_t)*s); + s++; + x++; + } +} + diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c index f721b59d..9e47f48a 100644 --- a/u8g2/csrc/u8g2_cad.c +++ b/u8g2/csrc/u8g2_cad.c @@ -137,7 +137,7 @@ void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) dc = 1 for commands and args and dc = 0 for data */ -uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { @@ -171,7 +171,7 @@ uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) dc = 0 for commands and args and dc = 1 for data */ -uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c index 9a09e089..c3ae4410 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -3,16 +3,16 @@ #include -#define W 4 +#define W 8 #define H 2 -uint8_t bitmap[4*2*8]; +uint8_t bitmap[W*H*8]; void bitmap_place_tile(uint8_t x, uint8_t y, uint8_t *tile) { uint8_t i; for(i = 0; i < 8; i++ ) - bitmap[x+y*W*8+i*W] = tile[i]; + bitmap[x*8+y*W*8+i] = tile[i]; } void bitmap_show(void) @@ -22,7 +22,7 @@ void bitmap_show(void) { for( x = 0; x < W*8; x++ ) { - if ( (bitmap[x/8+y*W] & (1<<(7-(x&7)))) != 0 ) + if ( (bitmap[x+(y/8)*W*8] & (1<<((y&7)))) != 0 ) { printf("*"); } @@ -35,88 +35,8 @@ void bitmap_show(void) } } -uint8_t u8g2_byte_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) -{ - static uint8_t x,y,i; - static uint8_t dc; - static uint8_t buf[8]; - - switch(msg) - { - case U8G2_MSG_BYTE_SEND: - /* 12 sep 15: wrong, args have changed, code must be updated to support multiple bytes */ - if ( dc == 0 ) - { - buf[i] = arg_int; - i++; - if ( i >= 8 ) - { - bitmap_place_tile(x, y, buf); - i = 0; - } - } - else - { - if ( arg_int <= 15 ) - x = arg_int; - else - y = arg_int & 0x0f; - } - break; - case U8G2_MSG_BYTE_SET_DC: - dc = arg_int; - break; - case U8G2_MSG_BYTE_START_TRANSFER: - break; - case U8G2_MSG_BYTE_END_TRANSFER: - bitmap_show(); - break; - case U8G2_MSG_BYTE_SET_I2C_ADR: - break; - case U8G2_MSG_BYTE_SET_DEVICE: - break; - default: - break; - } - return 1; -} - - -uint8_t u8g2_cad_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) -{ - uint8_t i; - - switch(msg) - { - case U8G2_MSG_CAD_SEND_CMD: - u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_ARG: - u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_DATA: - u8g2_byte_SetDC(u8g2, 0); - for( i = 0; i < 8; i++ ) - u8g2_byte_SendByte(u8g2, ((uint8_t *)arg_ptr)[i]); - break; - case U8G2_MSG_CAD_START_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_END_TRANSFER: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_SET_I2C_ADR: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_SET_DEVICE: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - default: - break; - } - return 1; -} - -uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { @@ -125,15 +45,12 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) case U8G2_MSG_DISPLAY_POWER_DOWN: break; case U8G2_MSG_DISPLAY_POWER_UP: + bitmap_show(); break; case U8G2_MSG_DISPLAY_SET_CONTRAST: break; - case U8G2_MSG_DISPLAY_DRAW_TILE: - u8g2_cad_StartTransfer(u8g2); - u8g2_cad_SendCmd(u8g2, ((u8g2_tile_t *)arg_ptr)->x_pos); - u8g2_cad_SendCmd(u8g2, 0xf0 | ((u8g2_tile_t *)arg_ptr)->y_pos); - u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); - u8g2_cad_EndTransfer(u8g2); + case U8G2_MSG_DISPLAY_DRAW_TILE: + bitmap_place_tile(((u8g2_tile_t *)arg_ptr)->x_pos, ((u8g2_tile_t *)arg_ptr)->y_pos, ((u8g2_tile_t *)arg_ptr)->tile_ptr); break; case U8G2_MSG_DISPLAY_GET_LAYOUT: break; @@ -145,11 +62,9 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) -void u8g2_InitStdio(u8g2_t *u8g2) +void u8g2_SetupStdio(u8g2_t *u8g2) { u8g2_SetupDefaults(u8g2); u8g2->display_cb = u8g2_d_stdio; - u8g2->cad_cb = u8g2_cad_stdio; - u8g2->byte_cb = u8g2_byte_stdio; } diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 328fcdeb..8b4bfe75 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -80,7 +80,7 @@ static u8g2_display_info_t u8g2_uc1601_display_info = /* write_pulse_width_ns = */ 40 }; -uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t x; switch(msg) diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c index e4e69072..2828cd54 100644 --- a/u8g2/csrc/u8g2_display.c +++ b/u8g2/csrc/u8g2_display.c @@ -35,6 +35,30 @@ uint8_t u8g2_d_xyz(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) #include "u8g2.h" +/* + Prototype: + uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) + Description: + Send U8G2_MSG_DISPLAY_DRAW_TILE to the display callback. + A tile is a sequence of 8 bytes (64 bits) and represents a 8x8 monochrome bitmap. + The lowest bit of the first byte is the upper left corner + The highest bit of the first byte is the lower left corner + The lowest bit of the last byte is the upper right corner + The highest bit of the last byte is the lower left corner + + Arguments: + u8g2 Pointer to the u8g2 object + x X position of the tile + y Y position of the tile + cnt Number of tiles + tile_ptr Pointer to "cnt" tiles. + Returns: + 0, if not successful or not supported + See also: + Example: + +*/ + uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) { u8g2_tile_t tile; @@ -59,3 +83,4 @@ void u8g2_display_PowerDown(u8g2_t *u8g2) { u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_DOWN, 0, NULL); } + diff --git a/u8g2/csrc/u8g2_gpio.c b/u8g2/csrc/u8g2_gpio.c index f6508ebd..fff8d7c3 100644 --- a/u8g2/csrc/u8g2_gpio.c +++ b/u8g2/csrc/u8g2_gpio.c @@ -1,7 +1,15 @@ #include "u8g2.h" + +void u8g2_gpio_call(u8g2_t *u8g2, uint8_t msg, uint8_t arg) +{ + u8g2->gpio_and_delay_cb(u8g2, msg, arg, NULL); +} + +/* void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) { u8g2->gpio_and_delay_cb(u8g2, msg, dly, NULL); -} \ No newline at end of file +} +*/ \ No newline at end of file diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 08c9c832..f8f4e88b 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -5,7 +5,67 @@ #include #include "u8g2.h" -uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +/* + Fontname: FreeType-Amstrad CPC extended-Medium-R-Normal--8-80-72-72-P-64-ISO10646-1 + Copyright: Copyright ruboku 2008 + Glyphs: 95/196 + BBX Build Mode: 3 +*/ +#include "u8g2.h" + +const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + + + +uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { @@ -41,29 +101,42 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, -uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - //uint8_t i; + uint8_t *data; switch(msg) { case U8G2_MSG_BYTE_SEND: - SPI.begin(); - - //for( i = 0; i < arg_int; i++ ) - // SPI.transfer(((uint8_t *)arg_ptr)[i]); - SPI.transfer((uint8_t)arg_int); - SPI.end(); + + data = (uint8_t *)arg_ptr; + while( arg_int > 0 ) + { + SPI.transfer((uint8_t)*data); + data++; + arg_int--; + } + break; + case U8G2_MSG_BYTE_INIT: + /* for SPI: setup correct level of the clock signal */ + digitalWrite(13, 1); break; case U8G2_MSG_BYTE_SET_DC: - //digitalWrite(9, arg_int); // TODO: Call to GPIO callback u8g2_gpio_SetDC(u8g2, arg_int); break; case U8G2_MSG_BYTE_START_TRANSFER: - u8g2_gpio_SetCS(u8g2, arg_int); + SPI.begin(); + SPI.setClockDivider( SPI_CLOCK_DIV2 ); + SPI.setDataMode(SPI_MODE0); + SPI.setBitOrder(MSBFIRST); + + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); break; case U8G2_MSG_BYTE_END_TRANSFER: - u8g2_gpio_SetCS(u8g2, arg_int); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + SPI.end(); break; case U8G2_MSG_BYTE_SET_I2C_ADR: break; @@ -76,7 +149,7 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo } -uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t i, b; uint8_t *data; @@ -106,11 +179,14 @@ uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, vo } } break; + case U8G2_MSG_BYTE_INIT: + /* for SPI: setup correct level of the clock signal */ + digitalWrite(13, 1); + break; case U8G2_MSG_BYTE_SET_DC: u8g2_gpio_SetDC(u8g2, arg_int); break; case U8G2_MSG_BYTE_START_TRANSFER: - digitalWrite(13, 1); u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); break; @@ -136,11 +212,9 @@ void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) /* setup specific callbacks */ u8g2->display_cb = u8g2_d_uc1701_dogs102; u8g2->cad_cb = u8g2_cad_001; - u8g2->byte_cb = u8g2_byte_arduino_sw_spi; + u8g2->byte_cb = u8g2_byte_arduino_hw_spi; u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; - /* display init (done later) */ - //u8g2_display_Init(&u8g2); } @@ -157,6 +231,13 @@ void loop(void) { u8g2_display_Init(&u8g2); u8g2_display_PowerUp(&u8g2); + + delay(500); + + u8g2_Set8x8Font(&u8g2, bdf_font); + u8g2_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); + u8g2_Draw8x8String(&u8g2, 3, 1, "World B"); + u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); diff --git a/u8g2/sys/stdio/test.c b/u8g2/sys/stdio/test.c index 1e7bffaf..3a49fa57 100644 --- a/u8g2/sys/stdio/test.c +++ b/u8g2/sys/stdio/test.c @@ -5,11 +5,69 @@ u8g2_t u8g2; +const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + int main(void) { uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; - u8g2_InitStdio(&u8g2); + u8g2_SetupStdio(&u8g2); + + u8g2_display_Init(&u8g2); + u8g2_display_PowerUp(&u8g2); + + u8g2_Set8x8Font(&u8g2, bdf_font); + u8g2_Draw8x8String(&u8g2, 0, 0, "Hello"); + u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); + u8g2_display_PowerUp(&u8g2); return 0; } \ No newline at end of file From 47b593c5a11b669e3deb3aec15ba935346004638 Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 14 Sep 2015 22:31:35 +0200 Subject: [PATCH 035/109] ssd1306 for u8g2 --- u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 121 +++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c new file mode 100644 index 00000000..61269e19 --- /dev/null +++ b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c @@ -0,0 +1,121 @@ + +#include "u8g2.h" + + + + +static const uint8_t u8g2_d_ssd1306_128x64_noname_init_seq[] = { + + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + + + U8G2_C(0x0ae), /* display off */ + U8G2_CA(0x0d5, 0x080), /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */ + U8G2_CA(0x0a8, 0x03f), /* multiplex ratio */ + U8G2_CA(0x0d3, 0x000) /* display offset */ + U8G2_C(0x040), /* set display start line to 0 */ + U8G2_CA(0x08d, 0x014), /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */ + U8G2_CA(0x020, 0x000), /* page addressing mode */ + + U8G2_C(0x0a1), /* segment remap a0/a1*/ + U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ + U8G2_CA(0x0da, 0x012), /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */ + U8G2_CA(0x081, 0x0cf), /* [2] set contrast control */ + U8G2_CA(0x0d9, 0x0f1), /* [2] pre-charge period 0x022/f1*/ + U8G2_CA(0x0db, 0x040), /* vcomh deselect level */ + + U8G2_C(0x02e), /* Deactivate scroll */ + U8G2_C(0x0a4), /* output ram to display */ + U8G2_C(0x0a6), /* none inverted normal display mode */ + + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static const uint8_t u8g2_d_ssd1306_128x64_noname_power_up_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0af), /* display on */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static const uint8_t u8g2_d_ssd1306_128x64_noname_power_down_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0ae), /* display off */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + + /* post_chip_enable_wait_ns = */ 20, + /* pre_chip_disable_wait_ns = */ 10, + /* reset_pulse_width_ms = */ 1, /* SSD1306: 3 us */ + /* post_reset_wait_ms = */ 1, + /* sda_setup_time_ns = */ 15, + /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/50 */ + /* sck_takeover_edge = */ 1, /* rising edge */ + /* i2c_bus_clock_100kHz = */ 4, + /* data_setup_time_ns = */ 40, + /* write_pulse_width_ns = */ 150 /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */ +}; + +uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t x; + switch(msg) + { + case U8G2_MSG_DISPLAY_INIT: + /* 1) set display info struct */ + u8g2->display_info = &u8g2_ssd1306_128x64_noname_display_info; + + /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ + u8g2_gpio_Init(u8g2); + u8g2_cad_Init(u8g2); + + /* 3) apply default value for chip select */ + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ + + /* 4) do reset */ + u8g2_gpio_SetReset(u8g2, 1); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8g2_gpio_SetReset(u8g2, 0); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8g2_gpio_SetReset(u8g2, 1); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); + + /* 5) send startup code */ + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_init_seq); + + break; + case U8G2_MSG_DISPLAY_POWER_DOWN: + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_power_down_seq); + break; + case U8G2_MSG_DISPLAY_POWER_UP: + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_power_up_seq); + break; + case U8G2_MSG_DISPLAY_SET_CONTRAST: + break; + case U8G2_MSG_DISPLAY_DRAW_TILE: + u8g2_cad_StartTransfer(u8g2); + x = ((u8g2_tile_t *)arg_ptr)->x_pos; + + u8g2_cad_SendCmd(u8g2, 0x010 | (x>>1) ); + u8g2_cad_SendCmd(u8g2, 0x000 | ((x&1) << 3)); + u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); + u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + u8g2_cad_EndTransfer(u8g2); + break; + case U8G2_MSG_DISPLAY_GET_LAYOUT: + break; + default: + return 0; + } + return 1; +} + + From 39faa042b7dca686a680217c369e63f38110a581 Mon Sep 17 00:00:00 2001 From: olikraus Date: Thu, 17 Sep 2015 22:10:50 +0200 Subject: [PATCH 036/109] ssd1306 --- sys/arduino/GraphicsTest/GraphicsTest.pde | 4 ++-- u8g2/csrc/u8g2.h | 3 +++ u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 6 +++--- u8g2/sys/arduino/test/test.ino | 16 ++++++++++++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 85c6a68e..0bef3b49 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -51,7 +51,7 @@ //U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM132 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128 u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -83,7 +83,7 @@ U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16 //U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16 -//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED) //U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 81d60e87..aa44f9bc 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -335,6 +335,9 @@ void u8g2_SetupStdio(u8g2_t *u8g2); /* u8g2_d_uc1701_dogs102.c */ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +/*==========================================*/ +/* u8g2_d_ssd1306_128x64_noname.c */ +uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ /* u8g2_8x8.c */ diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c index 61269e19..8918c67e 100644 --- a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c @@ -12,7 +12,7 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_init_seq[] = { U8G2_C(0x0ae), /* display off */ U8G2_CA(0x0d5, 0x080), /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */ U8G2_CA(0x0a8, 0x03f), /* multiplex ratio */ - U8G2_CA(0x0d3, 0x000) /* display offset */ + U8G2_CA(0x0d3, 0x000), /* display offset */ U8G2_C(0x040), /* set display start line to 0 */ U8G2_CA(0x08d, 0x014), /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */ U8G2_CA(0x020, 0x000), /* page addressing mode */ @@ -53,8 +53,8 @@ static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = /* post_chip_enable_wait_ns = */ 20, /* pre_chip_disable_wait_ns = */ 10, - /* reset_pulse_width_ms = */ 1, /* SSD1306: 3 us */ - /* post_reset_wait_ms = */ 1, + /* reset_pulse_width_ms = */ 100, /* SSD1306: 3 us */ + /* post_reset_wait_ms = */ 100, /* far east OLEDs need much longer setup time */ /* sda_setup_time_ns = */ 15, /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/50 */ /* sck_takeover_edge = */ 1, /* rising edge */ diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index f8f4e88b..93353b70 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -217,14 +217,26 @@ void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) } +void u8g2_Setup_SSD1306_128x64_NONAME(u8g2_t *u8g2) +{ + /* setup defaults */ + u8g2_SetupDefaults(u8g2); + + /* setup specific callbacks */ + u8g2->display_cb = u8g2_d_ssd1306_128x64_noname; + u8g2->cad_cb = u8g2_cad_001; + u8g2->byte_cb = u8g2_byte_arduino_sw_spi; + u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; +} + u8g2_t u8g2; uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; void setup(void) { - u8g2_Setup_UC1701_DOGS102(&u8g2); - //u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); + //u8g2_Setup_UC1701_DOGS102(&u8g2); + u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); } void loop(void) From f3304802675f7c41c6df1d6da24990a7822a8cbb Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 19 Sep 2015 23:26:57 +0200 Subject: [PATCH 037/109] flip mode --- u8g2/csrc/u8g2.h | 33 ++++++++++- u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 63 ++++++++++++++++++--- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 72 ++++++++++++++++++++++-- u8g2/csrc/u8g2_display.c | 27 ++++++++- u8g2/sys/arduino/test/test.ino | 40 +++++++------ 5 files changed, 201 insertions(+), 34 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index aa44f9bc..94eeebc7 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -56,6 +56,17 @@ #ifndef _U8G2_H #define _U8G2_H +/* global defines */ + + +/* Undefine this to remove u8g2_display_SetFlipMode function */ +#define U8G2_WITH_FLIP_MODE + +/* Select 0 or 1 for the default flip mode. This is not affected by U8G2_WITH_FLIP_MODE */ +#define U8G2_DEFAULT_FLIP_MODE 0 + + + #include #include @@ -68,6 +79,9 @@ extern "C" { #endif + + + #ifdef __GNUC__ # define U8G2_NOINLINE __attribute__((noinline)) #else @@ -148,6 +162,13 @@ struct u8g2_display_info_struct uint8_t data_setup_time_ns; /* UC1601: 30ns */ /* write enable pulse width */ uint8_t write_pulse_width_ns; /* UC1601: 40ns */ + + /* == layout == */ + uint8_t tile_width; + uint8_t tile_height; + + uint8_t default_x_offset; /* default x offset for the display */ + }; struct u8g2_struct @@ -159,6 +180,7 @@ struct u8g2_struct u8g2_msg_cb byte_cb; u8g2_msg_cb gpio_and_delay_cb; const uint8_t *font; + uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; @@ -182,14 +204,17 @@ struct u8g2_struct /* no args */ #define U8G2_MSG_DISPLAY_POWER_UP 12 +/* arg_int: 0 normal, 1: flip */ +#define U8G2_MSG_DISPLAY_SET_FLIP_MODE 13 + /* arg_int: 0..255 contrast value */ -#define U8G2_MSG_DISPLAY_SET_CONTRAST 13 +#define U8G2_MSG_DISPLAY_SET_CONTRAST 14 /* arg_ptr: u8g2_tile_t */ -#define U8G2_MSG_DISPLAY_DRAW_TILE 14 +#define U8G2_MSG_DISPLAY_DRAW_TILE 15 /* arg_ptr: layout struct */ -#define U8G2_MSG_DISPLAY_GET_LAYOUT 15 +#define U8G2_MSG_DISPLAY_GET_LAYOUT 16 /* u8g2_display.c */ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); @@ -199,6 +224,8 @@ void u8g2_display_Init(u8g2_t *u8g2); /* wake up display from power save mode */ void u8g2_display_PowerUp(u8g2_t *u8g2); void u8g2_display_PowerDown(u8g2_t *u8g2); +void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode); +void u8g2_display_ClearScreen(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c index 8918c67e..e8af183e 100644 --- a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c @@ -17,8 +17,14 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_init_seq[] = { U8G2_CA(0x08d, 0x014), /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */ U8G2_CA(0x020, 0x000), /* page addressing mode */ +#if U8G2_DEFAULT_FLIP_MODE == 0 U8G2_C(0x0a1), /* segment remap a0/a1*/ U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ +#else + U8G2_C(0x0a0), /* segment remap a0/a1*/ + U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ +#endif + U8G2_CA(0x0da, 0x012), /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */ U8G2_CA(0x081, 0x0cf), /* [2] set contrast control */ U8G2_CA(0x0d9, 0x0f1), /* [2] pre-charge period 0x022/f1*/ @@ -46,6 +52,22 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_power_down_seq[] = { U8G2_END() /* end of sequence */ }; +static const uint8_t u8g2_d_ssd1306_128x64_noname_flip0_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0a1), /* segment remap a0/a1*/ + U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static const uint8_t u8g2_d_ssd1306_128x64_noname_flip1_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0a0), /* segment remap a0/a1*/ + U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = { /* chip_enable_level = */ 0, @@ -60,17 +82,22 @@ static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = /* sck_takeover_edge = */ 1, /* rising edge */ /* i2c_bus_clock_100kHz = */ 4, /* data_setup_time_ns = */ 40, - /* write_pulse_width_ns = */ 150 /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */ + /* write_pulse_width_ns = */ 150, /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */ + /* tile_width = */ 16, + /* tile_hight = */ 8, + /* default_x_offset = */ 0 }; uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - uint8_t x; + uint8_t x, c; + uint8_t *ptr; switch(msg) { case U8G2_MSG_DISPLAY_INIT: /* 1) set display info struct */ u8g2->display_info = &u8g2_ssd1306_128x64_noname_display_info; + u8g2->x_offset = u8g2->display_info->default_x_offset; /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ u8g2_gpio_Init(u8g2); @@ -98,16 +125,38 @@ uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, case U8G2_MSG_DISPLAY_POWER_UP: u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_power_up_seq); break; +#ifdef U8G2_WITH_FLIP_MODE + case U8G2_MSG_DISPLAY_SET_FLIP_MODE: + if ( arg_int == 0 ) + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip0_seq); + else + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip1_seq); +#endif + break; case U8G2_MSG_DISPLAY_SET_CONTRAST: break; case U8G2_MSG_DISPLAY_DRAW_TILE: u8g2_cad_StartTransfer(u8g2); - x = ((u8g2_tile_t *)arg_ptr)->x_pos; - - u8g2_cad_SendCmd(u8g2, 0x010 | (x>>1) ); - u8g2_cad_SendCmd(u8g2, 0x000 | ((x&1) << 3)); + x = ((u8g2_tile_t *)arg_ptr)->x_pos; + x *= 8; + x += u8g2->x_offset; + u8g2_cad_SendCmd(u8g2, 0x010 | (x>>4) ); + u8g2_cad_SendCmd(u8g2, 0x000 | ((x&15))); u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); - u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + + do + { + c = ((u8g2_tile_t *)arg_ptr)->cnt; + ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; + do + { + u8g2_cad_SendData(u8g2, 8, ptr); + ptr += 8; + c--; + } while( c > 0 ); + arg_int--; + } while( arg_int > 0 ); + u8g2_cad_EndTransfer(u8g2); break; case U8G2_MSG_DISPLAY_GET_LAYOUT: diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 8b4bfe75..a2f09416 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -11,8 +11,14 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_C(0x0e2), /* soft reset */ U8G2_C(0x0ae), /* display off */ U8G2_C(0x040), /* set display start line to 0 */ + +#if U8G2_DEFAULT_FLIP_MODE == 0 U8G2_C(0x0a1), /* ADC set to reverse */ U8G2_C(0x0c0), /* common output mode */ +#else + U8G2_C(0x0a0), /* ADC set to reverse */ + U8G2_C(0x0c8), /* common output mode */ +#endif U8G2_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */ U8G2_C(0x0a2), /* LCD bias 1/9 */ U8G2_C(0x02f), /* all power control circuits on */ @@ -63,6 +69,23 @@ static const uint8_t u8g2_d_uc1701_dogs102_power_down_seq[] = { U8G2_END() /* end of sequence */ }; +static const uint8_t u8g2_d_uc1701_dogs102_flip0_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0a1), /* segment remap a0/a1*/ + U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + +static const uint8_t u8g2_d_uc1701_dogs102_flip1_seq[] = { + U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8G2_C(0x0a0), /* segment remap a0/a1*/ + U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ + U8G2_END_TRANSFER(), /* disable chip */ + U8G2_END() /* end of sequence */ +}; + + static u8g2_display_info_t u8g2_uc1601_display_info = { /* chip_enable_level = */ 0, @@ -77,17 +100,26 @@ static u8g2_display_info_t u8g2_uc1601_display_info = /* sck_takeover_edge = */ 1, /* rising edge */ /* i2c_bus_clock_100kHz = */ 37, /* data_setup_time_ns = */ 30, - /* write_pulse_width_ns = */ 40 + /* write_pulse_width_ns = */ 40, + /* tile_width = */ 13, + /* tile_hight = */ 8, +#if U8G2_DEFAULT_FLIP_MODE == 0 + /* default_x_offset = */ 0, +#else + /* default_x_offset = */ 30, +#endif }; uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - uint8_t x; + uint8_t x, c; + uint8_t *ptr; switch(msg) { case U8G2_MSG_DISPLAY_INIT: /* 1) set display info struct */ u8g2->display_info = &u8g2_uc1601_display_info; + u8g2->x_offset = u8g2->display_info->default_x_offset; /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ u8g2_gpio_Init(u8g2); @@ -115,16 +147,44 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * case U8G2_MSG_DISPLAY_POWER_UP: u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_power_up_seq); break; + #ifdef U8G2_WITH_FLIP_MODE + case U8G2_MSG_DISPLAY_SET_FLIP_MODE: + if ( arg_int == 0 ) + { + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_flip0_seq); + u8g2->x_offset = 0; + } + else + { + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_flip1_seq); + u8g2->x_offset = 30; + } +#endif + break; case U8G2_MSG_DISPLAY_SET_CONTRAST: break; case U8G2_MSG_DISPLAY_DRAW_TILE: u8g2_cad_StartTransfer(u8g2); x = ((u8g2_tile_t *)arg_ptr)->x_pos; - - u8g2_cad_SendCmd(u8g2, 0x010 | (x>>1) ); - u8g2_cad_SendCmd(u8g2, 0x000 | ((x&1) << 3)); + x *= 8; + x += u8g2->x_offset; + u8g2_cad_SendCmd(u8g2, 0x010 | (x>>4) ); + u8g2_cad_SendCmd(u8g2, 0x000 | ((x&15))); u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); - u8g2_cad_SendData(u8g2, 8, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + + do + { + c = ((u8g2_tile_t *)arg_ptr)->cnt; + ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; + do + { + u8g2_cad_SendData(u8g2, 8, ptr); + ptr += 8; + c--; + } while( c > 0 ); + arg_int--; + } while( arg_int > 0 ); + u8g2_cad_EndTransfer(u8g2); break; case U8G2_MSG_DISPLAY_GET_LAYOUT: diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c index 2828cd54..4fc7d18d 100644 --- a/u8g2/csrc/u8g2_display.c +++ b/u8g2/csrc/u8g2_display.c @@ -66,7 +66,7 @@ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, u tile.y_pos = y; tile.cnt = cnt; tile.tile_ptr = tile_ptr; - return u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, 0, (void *)&tile); + return u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); } void u8g2_display_Init(u8g2_t *u8g2) @@ -84,3 +84,28 @@ void u8g2_display_PowerDown(u8g2_t *u8g2) u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_DOWN, 0, NULL); } +void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode) +{ + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); +} + + +void u8g2_display_ClearScreen(u8g2_t *u8g2) +{ + uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + u8g2_tile_t tile; + uint8_t h; + + tile.x_pos = 0; + tile.cnt = 1; + tile.tile_ptr = buf; + + h = u8g2->display_info->tile_height; + tile.y_pos = 0; + do + { + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, u8g2->display_info->tile_width, (void *)&tile); + tile.y_pos++; + } while( tile.y_pos < h ); +} + diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 93353b70..2c552a11 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -225,7 +225,7 @@ void u8g2_Setup_SSD1306_128x64_NONAME(u8g2_t *u8g2) /* setup specific callbacks */ u8g2->display_cb = u8g2_d_ssd1306_128x64_noname; u8g2->cad_cb = u8g2_cad_001; - u8g2->byte_cb = u8g2_byte_arduino_sw_spi; + u8g2->byte_cb = u8g2_byte_arduino_hw_spi; u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; } @@ -235,29 +235,35 @@ uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; void setup(void) { - //u8g2_Setup_UC1701_DOGS102(&u8g2); - u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); + u8g2_Setup_UC1701_DOGS102(&u8g2); + //u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); } void loop(void) { u8g2_display_Init(&u8g2); - u8g2_display_PowerUp(&u8g2); + //u8g2_display_SetFlipMode(&u8g2, 1); - delay(500); - u8g2_Set8x8Font(&u8g2, bdf_font); - u8g2_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); - u8g2_Draw8x8String(&u8g2, 3, 1, "World B"); - - u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); - u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); - u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); - u8g2_display_DrawTile(&u8g2, 4, 4, 1, tile); - u8g2_display_DrawTile(&u8g2, 5, 5, 1, tile); - u8g2_display_DrawTile(&u8g2, 6, 6, 1, tile); - delay(1000); for(;;) - ; + { + u8g2_display_ClearScreen(&u8g2); + u8g2_display_PowerUp(&u8g2); + + delay(500); + + u8g2_Set8x8Font(&u8g2, bdf_font); + u8g2_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); + u8g2_Draw8x8String(&u8g2, 3, 1, "World B"); + + u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); + u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); + u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); + u8g2_display_DrawTile(&u8g2, 4, 4, 1, tile); + u8g2_display_DrawTile(&u8g2, 5, 5, 1, tile); + u8g2_display_DrawTile(&u8g2, 6, 6, 1, tile); + + delay(2000); + } } From 7baf8ba39b70d319ad0678606f455916f25077b4 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 20 Sep 2015 11:26:44 +0200 Subject: [PATCH 038/109] set contrast --- sys/arduino/GraphicsTest/GraphicsTest.pde | 2 +- u8g2/csrc/u8g2.h | 75 ++++++++++++++++++----- u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 28 +++++---- u8g2/csrc/u8g2_d_stdio.c | 9 +-- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 31 ++++++---- u8g2/csrc/u8g2_display.c | 12 ++-- u8g2/sys/arduino/test/test.ino | 5 +- 7 files changed, 106 insertions(+), 56 deletions(-) diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 0bef3b49..456f631a 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -83,7 +83,7 @@ //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16 //U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16 -U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED) //U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 94eeebc7..09055607 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -10,11 +10,10 @@ The topmost level is the display layer. It includes the following messages: U8G2_MSG_DISPLAY_INIT - U8G2_MSG_DISPLAY_POWER_UP + U8G2_MSG_DISPLAY_SET_FLIP_MODE + U8G2_MSG_DISPLAY_SET_POWER_SAVE U8G2_MSG_DISPLAY_SET_CONTRAST U8G2_MSG_DISPLAY_DRAW_TILE - U8G2_MSG_DISPLAY_GET_LAYOUT - U8G2_MSG_DISPLAY_POWER_DOWN A display driver may decided to breakdown these messages to a lower level interface or implement this functionality directly. @@ -59,8 +58,11 @@ /* global defines */ +/* Undefine this to remove u8g2_display_SetContrast function */ +#define U8G2_WITH_SET_CONTRAST + /* Undefine this to remove u8g2_display_SetFlipMode function */ -#define U8G2_WITH_FLIP_MODE +#define U8G2_WITH_SET_FLIP_MODE /* Select 0 or 1 for the default flip mode. This is not affected by U8G2_WITH_FLIP_MODE */ #define U8G2_DEFAULT_FLIP_MODE 0 @@ -192,29 +194,68 @@ struct u8g2_struct Args: None Tasks: 1) setup u8g2->display_info - 2) put interface into default state - 3) execute display reset (gpio interface) - 4) send setup sequence to display, do not activate display, "power on" will follow + copy u8g2->display_info->default_x_offset to u8g2->x_offset + + 2) put interface into default state: + execute u8g2_gpio_Init for port directions + execute u8g2_cad_Init for default port levels + 3) set CS status (not clear, may be done in cad/byte interface + 4) execute display reset (gpio interface) + 5) send setup sequence to display, do not activate display, disable "power save" will follow */ #define U8G2_MSG_DISPLAY_INIT 10 -/* no args */ -#define U8G2_MSG_DISPLAY_POWER_DOWN 11 - -/* no args */ -#define U8G2_MSG_DISPLAY_POWER_UP 12 +/* + Name: U8G2_MSG_DISPLAY_SET_POWER_SAVE + Args: arg_int: 0: normal mode (RAM is visible on the display), 1: nothing is shown + Tasks: + Depending on arg_int, put the display into normal or power save mode. + Send the corresponding sequence to the display. + In power save mode, it must be possible to modify the RAM content. +*/ +#define U8G2_MSG_DISPLAY_SET_POWER_SAVE 11 -/* arg_int: 0 normal, 1: flip */ +/* + Name: U8G2_MSG_DISPLAY_SET_FLIP_MODE + Args: arg_int: 0: normal mode, 1: flipped HW screen (180 degree) + Tasks: + Reprogramms the display controller to rotate the display by + 180 degree (arg_int = 1) or not (arg_int = 0) + This may change u8g2->x_offset if the display is smaller than the controller ram + This message should only be supported if U8G2_WITH_FLIP_MODE is defined. +*/ #define U8G2_MSG_DISPLAY_SET_FLIP_MODE 13 /* arg_int: 0..255 contrast value */ #define U8G2_MSG_DISPLAY_SET_CONTRAST 14 -/* arg_ptr: u8g2_tile_t */ +/* + Name: U8G2_MSG_DISPLAY_DRAW_TILE + Args: + arg_int: How often to repeat this tile pattern + arg_ptr: pointer to u8g2_tile_t + uint8_t *tile_ptr; pointer to one or more tiles (number is "cnt") + uint8_t cnt; number of tiles + uint8_t x_pos; first tile x position + uint8_t y_pos; first tile y position + Tasks: + One tile has exactly 8 bytes (8x8 pixel). + "tile_ptr" is the address of a memory area, which contains + one or more tiles. "cnt" will contain the exact number of + tiles in the memory areay. The size of the memory area is 8*cnt; + Multiple tiles in the memory area form a horizontal sequence, this + means the first tile is drawn at x_pos/y_pos, the second tile is drawn + at x_pos+1/y_pos, third at x_pos+2/y_pos. + "arg_int" tells how often the tile sequence should be repeated: + For example if "cnt" is two and tile_ptr points to tiles A and B, + then for arg_int = 3, the following tile sequence will be drawn: + ABABAB. Totally, cnt*arg_int tiles will be drawn. + +*/ #define U8G2_MSG_DISPLAY_DRAW_TILE 15 /* arg_ptr: layout struct */ -#define U8G2_MSG_DISPLAY_GET_LAYOUT 16 +//#define U8G2_MSG_DISPLAY_GET_LAYOUT 16 /* u8g2_display.c */ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); @@ -222,9 +263,9 @@ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, u /* Init display, but keep display in power save mode. Usually this command must be followed by u8g2_display_PowerUp() */ void u8g2_display_Init(u8g2_t *u8g2); /* wake up display from power save mode */ -void u8g2_display_PowerUp(u8g2_t *u8g2); -void u8g2_display_PowerDown(u8g2_t *u8g2); +void u8g2_display_SetPowerSave(u8g2_t *u8g2, uint8_t is_enable); void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode); +void u8g2_display_SetContrast(u8g2_t *u8g2, uint8_t value); void u8g2_display_ClearScreen(u8g2_t *u8g2); diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c index e8af183e..1ee19c32 100644 --- a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c @@ -38,20 +38,21 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_init_seq[] = { U8G2_END() /* end of sequence */ }; -static const uint8_t u8g2_d_ssd1306_128x64_noname_power_up_seq[] = { +static const uint8_t u8g2_d_ssd1306_128x64_noname_powersave0_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0af), /* display on */ U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; -static const uint8_t u8g2_d_ssd1306_128x64_noname_power_down_seq[] = { +static const uint8_t u8g2_d_ssd1306_128x64_noname_powersave1_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0ae), /* display off */ U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; +#ifdef U8G2_WITH_SET_FLIP_MODE static const uint8_t u8g2_d_ssd1306_128x64_noname_flip0_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0a1), /* segment remap a0/a1*/ @@ -67,6 +68,7 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_flip1_seq[] = { U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; +#endif static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = { @@ -119,22 +121,28 @@ uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_init_seq); break; - case U8G2_MSG_DISPLAY_POWER_DOWN: - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_power_down_seq); - break; - case U8G2_MSG_DISPLAY_POWER_UP: - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_power_up_seq); + case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + if ( arg_int == 0 ) + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_powersave0_seq); + else + u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_powersave1_seq); break; -#ifdef U8G2_WITH_FLIP_MODE +#ifdef U8G2_WITH_SET_FLIP_MODE case U8G2_MSG_DISPLAY_SET_FLIP_MODE: if ( arg_int == 0 ) u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip0_seq); else u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip1_seq); -#endif break; +#endif +#ifdef U8G2_WITH_SET_CONTRAST case U8G2_MSG_DISPLAY_SET_CONTRAST: + u8g2_cad_StartTransfer(u8g2); + u8g2_cad_SendCmd(u8g2, 0x081 ); + u8g2_cad_SendArg(u8g2, arg_int ); /* ssd1306 has range from 0 to 255 */ + u8g2_cad_EndTransfer(u8g2); break; +#endif case U8G2_MSG_DISPLAY_DRAW_TILE: u8g2_cad_StartTransfer(u8g2); x = ((u8g2_tile_t *)arg_ptr)->x_pos; @@ -159,8 +167,6 @@ uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, u8g2_cad_EndTransfer(u8g2); break; - case U8G2_MSG_DISPLAY_GET_LAYOUT: - break; default: return 0; } diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8g2_d_stdio.c index c3ae4410..bfada5f2 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8g2_d_stdio.c @@ -42,18 +42,15 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { case U8G2_MSG_DISPLAY_INIT: break; - case U8G2_MSG_DISPLAY_POWER_DOWN: - break; - case U8G2_MSG_DISPLAY_POWER_UP: - bitmap_show(); + case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + if ( arg_int == 0 ) + bitmap_show(); break; case U8G2_MSG_DISPLAY_SET_CONTRAST: break; case U8G2_MSG_DISPLAY_DRAW_TILE: bitmap_place_tile(((u8g2_tile_t *)arg_ptr)->x_pos, ((u8g2_tile_t *)arg_ptr)->y_pos, ((u8g2_tile_t *)arg_ptr)->tile_ptr); break; - case U8G2_MSG_DISPLAY_GET_LAYOUT: - break; default: break; } diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index a2f09416..06259a14 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -23,8 +23,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_C(0x0a2), /* LCD bias 1/9 */ U8G2_C(0x02f), /* all power control circuits on */ U8G2_C(0x027), /* regulator, booster and follower */ - U8G2_C(0x081), /* set contrast */ - U8G2_C(0x00e), /* contrast value, EA default: 0x010, previous value for S102: 0x0e */ + U8G2_CA(0x081, 0x00e), /* set contrast, contrast value, EA default: 0x010, previous value for S102: 0x0e */ U8G2_C(0x0fa), /* Set Temp compensation */ U8G2_C(0x090), /* 0.11 deg/c WP Off WC Off*/ U8G2_C(0x0a4), /* normal display */ @@ -55,20 +54,21 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_END() /* end of sequence */ }; -static const uint8_t u8g2_d_uc1701_dogs102_power_up_seq[] = { +static const uint8_t u8g2_d_uc1701_dogs102_powersave0_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0af), /* display on */ U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; -static const uint8_t u8g2_d_uc1701_dogs102_power_down_seq[] = { +static const uint8_t u8g2_d_uc1701_dogs102_powersave1_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0ae), /* display off */ U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; +#ifdef U8G2_WITH_SET_FLIP_MODE static const uint8_t u8g2_d_uc1701_dogs102_flip0_seq[] = { U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ U8G2_C(0x0a1), /* segment remap a0/a1*/ @@ -84,6 +84,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_flip1_seq[] = { U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ }; +#endif static u8g2_display_info_t u8g2_uc1601_display_info = @@ -141,13 +142,13 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); break; - case U8G2_MSG_DISPLAY_POWER_DOWN: - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_power_down_seq); - break; - case U8G2_MSG_DISPLAY_POWER_UP: - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_power_up_seq); + case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + if ( arg_int == 0 ) + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_powersave0_seq); + else + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_powersave1_seq); break; - #ifdef U8G2_WITH_FLIP_MODE + #ifdef U8G2_WITH_SET_FLIP_MODE case U8G2_MSG_DISPLAY_SET_FLIP_MODE: if ( arg_int == 0 ) { @@ -159,10 +160,16 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_flip1_seq); u8g2->x_offset = 30; } -#endif break; +#endif +#ifdef U8G2_WITH_SET_CONTRAST case U8G2_MSG_DISPLAY_SET_CONTRAST: + u8g2_cad_StartTransfer(u8g2); + u8g2_cad_SendCmd(u8g2, 0x081 ); + u8g2_cad_SendArg(u8g2, arg_int >> 2 ); /* uc1701 has range from 0 to 63 */ + u8g2_cad_EndTransfer(u8g2); break; +#endif case U8G2_MSG_DISPLAY_DRAW_TILE: u8g2_cad_StartTransfer(u8g2); x = ((u8g2_tile_t *)arg_ptr)->x_pos; @@ -187,8 +194,6 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * u8g2_cad_EndTransfer(u8g2); break; - case U8G2_MSG_DISPLAY_GET_LAYOUT: - break; default: return 0; } diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c index 4fc7d18d..8da611c7 100644 --- a/u8g2/csrc/u8g2_display.c +++ b/u8g2/csrc/u8g2_display.c @@ -74,19 +74,19 @@ void u8g2_display_Init(u8g2_t *u8g2) u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_INIT, 0, NULL); } -void u8g2_display_PowerUp(u8g2_t *u8g2) +void u8g2_display_SetPowerSave(u8g2_t *u8g2, uint8_t is_enable) { - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_UP, 0, NULL); + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_POWER_SAVE, is_enable, NULL); } -void u8g2_display_PowerDown(u8g2_t *u8g2) +void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode) { - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_POWER_DOWN, 0, NULL); + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); } -void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode) +void u8g2_display_SetContrast(u8g2_t *u8g2, uint8_t value) { - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); + u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_CONTRAST, value, NULL); } diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 2c552a11..a999f416 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -248,8 +248,9 @@ void loop(void) for(;;) { u8g2_display_ClearScreen(&u8g2); - u8g2_display_PowerUp(&u8g2); - + u8g2_display_SetPowerSave(&u8g2, 0); + //u8g2_display_SetContrast(&u8g2, 10); + delay(500); u8g2_Set8x8Font(&u8g2, bdf_font); From f3315008b2a96061b231c947e63ae8e38282d017 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 20 Sep 2015 22:32:56 +0200 Subject: [PATCH 039/109] spi cleanup --- u8g2/csrc/u8g2.h | 37 +++++++++-- u8g2/csrc/u8g2_byte.c | 82 +++++++++++++++++++++++- u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 28 ++------ u8g2/csrc/u8g2_d_uc1701_dogs102.c | 28 ++------ u8g2/csrc/u8g2_display.c | 71 ++++++++------------ u8g2/sys/arduino/test/test.ino | 79 ++++++----------------- 6 files changed, 164 insertions(+), 161 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 09055607..9681e1e3 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -55,8 +55,8 @@ #ifndef _U8G2_H #define _U8G2_H -/* global defines */ - +/*==========================================*/ +/* Global Defines */ /* Undefine this to remove u8g2_display_SetContrast function */ #define U8G2_WITH_SET_CONTRAST @@ -67,6 +67,8 @@ /* Select 0 or 1 for the default flip mode. This is not affected by U8G2_WITH_FLIP_MODE */ #define U8G2_DEFAULT_FLIP_MODE 0 +/*==========================================*/ +/* Includes */ #include @@ -76,12 +78,16 @@ #include #endif +/*==========================================*/ +/* C++ compatible */ + #ifdef __cplusplus extern "C" { #endif - +/*==========================================*/ +/* U8G2 internal defines */ #ifdef __GNUC__ @@ -102,6 +108,8 @@ extern "C" { # define u8g2_pgm_read(adr) (*(const uint8_t *)(adr)) #endif +/*==========================================*/ +/* U8G2 typedefs and data structures */ typedef struct u8g2_struct u8g2_t; @@ -110,7 +118,6 @@ typedef struct u8g2_display_info_struct u8g2_display_info_t; typedef struct u8g2_tile_struct u8g2_tile_t; - typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); @@ -146,12 +153,15 @@ struct u8g2_display_info_struct /* == SPI interface == */ /* after SDA has been applied, wait this much time for the SCK data takeover edge */ + /* if this is smaller than sck_pulse_width_ns, then use the value from sck_pulse_width_ns */ uint8_t sda_setup_time_ns; /* UC1601: 12ns */ /* the pulse width of the the clock signal, cycle time is twice this value */ /* max freq is 1/(2*sck_pulse_width_ns) */ uint8_t sck_pulse_width_ns; /* UC1601: 15ns */ + /* data takeover edge: 0=falling edge, 1=rising edge*/ /* initial default value for sck is low (0) for falling edge and high for rising edge */ + /* this means, default value is identical to sck_takeover_edge */ uint8_t sck_takeover_edge; /* UC1601: rising edge (1) */ /* == I2C == */ @@ -176,7 +186,7 @@ struct u8g2_display_info_struct struct u8g2_struct { //u8g2_t *u8g2_root; /* root of the message call chain */ - u8g2_display_info_t *display_info; + const u8g2_display_info_t *display_info; u8g2_msg_cb display_cb; u8g2_msg_cb cad_cb; u8g2_msg_cb byte_cb; @@ -187,6 +197,10 @@ struct u8g2_struct /*==========================================*/ + +/* helper functions */ +void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display_info); + /* Display Interface */ /* @@ -239,7 +253,11 @@ struct u8g2_struct uint8_t x_pos; first tile x position uint8_t y_pos; first tile y position Tasks: - One tile has exactly 8 bytes (8x8 pixel). + One tile has exactly 8 bytes (8x8 pixel monochrome bitmap). + The lowest bit of the first byte is the upper left corner + The highest bit of the first byte is the lower left corner + The lowest bit of the last byte is the upper right corner + The highest bit of the last byte is the lower left corner "tile_ptr" is the address of a memory area, which contains one or more tiles. "cnt" will contain the exact number of tiles in the memory areay. The size of the memory area is 8*cnt; @@ -350,6 +368,9 @@ uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) U8G2_NOINLINE; uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) U8G2_NOINLINE; uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; +uint8_t u8g2_byte_8bit_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); + + /*==========================================*/ /* GPIO Interface */ @@ -371,6 +392,8 @@ uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINL #define U8G2_MSG_GPIO_DC 45 #define U8G2_MSG_GPIO_CS 46 #define U8G2_MSG_GPIO_RESET 47 +#define U8G2_MSG_GPIO_CLOCK 48 +#define U8G2_MSG_GPIO_DATA 49 #define u8g2_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) @@ -383,6 +406,8 @@ uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINL #define u8g2_gpio_SetDC(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_DC, (v)) #define u8g2_gpio_SetCS(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) #define u8g2_gpio_SetReset(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) +#define u8g2_gpio_SetClock(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CLOCK, (v)) +#define u8g2_gpio_SetData(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_DATA, (v)) void u8g2_gpio_call(u8g2_t *u8g2, uint8_t msg, uint8_t arg) U8G2_NOINLINE; diff --git a/u8g2/csrc/u8g2_byte.c b/u8g2/csrc/u8g2_byte.c index 99392c7c..96d58c66 100644 --- a/u8g2/csrc/u8g2_byte.c +++ b/u8g2/csrc/u8g2_byte.c @@ -21,12 +21,90 @@ uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) return u8g2_byte_SendBytes(u8g2, 1, &byte); } -uint8_t u8g2_byte_spi(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) + + +/* + Uses: + u8g2->display_info->sda_setup_time_ns + u8g2->display_info->sck_pulse_width_ns + u8g2->display_info->sck_takeover_edge + u8g2->display_info->chip_disable_level + u8g2->display_info->chip_enable_level + u8g2->display_info->post_chip_enable_wait_ns + u8g2->display_info->pre_chip_disable_wait_ns + Calls to GPIO and DELAY: + U8G2_MSG_DELAY_NANO + U8G2_MSG_GPIO_DC + U8G2_MSG_GPIO_CS + U8G2_MSG_GPIO_CLOCK + U8G2_MSG_GPIO_DATA + Handles: + U8G2_MSG_BYTE_INIT + U8G2_MSG_BYTE_SEND + U8G2_MSG_BYTE_SET_DC + U8G2_MSG_BYTE_START_TRANSFER + U8G2_MSG_BYTE_END_TRANSFER + U8G2_MSG_BYTE_SET_I2C_ADR (ignored) + U8G2_MSG_BYTE_SET_DEVICE (ignored) +*/ +uint8_t u8g2_byte_8bit_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { + uint8_t i, b; + uint8_t *data; + uint8_t takeover_edge = u8g2->display_info->sck_takeover_edge; + uint8_t not_takeover_edge = 1 - takeover_edge; + switch(msg) { case U8G2_MSG_BYTE_SEND: + data = (uint8_t *)arg_ptr; + while( arg_int > 0 ) + { + b = *data; + data++; + arg_int--; + for( i = 0; i < 8; i++ ) + { + if ( b & 128 ) + u8g2_gpio_SetData(u8g2, 1); + else + u8g2_gpio_SetData(u8g2, 0); + b <<= 1; + + u8g2_gpio_SetClock(u8g2, not_takeover_edge); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->sda_setup_time_ns); + u8g2_gpio_SetClock(u8g2, takeover_edge); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->sck_pulse_width_ns); + } + } + break; + + case U8G2_MSG_BYTE_INIT: + /* disable chipselect */ + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ + + /* for SPI: setup correct level of the clock signal */ + u8g2_gpio_SetClock(u8g2, u8g2->display_info->sck_takeover_edge); + break; + case U8G2_MSG_BYTE_SET_DC: + u8g2_gpio_SetDC(u8g2, arg_int); break; + case U8G2_MSG_BYTE_START_TRANSFER: + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); + break; + case U8G2_MSG_BYTE_END_TRANSFER: + u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + break; + case U8G2_MSG_BYTE_SET_I2C_ADR: + break; + case U8G2_MSG_BYTE_SET_DEVICE: + break; + default: + return 0; } - return 0; + return 1; } + diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c index 1ee19c32..b074c801 100644 --- a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c @@ -70,7 +70,7 @@ static const uint8_t u8g2_d_ssd1306_128x64_noname_flip1_seq[] = { }; #endif -static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = +static const u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = { /* chip_enable_level = */ 0, /* chip_disable_level = */ 1, @@ -79,8 +79,8 @@ static u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = /* pre_chip_disable_wait_ns = */ 10, /* reset_pulse_width_ms = */ 100, /* SSD1306: 3 us */ /* post_reset_wait_ms = */ 100, /* far east OLEDs need much longer setup time */ - /* sda_setup_time_ns = */ 15, - /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/50 */ + /* sda_setup_time_ns = */ 50, /* SSD1306: 15ns, but cycle time is 100ns, so use 100/2 */ + /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/2 */ /* sck_takeover_edge = */ 1, /* rising edge */ /* i2c_bus_clock_100kHz = */ 4, /* data_setup_time_ns = */ 40, @@ -97,27 +97,7 @@ uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, switch(msg) { case U8G2_MSG_DISPLAY_INIT: - /* 1) set display info struct */ - u8g2->display_info = &u8g2_ssd1306_128x64_noname_display_info; - u8g2->x_offset = u8g2->display_info->default_x_offset; - - /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ - u8g2_gpio_Init(u8g2); - u8g2_cad_Init(u8g2); - - /* 3) apply default value for chip select */ - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); - /* no wait required here */ - - /* 4) do reset */ - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 0); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); - - /* 5) send startup code */ + u8g2_d_helper_display_init(u8g2, &u8g2_ssd1306_128x64_noname_display_info); u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_init_seq); break; diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 06259a14..82c5c6a2 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -19,6 +19,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_C(0x0a0), /* ADC set to reverse */ U8G2_C(0x0c8), /* common output mode */ #endif + U8G2_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */ U8G2_C(0x0a2), /* LCD bias 1/9 */ U8G2_C(0x02f), /* all power control circuits on */ @@ -87,7 +88,7 @@ static const uint8_t u8g2_d_uc1701_dogs102_flip1_seq[] = { #endif -static u8g2_display_info_t u8g2_uc1601_display_info = +static const u8g2_display_info_t u8g2_uc1701_display_info = { /* chip_enable_level = */ 0, /* chip_disable_level = */ 1, @@ -96,7 +97,7 @@ static u8g2_display_info_t u8g2_uc1601_display_info = /* pre_chip_disable_wait_ns = */ 5, /* reset_pulse_width_ms = */ 1, /* post_reset_wait_ms = */ 6, - /* sda_setup_time_ns = */ 12, + /* sda_setup_time_ns = */ 15, /* if this is smaller than sck_pulse_width_ns, use sck_pulse_width_ns, so use 15 instead of 12*/ /* sck_pulse_width_ns = */ 15, /* sck_takeover_edge = */ 1, /* rising edge */ /* i2c_bus_clock_100kHz = */ 37, @@ -118,27 +119,7 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * switch(msg) { case U8G2_MSG_DISPLAY_INIT: - /* 1) set display info struct */ - u8g2->display_info = &u8g2_uc1601_display_info; - u8g2->x_offset = u8g2->display_info->default_x_offset; - - /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ - u8g2_gpio_Init(u8g2); - u8g2_cad_Init(u8g2); - - /* 3) apply default value for chip select */ - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); - /* no wait required here */ - - /* 4) do reset */ - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 0); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); - - /* 5) send startup code */ + u8g2_d_helper_display_init(u8g2, &u8g2_uc1701_display_info); u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); break; @@ -172,6 +153,7 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * #endif case U8G2_MSG_DISPLAY_DRAW_TILE: u8g2_cad_StartTransfer(u8g2); + x = ((u8g2_tile_t *)arg_ptr)->x_pos; x *= 8; x += u8g2->x_offset; diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c index 8da611c7..5c1c43d1 100644 --- a/u8g2/csrc/u8g2_display.c +++ b/u8g2/csrc/u8g2_display.c @@ -7,57 +7,38 @@ */ -/* -template - -uint8_t u8g2_d_xyz(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) -{ - switch(msg) - { - case U8G2_MSG_DISPLAY_INIT: - break; - case U8G2_MSG_DISPLAY_POWER_DOWN: - break; - case U8G2_MSG_DISPLAY_POWER_UP: - break; - case U8G2_MSG_DISPLAY_SET_CONTRAST: - break; - case U8G2_MSG_DISPLAY_DRAW_TILE: - break; - case U8G2_MSG_DISPLAY_GET_LAYOUT: - break; - default: - break; - } - return 1; -} -*/ #include "u8g2.h" + +/*==========================================*/ +/* internal library function */ /* - Prototype: - uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) - Description: - Send U8G2_MSG_DISPLAY_DRAW_TILE to the display callback. - A tile is a sequence of 8 bytes (64 bits) and represents a 8x8 monochrome bitmap. - The lowest bit of the first byte is the upper left corner - The highest bit of the first byte is the lower left corner - The lowest bit of the last byte is the upper right corner - The highest bit of the last byte is the lower left corner + this is a helper function for the U8G2_MSG_DISPLAY_INIT function. + It can be called within the display callback function to carry out the usual standard tasks. + +*/ +void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display_info) +{ + /* 1) set display info struct */ + u8g2->display_info = display_info; + u8g2->x_offset = u8g2->display_info->default_x_offset; - Arguments: - u8g2 Pointer to the u8g2 object - x X position of the tile - y Y position of the tile - cnt Number of tiles - tile_ptr Pointer to "cnt" tiles. - Returns: - 0, if not successful or not supported - See also: - Example: + /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ + u8g2_gpio_Init(u8g2); + u8g2_cad_Init(u8g2); -*/ + /* 3) do reset */ + u8g2_gpio_SetReset(u8g2, 1); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8g2_gpio_SetReset(u8g2, 0); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8g2_gpio_SetReset(u8g2, 1); + u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); +} + +/*==========================================*/ +/* official functions */ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) { diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index a999f416..64e2f7e5 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -92,6 +92,14 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, case U8G2_MSG_GPIO_RESET: digitalWrite(8, arg_int); break; + + case U8G2_MSG_GPIO_CLOCK: + digitalWrite(13, arg_int); + break; + + case U8G2_MSG_GPIO_DATA: + digitalWrite(11, arg_int); + break; default: return 0; @@ -118,8 +126,12 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, voi } break; case U8G2_MSG_BYTE_INIT: + /* disable chipselect */ + u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ + /* for SPI: setup correct level of the clock signal */ - digitalWrite(13, 1); + digitalWrite(13, u8g2->display_info->sck_takeover_edge); break; case U8G2_MSG_BYTE_SET_DC: u8g2_gpio_SetDC(u8g2, arg_int); @@ -148,62 +160,6 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, voi return 1; } - -uint8_t u8g2_byte_arduino_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - uint8_t i, b; - uint8_t *data; - - - switch(msg) - { - case U8G2_MSG_BYTE_SEND: - data = (uint8_t *)arg_ptr; - while( arg_int > 0 ) - { - b = *data; - data++; - arg_int--; - for( i = 0; i < 8; i++ ) - { - if ( b & 128 ) - digitalWrite(11, 1); - else - digitalWrite(11, 0); - b <<= 1; - delay(1); - digitalWrite(13, 0); - delay(1); - digitalWrite(13, 1); - delay(1); - } - } - break; - case U8G2_MSG_BYTE_INIT: - /* for SPI: setup correct level of the clock signal */ - digitalWrite(13, 1); - break; - case U8G2_MSG_BYTE_SET_DC: - u8g2_gpio_SetDC(u8g2, arg_int); - break; - case U8G2_MSG_BYTE_START_TRANSFER: - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); - break; - case U8G2_MSG_BYTE_END_TRANSFER: - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); - break; - case U8G2_MSG_BYTE_SET_I2C_ADR: - break; - case U8G2_MSG_BYTE_SET_DEVICE: - break; - default: - return 0; - } - return 1; -} - void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) { /* setup defaults */ @@ -212,7 +168,7 @@ void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) /* setup specific callbacks */ u8g2->display_cb = u8g2_d_uc1701_dogs102; u8g2->cad_cb = u8g2_cad_001; - u8g2->byte_cb = u8g2_byte_arduino_hw_spi; + u8g2->byte_cb = u8g2_byte_8bit_sw_spi; u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; } @@ -225,7 +181,8 @@ void u8g2_Setup_SSD1306_128x64_NONAME(u8g2_t *u8g2) /* setup specific callbacks */ u8g2->display_cb = u8g2_d_ssd1306_128x64_noname; u8g2->cad_cb = u8g2_cad_001; - u8g2->byte_cb = u8g2_byte_arduino_hw_spi; + //u8g2->byte_cb = u8g2_byte_arduino_hw_spi; + u8g2->byte_cb = u8g2_byte_8bit_sw_spi; u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; } @@ -235,8 +192,8 @@ uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; void setup(void) { - u8g2_Setup_UC1701_DOGS102(&u8g2); - //u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); + //u8g2_Setup_UC1701_DOGS102(&u8g2); + u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); } void loop(void) From 394ca0203edb02b807010288ccec1c4ed353786d Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 27 Sep 2015 13:30:51 +0200 Subject: [PATCH 040/109] sdl example --- u8g2/csrc/u8g2.h | 7 + u8g2/csrc/u8g2_d_uc1701_dogs102.c | 25 +-- u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c | 265 ++++++++++++++++++++++++ u8g2/sys/sdl/hello_world_8x8/Makefile | 12 ++ u8g2/sys/sdl/hello_world_8x8/main.c | 69 ++++++ 5 files changed, 354 insertions(+), 24 deletions(-) create mode 100644 u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c create mode 100644 u8g2/sys/sdl/hello_world_8x8/Makefile create mode 100644 u8g2/sys/sdl/hello_world_8x8/main.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 9681e1e3..3b7e8cc5 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -424,6 +424,13 @@ void u8g2_SetupDefaults(u8g2_t *u8g2); /* u8g2_d_stdio.c */ void u8g2_SetupStdio(u8g2_t *u8g2); +/*==========================================*/ +/* u8g2_d_sdl_128x64.c */ +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2); +int u8g_sdl_get_key(void); + + + /*==========================================*/ /* u8g2_d_uc1701_dogs102.c */ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c index 82c5c6a2..d01e62db 100644 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8g2_d_uc1701_dogs102.c @@ -28,28 +28,6 @@ static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { U8G2_C(0x0fa), /* Set Temp compensation */ U8G2_C(0x090), /* 0.11 deg/c WP Off WC Off*/ U8G2_C(0x0a4), /* normal display */ - //U8G2_C(0x0af), /* display on */ - - - //U8G2_DLY(50), /* delay 100 ms */ - //U8G2_C(0x0a5), /* display all points, ST7565, UC1610 */ - //U8G2_DLY(50), /* delay 100 ms */ - //U8G2_DLY(50), /* delay 100 ms */ - //U8G2_C(0x0a4), /* normal display */ - - //U8G2_C(0x010), /* col hi adr 0 */ - //U8G2_C(0x000), /* col lo adr 0 */ - //U8G2_C(0x0b0), /* page 0 */ - - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - //U8G2_D1(0x0ff), /* data */ - U8G2_END_TRANSFER(), /* disable chip */ U8G2_END() /* end of sequence */ @@ -120,8 +98,7 @@ uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * { case U8G2_MSG_DISPLAY_INIT: u8g2_d_helper_display_init(u8g2, &u8g2_uc1701_display_info); - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); - + u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); break; case U8G2_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) diff --git a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c new file mode 100644 index 00000000..e53e6d59 --- /dev/null +++ b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c @@ -0,0 +1,265 @@ +/* + u8g2_d_sdl_128x64.c +*/ + +#include "u8g2.h" +#include "SDL.h" +#include "SDL_video.h" +#include + +#define HEIGHT (64) +#define WIDTH 128 + +SDL_Surface *u8g_sdl_screen; +int u8g_sdl_multiple = 2; +Uint32 u8g_sdl_color[256]; + +void u8g_sdl_set_pixel(int x, int y, int idx) +{ + Uint32 *ptr; + Uint32 offset; + int i, j; + + if ( y >= HEIGHT ) + return; + if ( y < 0 ) + return; + if ( x >= WIDTH ) + return; + if ( x < 0 ) + return; + + for( i = 0; i < u8g_sdl_multiple; i++ ) + for( j = 0; j < u8g_sdl_multiple; j++ ) + { + offset = + (y * u8g_sdl_multiple + j) * u8g_sdl_screen->w * u8g_sdl_screen->format->BytesPerPixel + + (x * u8g_sdl_multiple + i) * u8g_sdl_screen->format->BytesPerPixel; + assert( offset < u8g_sdl_screen->w * u8g_sdl_screen->h * u8g_sdl_screen->format->BytesPerPixel ); + ptr = u8g_sdl_screen->pixels + offset; + *ptr = u8g_sdl_color[idx]; + } +} + +void u8g_sdl_set_8pixel(int x, int y, uint8_t pixel) +{ + int cnt = 8; + while( cnt > 0 ) + { + if ( (pixel & 1) == 0 ) + { + u8g_sdl_set_pixel(x,y,0); + } + else + { + u8g_sdl_set_pixel(x,y,3); + } + pixel >>= 1; + y++; + cnt--; + } +} + +void u8g_sdl_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel) +{ + uint8_t b; + while( cnt > 0 ) + { + b = *pixel; + u8g_sdl_set_8pixel(x, y, b); + x++; + pixel++; + cnt--; + } +} + + +#define W(x,w) (((x)*(w))/100) + +void u8g_sdl_init(void) +{ + if (SDL_Init(SDL_INIT_VIDEO) != 0) + { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + + /* http://www.libsdl.org/cgi/docwiki.cgi/SDL_SetVideoMode */ + u8g_sdl_screen = SDL_SetVideoMode(WIDTH*u8g_sdl_multiple,HEIGHT*u8g_sdl_multiple,32,SDL_SWSURFACE|SDL_ANYFORMAT); + if ( u8g_sdl_screen == NULL ) + { + printf("Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + //printf("%d bits-per-pixel mode\n", u8g_sdl_screen->format->BitsPerPixel); + //printf("%d bytes-per-pixel mode\n", u8g_sdl_screen->format->BytesPerPixel); + + u8g_sdl_color[0] = SDL_MapRGB( u8g_sdl_screen->format, 0, 0, 0 ); + u8g_sdl_color[1] = SDL_MapRGB( u8g_sdl_screen->format, W(100, 50), W(255,50), 0 ); + u8g_sdl_color[2] = SDL_MapRGB( u8g_sdl_screen->format, W(100, 80), W(255,80), 0 ); + u8g_sdl_color[3] = SDL_MapRGB( u8g_sdl_screen->format, 100, 255, 0 ); + + /* + u8g_sdl_set_pixel(0,0); + u8g_sdl_set_pixel(1,1); + u8g_sdl_set_pixel(2,2); + */ + + /* update all */ + /* http://www.libsdl.org/cgi/docwiki.cgi/SDL_UpdateRect */ + SDL_UpdateRect(u8g_sdl_screen, 0,0,0,0); + + atexit(SDL_Quit); + return; +} + +/* return ascii key value or -1 */ +int u8g_sdl_get_key(void) +{ + SDL_Event event; + /* http://www.libsdl.org/cgi/docwiki.cgi/SDL_PollEvent */ + if ( SDL_PollEvent(&event) != 0 ) + { + switch (event.type) + { + case SDL_QUIT: + exit(0); + break; + case SDL_KEYDOWN: + switch( event.key.keysym.sym ) + { + /* /usr/include/SDL/SDL_keysym.h */ + case SDLK_a: return 'a'; + case SDLK_b: return 'b'; + case SDLK_c: return 'c'; + case SDLK_d: return 'd'; + case SDLK_e: return 'e'; + case SDLK_f: return 'f'; + case SDLK_g: return 'g'; + case SDLK_h: return 'h'; + case SDLK_i: return 'i'; + case SDLK_j: return 'j'; + case SDLK_k: return 'k'; + case SDLK_l: return 'l'; + case SDLK_m: return 'm'; + case SDLK_n: return 'n'; + case SDLK_o: return 'o'; + case SDLK_p: return 'p'; + case SDLK_q: return 'q'; + case SDLK_r: return 'r'; + case SDLK_s: return 's'; + case SDLK_t: return 't'; + case SDLK_u: return 'u'; + case SDLK_v: return 'v'; + case SDLK_w: return 'w'; + case SDLK_x: return 'x'; + case SDLK_y: return 'y'; + case SDLK_z: return 'z'; + case SDLK_SPACE: return ' '; + case SDLK_UP: return 273; + case SDLK_DOWN: return 274; + case SDLK_RIGHT: return 275; + case SDLK_LEFT: return 276; + + default: return 0; + } + } + } + return -1; +} + + +/* +void main(void) +{ + u8g_sdl_init(); + u8g_sdl_set_pixel(0,0,3); + u8g_sdl_set_pixel(0,1,3); + u8g_sdl_set_pixel(0,2,3); + u8g_sdl_set_pixel(1,1,3); + u8g_sdl_set_pixel(2,2,3); + while( u8g_sdl_get_key() < 0 ) + ; +} +*/ + +static const u8g2_display_info_t u8g2_sdl_128x64_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + + /* post_chip_enable_wait_ns = */ 0, + /* pre_chip_disable_wait_ns = */ 0, + /* reset_pulse_width_ms = */ 0, + /* post_reset_wait_ms = */ 0, + /* sda_setup_time_ns = */ 0, + /* sck_pulse_width_ns = */ 0, + /* sck_takeover_edge = */ 1, + /* i2c_bus_clock_100kHz = */ 0, + /* data_setup_time_ns = */ 0, + /* write_pulse_width_ns = */ 0, + /* tile_width = */ 16, + /* tile_hight = */ 8, +#if U8G2_DEFAULT_FLIP_MODE == 0 + /* default_x_offset = */ 0, +#else + /* default_x_offset = */ 0, +#endif +}; + + +uint8_t u8g2_d_sdl(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t x, y, c; + uint8_t *ptr; + switch(msg) + { + case U8G2_MSG_DISPLAY_INIT: + u8g2_d_helper_display_init(u8g2, &u8g2_sdl_128x64_info); + u8g_sdl_init(); + break; + case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + break; + case U8G2_MSG_DISPLAY_SET_FLIP_MODE: + break; + case U8G2_MSG_DISPLAY_SET_CONTRAST: + break; + case U8G2_MSG_DISPLAY_DRAW_TILE: + x = ((u8g2_tile_t *)arg_ptr)->x_pos; + x *= 8; + x += u8g2->x_offset; + + y = ((u8g2_tile_t *)arg_ptr)->y_pos; + y *= 8; + + do + { + c = ((u8g2_tile_t *)arg_ptr)->cnt; + ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; + u8g_sdl_set_multiple_8pixel(x, y, c*8, ptr); + arg_int--; + } while( arg_int > 0 ); + + /* update all */ + /* http://www.libsdl.org/cgi/docwiki.cgi/SDL_UpdateRect */ + SDL_UpdateRect(u8g_sdl_screen, 0,0,0,0); + + break; + default: + return 0; + } + return 1; +} + + +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) +{ + /* setup defaults */ + u8g2_SetupDefaults(u8g2); + + /* setup specific callbacks */ + u8g2->display_cb = u8g2_d_sdl; + +} + + diff --git a/u8g2/sys/sdl/hello_world_8x8/Makefile b/u8g2/sys/sdl/hello_world_8x8/Makefile new file mode 100644 index 00000000..9f409a66 --- /dev/null +++ b/u8g2/sys/sdl/hello_world_8x8/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +helloworld: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_sdl + +clean: + -rm $(OBJ) u8g2_sdl + diff --git a/u8g2/sys/sdl/hello_world_8x8/main.c b/u8g2/sys/sdl/hello_world_8x8/main.c new file mode 100644 index 00000000..dbb1df26 --- /dev/null +++ b/u8g2/sys/sdl/hello_world_8x8/main.c @@ -0,0 +1,69 @@ + +#include "u8g2.h" + +u8g2_t u8g2; + +const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + + +int main(void) +{ + u8g2_Setup_SDL_128x64(&u8g2); + u8g2_display_Init(&u8g2); + + u8g2_Set8x8Font(&u8g2, bdf_font); + u8g2_Draw8x8String(&u8g2, 0, 0, "Hello World!"); + + while( u8g_sdl_get_key() < 0 ) + ; + return 0; +} + From 0d7ba3bdbda9b41450c3239748f089aa05a9da4b Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 4 Oct 2015 08:11:43 +0200 Subject: [PATCH 041/109] started hi level api --- u8g2/csrc/u8g2.h | 17 ++++++++++++++++- u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c | 12 ++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 3b7e8cc5..5b7b1a68 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -114,9 +114,13 @@ extern "C" { typedef struct u8g2_struct u8g2_t; typedef struct u8g2_display_info_struct u8g2_display_info_t; +typedef struct u8g2x_struct u8g2x_t; + typedef struct u8g2_tile_struct u8g2_tile_t; +typedef uint16_t u8g2_uint_t; /* for pixel position only */ + typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); @@ -180,7 +184,6 @@ struct u8g2_display_info_struct uint8_t tile_height; uint8_t default_x_offset; /* default x offset for the display */ - }; struct u8g2_struct @@ -195,6 +198,16 @@ struct u8g2_struct uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; +struct u8g2x_struct +{ + u8g2_t u8x8; + uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ + uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ + uint8_t tile_curr_row; /* current row for picture loop */ + uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ +}; + +#define u8g2x_GetU8x8(u8g2x) ((u8g2_t *)(u8g2x)) /*==========================================*/ @@ -445,6 +458,8 @@ void u8g2_Set8x8Font(u8g2_t *u8g2, const uint8_t *font_8x8); void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s); +/*==========================================*/ + #ifdef __cplusplus } diff --git a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c index e53e6d59..bfc65643 100644 --- a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c @@ -262,4 +262,16 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) } +void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) +{ + static uint8_t buf[128*8]; + u8g2_Setup_SDL_128x64(u8g2x_GetU8x8(u8g2x)); + u8g2x->tile_buf_ptr = buf; + u8g2x->tile_buf_height = 8; + u8g2x->tile_curr_row = 0; + u8g2x->draw_color = 1; +} +void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y) +{ +} From 6b215ea801173f45c72986ff69492d908b71cc8a Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 4 Oct 2015 15:28:24 +0200 Subject: [PATCH 042/109] hi level interface --- u8g2/csrc/u8g2.h | 7 +- u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c | 90 +++++++++++++++++++++++++ u8g2/sys/sdl/hvline/Makefile | 12 ++++ u8g2/sys/sdl/hvline/main.c | 80 ++++++++++++++++++++++ 4 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 u8g2/sys/sdl/hvline/Makefile create mode 100644 u8g2/sys/sdl/hvline/main.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 5b7b1a68..f319d255 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -291,7 +291,7 @@ void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display /* u8g2_display.c */ uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); -/* Init display, but keep display in power save mode. Usually this command must be followed by u8g2_display_PowerUp() */ +/* Init display, but keep display in power save mode. Usually this command must be followed by u8g2_display_SetPowerSave() */ void u8g2_display_Init(u8g2_t *u8g2); /* wake up display from power save mode */ void u8g2_display_SetPowerSave(u8g2_t *u8g2, uint8_t is_enable); @@ -440,6 +440,7 @@ void u8g2_SetupStdio(u8g2_t *u8g2); /*==========================================*/ /* u8g2_d_sdl_128x64.c */ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2); +void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x); int u8g_sdl_get_key(void); @@ -459,6 +460,10 @@ void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s); /*==========================================*/ +/* high level interface */ + +void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); +void u8g2x_SendBuffer(u8g2x_t *u8g2x); #ifdef __cplusplus diff --git a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c index bfc65643..97f6ccfa 100644 --- a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c @@ -264,7 +264,14 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) { + static uint8_t buf[128*8]; + /* + int i; + for( i = 0; i < 128*8; i++ ) + buf[i] = (i>>2); + */ + u8g2_Setup_SDL_128x64(u8g2x_GetU8x8(u8g2x)); u8g2x->tile_buf_ptr = buf; u8g2x->tile_buf_height = 8; @@ -274,4 +281,87 @@ void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y) { + uint8_t *ptr; + uint8_t bit_pos, mask; + uint16_t offset; + ptr = u8g2x->tile_buf_ptr; + /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ + bit_pos = y; /* overflow truncate is ok here... */ + bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ + y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ + offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ + offset *= u8g2x_GetU8x8(u8g2x)->display_info->tile_width; + ptr += offset; + ptr += x; + mask = 1; + mask <<= bit_pos; + if ( u8g2x->draw_color != 0 ) + { + *ptr |= mask; + } + else + { + mask ^= 255; + *ptr &= mask; + } +} + +/* + x,y Upper left position of the line + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) +*/ +void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + if ( dir == 0 ) + { + do + { + u8g2x_draw_pixel(u8g2x, x, y); + x++; + len--; + } while( len != 0 ); + } + else + { + do + { + u8g2x_draw_pixel(u8g2x, x, y); + y++; + len--; + } while( len != 0 ); + } +} + +static void u8g2x_send_tile_row(u8g2x_t *u8g2x, uint8_t tile_row) +{ + uint8_t *ptr; + uint16_t offset; + uint8_t w; + + w = u8g2x_GetU8x8(u8g2x)->display_info->tile_width; + offset = tile_row; + ptr = u8g2x->tile_buf_ptr; + offset *= w; + offset *= 8; + ptr += offset; + + u8g2_display_DrawTile(u8g2x_GetU8x8(u8g2x), 0, tile_row, w, ptr); } + +void u8g2x_SendBuffer(u8g2x_t *u8g2x) +{ + uint8_t cnt = u8g2x->tile_buf_height; + uint8_t row = u8g2x->tile_curr_row; + do + { + u8g2x_send_tile_row(u8g2x, row); + cnt--; + row++; + } while( cnt > 0 ); +} + + + + diff --git a/u8g2/sys/sdl/hvline/Makefile b/u8g2/sys/sdl/hvline/Makefile new file mode 100644 index 00000000..9f409a66 --- /dev/null +++ b/u8g2/sys/sdl/hvline/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +helloworld: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_sdl + +clean: + -rm $(OBJ) u8g2_sdl + diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c new file mode 100644 index 00000000..05a6835c --- /dev/null +++ b/u8g2/sys/sdl/hvline/main.c @@ -0,0 +1,80 @@ + +#include "u8g2.h" + + +const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +u8g2x_t u8g2x; + +int main(void) +{ + u8g2x_Setup_SDL_128x64(&u8g2x); + u8g2_display_Init(u8g2x_GetU8x8(&u8g2x)); + u8g2_display_SetPowerSave(u8g2x_GetU8x8(&u8g2x), 0); + + + u8g2x_DrawHVLine(&u8g2x, 5, 20, 40, 0); + u8g2x_DrawHVLine(&u8g2x, 5, 22, 40, 0); + u8g2x_DrawHVLine(&u8g2x, 5, 24, 40, 0); + u8g2x_SendBuffer(&u8g2x); + + + u8g2_Set8x8Font(u8g2x_GetU8x8(&u8g2x), bdf_font); + u8g2_Draw8x8String(u8g2x_GetU8x8(&u8g2x), 0, 0, "Hello World!"); + + + + + while( u8g_sdl_get_key() < 0 ) + ; + return 0; +} + From d0a110cf2a83d87fb254563c739c21d4a3896a6c Mon Sep 17 00:00:00 2001 From: Florian Menne Date: Sun, 4 Oct 2015 16:48:00 +0200 Subject: [PATCH 043/109] added first xmega support; i2c is still missing; currently only tested with hw_spi on ssd1309 --- csrc/u8g.h | 8 +- csrc/u8g_com_atmega_hw_spi.c | 4 +- csrc/u8g_com_atxmega_hw_spi.c | 174 +++++++++++++++++++++++ csrc/u8g_com_atxmega_st7920_hw_spi.c | 202 +++++++++++++++++++++++++++ csrc/u8g_com_i2c.c | 4 +- csrc/u8g_com_io.c | 78 +++++++++++ csrc/u8g_state.c | 3 +- 7 files changed, 467 insertions(+), 6 deletions(-) create mode 100644 csrc/u8g_com_atxmega_hw_spi.c create mode 100644 csrc/u8g_com_atxmega_st7920_hw_spi.c diff --git a/csrc/u8g.h b/csrc/u8g.h index 897388cf..422a48bc 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -699,6 +699,9 @@ uint8_t u8g_com_atmega_st7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_atmega_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atmega_parallel.c */ +uint8_t u8g_com_atxmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atxmega_hw_spi.c */ +uint8_t u8g_com_atxmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_atxmega_st7920_spi.c */ + uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_msp430_hw_spi.c */ uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ @@ -764,7 +767,10 @@ defined(__18CXX) || defined(__PIC32MX) #endif /* ==== HW SPI, not Arduino ====*/ #ifndef U8G_COM_HW_SPI -#if defined(__AVR__) +#if defined(__AVR_XMEGA__) +#define U8G_COM_HW_SPI u8g_com_atxmega_hw_spi_fn +#define U8G_COM_ST7920_HW_SPI u8g_com_atxmega_st7920_hw_spi_fn +#elif defined(__AVR__) #define U8G_COM_HW_SPI u8g_com_atmega_hw_spi_fn #define U8G_COM_ST7920_HW_SPI u8g_com_atmega_st7920_hw_spi_fn #endif diff --git a/csrc/u8g_com_atmega_hw_spi.c b/csrc/u8g_com_atmega_hw_spi.c index 71e378b5..ca2a0630 100644 --- a/csrc/u8g_com_atmega_hw_spi.c +++ b/csrc/u8g_com_atmega_hw_spi.c @@ -49,8 +49,8 @@ #include "u8g.h" - -#if defined(__AVR__) +#if defined(__AVR_XMEGA__) +#elif defined(__AVR__) #define U8G_ATMEGA_HW_SPI /* remove the definition for attiny */ diff --git a/csrc/u8g_com_atxmega_hw_spi.c b/csrc/u8g_com_atxmega_hw_spi.c new file mode 100644 index 00000000..4c2dfa27 --- /dev/null +++ b/csrc/u8g_com_atxmega_hw_spi.c @@ -0,0 +1,174 @@ +/* + + u8g_com_atxmega_hw_spi.c + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + Copyright (c) 2015, florianmenne@t-online.de + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + A special SPI interface for ST7920 controller with HW SPI Support + + Assumes, that + MOSI is at PORTB, Pin 3 + and + SCK is at PORTB, Pin 5 + + Update for ATOMIC operation done (01 Jun 2013) + U8G_ATOMIC_OR(ptr, val) + U8G_ATOMIC_AND(ptr, val) + U8G_ATOMIC_START() + U8G_ATOMIC_END() + + +*/ + +#include "u8g.h" + +#if defined(__AVR_XMEGA__) +#define U8G_ATXMEGA_HW_SPI +#endif + + +#if defined(U8G_ATXMEGA_HW_SPI) + +#include +#include + + +static uint8_t u8g_atxmega_spi_out(uint8_t data) +{ + /* send data */ + SPIC.DATA = data; + + /* wait for transmission */ + while(!(SPIC.STATUS & SPI_IF_bm)); + + /* clear the SPIF flag by reading SPDR */ + return SPIC.DATA; +} + + +uint8_t u8g_com_atxmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + u8g_SetPIOutput(u8g, U8G_PI_RESET); + + //U8G_ATOMIC_START(); + + PORTC.DIR |= PIN4_bm | PIN5_bm | PIN7_bm; + PORTC.DIR &= ~PIN6_bm; + + //U8G_ATOMIC_END(); + + u8g_SetPILevel(u8g, U8G_PI_CS, 1); + + SPIC.CTRL = 0; + SPIC.CTRL = SPI_PRESCALER_DIV4_gc | // SPI prescaler. + //SPI_CLK2X_bm | //SPI Clock double. + SPI_ENABLE_bm | //Enable SPI module. + //SPI_DORD_bm | //Data order. + SPI_MASTER_bm | //SPI master. + SPI_MODE_0_gc; // SPI mode. + +#ifdef U8G_HW_SPI_2X + SPIC.CTRL |= SPI_CLK2X_bm; /* double speed, issue 89 */ +#endif + + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + + if ( arg_val == 0 ) + { + /* disable */ + u8g_SetPILevel(u8g, U8G_PI_CS, 1); + } + else + { + //PORTB &= ~_BV(5); /* SCK = 0 */ + PORTC.OUT &= ~PIN7_bm; + /* enable */ + u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */ + } + + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_atxmega_spi_out(arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: + { + register uint8_t *ptr = arg_ptr; + while( arg_val > 0 ) + { + u8g_atxmega_spi_out(*ptr++); + arg_val--; + } + } + break; + case U8G_COM_MSG_WRITE_SEQ_P: + { + register uint8_t *ptr = arg_ptr; + while( arg_val > 0 ) + { + u8g_atxmega_spi_out(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + } + return 1; +} + +#else + +uint8_t u8g_com_atxmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + return 1; +} + +#endif \ No newline at end of file diff --git a/csrc/u8g_com_atxmega_st7920_hw_spi.c b/csrc/u8g_com_atxmega_st7920_hw_spi.c new file mode 100644 index 00000000..4b82385d --- /dev/null +++ b/csrc/u8g_com_atxmega_st7920_hw_spi.c @@ -0,0 +1,202 @@ +/* + + u8g_com_atxmega_st7920_hw_spi.c + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + Copyright (c) 2015, florianmenne@t-online.de + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + A special SPI interface for ST7920 controller with HW SPI Support + + Assumes, that + MOSI is at PORTB, Pin 3 + and + SCK is at PORTB, Pin 5 + + Update for ATOMIC operation done (01 Jun 2013) + U8G_ATOMIC_OR(ptr, val) + U8G_ATOMIC_AND(ptr, val) + U8G_ATOMIC_START() + U8G_ATOMIC_END() + + +*/ + +#include "u8g.h" + +#if defined(__AVR_XMEGA__) +#define U8G_ATXMEGA_HW_SPI +#endif + +#if defined(U8G_ATXMEGA_HW_SPI) + +#include +#include + +static uint8_t u8g_atxmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE; +static uint8_t u8g_atxmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) +{ + /* send data */ + SPIC.DATA = val; + + /* wait for transmission */ + while(!(SPIC.STATUS & SPI_IF_bm)); + + /* clear the SPIF flag by reading SPDR */ + return SPIC.DATA; +} + + +static void u8g_com_atxmega_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val) U8G_NOINLINE; +static void u8g_com_atxmega_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val) +{ + uint8_t i; + + if ( rs == 0 ) + { + /* command */ + u8g_atxmega_st7920_hw_spi_shift_out(u8g, 0x0f8); + } + else if ( rs == 1 ) + { + /* data */ + u8g_atxmega_st7920_hw_spi_shift_out(u8g, 0x0fa); + } + + u8g_atxmega_st7920_hw_spi_shift_out(u8g, val & 0x0f0); + u8g_atxmega_st7920_hw_spi_shift_out(u8g, val << 4); + + for( i = 0; i < 4; i++ ) + u8g_10MicroDelay(); +} + + +uint8_t u8g_com_atxmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_CS); + //u8g_SetPIOutput(u8g, U8G_PI_A0); + + //U8G_ATOMIC_START(); + + PORTC.DIR |= PIN4_bm | PIN5_bm | PIN7_bm; + PORTC.DIR &= ~PIN6_bm; + + //U8G_ATOMIC_END(); + + u8g_SetPILevel(u8g, U8G_PI_CS, 1); + + SPIC.CTRL = 0; + SPIC.CTRL = SPI_PRESCALER_DIV4_gc | // SPI prescaler. + //SPI_CLK2X_bm | //SPI Clock double. + SPI_ENABLE_bm | //Enable SPI module. + //SPI_DORD_bm | //Data order. + SPI_MASTER_bm | //SPI master. + SPI_MODE_0_gc; // SPI mode. + +#ifdef U8G_HW_SPI_2X + SPIC.CTRL |= SPI_CLK2X_bm; /* double speed, issue 89 */ +#endif + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if ( arg_val == 0 ) + { + /* disable, note: the st7920 has an active high chip select */ + u8g_SetPILevel(u8g, U8G_PI_CS, 0); + } + else + { + /* u8g_SetPILevel(u8g, U8G_PI_SCK, 0 ); */ + /* enable */ + u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */ + } + break; + + + case U8G_COM_MSG_WRITE_BYTE: + u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val); + //u8g->pin_list[U8G_PI_A0_STATE] = 2; + break; + + case U8G_COM_MSG_WRITE_SEQ: + { + register uint8_t *ptr = arg_ptr; + while( arg_val > 0 ) + { + u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + //u8g->pin_list[U8G_PI_A0_STATE] = 2; + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: + { + register uint8_t *ptr = arg_ptr; + while( arg_val > 0 ) + { + u8g_com_atxmega_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr)); + //u8g->pin_list[U8G_PI_A0_STATE] = 2; + ptr++; + arg_val--; + } + } + break; + } + return 1; +} + +#else + + +uint8_t u8g_com_atxmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + return 1; +} + + +#endif + + \ No newline at end of file diff --git a/csrc/u8g_com_i2c.c b/csrc/u8g_com_i2c.c index 3c986efd..f9759527 100644 --- a/csrc/u8g_com_i2c.c +++ b/csrc/u8g_com_i2c.c @@ -67,8 +67,8 @@ uint8_t u8g_i2c_get_err_pos(void) } - -#if defined(__AVR__) +#if defined(__AVR_XMEGA__) +#elif defined(__AVR__) static void u8g_i2c_set_error(uint8_t code, uint8_t pos) { diff --git a/csrc/u8g_com_io.c b/csrc/u8g_com_io.c index e1bc21a3..1ebd373d 100644 --- a/csrc/u8g_com_io.c +++ b/csrc/u8g_com_io.c @@ -65,6 +65,83 @@ uint8_t u8g_Pin(uint8_t port, uint8_t bitpos) return port; } +#if defined(__AVR_XMEGA__) + +const IO_PTR u8g_avr_ddr_P[] PROGMEM = { +#ifdef PORTA + &PORTA.DIR, +#else + 0, +#endif + &PORTB.DIR, +#ifdef PORTC + &PORTC.DIR, +#ifdef PORTD + &PORTD.DIR, +#ifdef PORTE + &PORTE.DIR, +#ifdef PORTF + &PORTF.DIR, +#ifdef PORTR + &PORTR.DIR, +#endif +#endif +#endif +#endif +#endif +}; + + +const IO_PTR u8g_avr_port_P[] PROGMEM = { +#ifdef PORTA + &PORTA.OUT, +#else + 0, +#endif + &PORTB.OUT, +#ifdef PORTC + &PORTC.OUT, +#ifdef PORTD + &PORTD.OUT, +#ifdef PORTE + &PORTE.OUT, +#ifdef PORTF + &PORTF.OUT, +#ifdef PORTR + &PORTR.OUT, +#endif +#endif +#endif +#endif +#endif +}; + +const IO_PTR u8g_avr_pin_P[] PROGMEM = { +#ifdef PORTA + &PORTA.IN, +#else + 0, +#endif + &PORTB.IN, +#ifdef PORTC + &PORTC.IN, +#ifdef PORTD + &PORTD.IN, +#ifdef PORTE + &PORTE.IN, +#ifdef PORTF + &PORTF.IN, +#ifdef PORTR + &PORTR.IN, +#endif +#endif +#endif +#endif +#endif +}; + + +#else const IO_PTR u8g_avr_ddr_P[] PROGMEM = { #ifdef DDRA &DDRA, @@ -146,6 +223,7 @@ const IO_PTR u8g_avr_pin_P[] PROGMEM = { #endif #endif }; +#endif static volatile uint8_t *u8g_get_avr_io_ptr(const IO_PTR *base, uint8_t offset) { diff --git a/csrc/u8g_state.c b/csrc/u8g_state.c index 9573c8bf..3621d933 100644 --- a/csrc/u8g_state.c +++ b/csrc/u8g_state.c @@ -75,7 +75,8 @@ uint8_t global_SREG_backup; /*===============================================================*/ /* AVR */ -#if defined(__AVR__) +#if defined(__AVR_XMEGA__) +#elif defined(__AVR__) #define U8G_ATMEGA_HW_SPI /* remove the definition for attiny */ From 2852b644a3baed1811338d4e62635a1a08798e80 Mon Sep 17 00:00:00 2001 From: Florian Menne Date: Sun, 4 Oct 2015 17:02:53 +0200 Subject: [PATCH 044/109] added missing preprocessor statement; --- csrc/u8g_com_atmega_st7920_hw_spi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csrc/u8g_com_atmega_st7920_hw_spi.c b/csrc/u8g_com_atmega_st7920_hw_spi.c index dd0fd4e1..57857927 100644 --- a/csrc/u8g_com_atmega_st7920_hw_spi.c +++ b/csrc/u8g_com_atmega_st7920_hw_spi.c @@ -49,7 +49,8 @@ #include "u8g.h" -#if defined(__AVR__) +#if defined(__AVR_XMEGA__) +#elif defined(__AVR__) #define U8G_ATMEGA_HW_SPI /* remove the definition for attiny */ From 6f3a2b45f05494459b0694555e2d12871671329f Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 7 Oct 2015 06:16:30 +0200 Subject: [PATCH 045/109] l90 cb struct --- u8g2/csrc/u8g2.h | 21 ++++++++++++++++----- u8g2/sys/sdl/hvline/main.c | 4 ++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index f319d255..181945dd 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -111,19 +111,21 @@ extern "C" { /*==========================================*/ /* U8G2 typedefs and data structures */ +typedef uint16_t u8g2_uint_t; /* for pixel position only */ + typedef struct u8g2_struct u8g2_t; typedef struct u8g2_display_info_struct u8g2_display_info_t; -typedef struct u8g2x_struct u8g2x_t; - - typedef struct u8g2_tile_struct u8g2_tile_t; -typedef uint16_t u8g2_uint_t; /* for pixel position only */ - +typedef struct u8g2x_struct u8g2x_t; +typedef struct u8g2x_cb_struct u8g2x_cb_t; typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +typedef void (*u8g2x_update_dimension_cb)(u8g2x_t *u8g2x_t); +typedef void (*u8g2x_draw_l90_cb)(u8g2x_t *u8g2x_t, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); + //struct u8g2_mcd_struct //{ @@ -198,9 +200,18 @@ struct u8g2_struct uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; + +struct u8g2x_cb_struct +{ + u8g2x_update_dimension_cb update; + u8g2x_draw_l90_cb draw_l90; +}; + + struct u8g2x_struct { u8g2_t u8x8; + u8g2x_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ uint8_t tile_curr_row; /* current row for picture loop */ diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index 05a6835c..230fdc5b 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -64,6 +64,10 @@ int main(void) u8g2x_DrawHVLine(&u8g2x, 5, 20, 40, 0); u8g2x_DrawHVLine(&u8g2x, 5, 22, 40, 0); u8g2x_DrawHVLine(&u8g2x, 5, 24, 40, 0); + + u8g2x_DrawHVLine(&u8g2x, 5, 24, 40, 1); + + u8g2x_SendBuffer(&u8g2x); From 2e6a7d2892d9d694b1e386b7e48300d0b5bba060 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 10 Oct 2015 08:36:01 +0200 Subject: [PATCH 046/109] rename: u8g2 -> u8x8 --- u8g2/csrc/u8g2.c | 32 -- u8g2/csrc/u8g2_byte.c | 110 ------ u8g2/csrc/u8g2_cad.c | 202 ----------- u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c | 156 -------- u8g2/csrc/u8g2_d_uc1701_dogs102.c | 162 --------- u8g2/csrc/u8g2_display.c | 92 ----- u8g2/csrc/u8g2_gpio.c | 15 - u8g2/csrc/{u8g2.h => u8x8.h} | 332 +++++++++--------- u8g2/csrc/{u8g2_8x8.c => u8x8_8x8.c} | 20 +- u8g2/csrc/u8x8_byte.c | 110 ++++++ u8g2/csrc/u8x8_cad.c | 202 +++++++++++ u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c | 156 ++++++++ u8g2/csrc/{u8g2_d_stdio.c => u8x8_d_stdio.c} | 20 +- u8g2/csrc/u8x8_d_uc1701_dogs102.c | 162 +++++++++ u8g2/csrc/u8x8_display.c | 92 +++++ u8g2/csrc/u8x8_gpio.c | 15 + u8g2/csrc/u8x8_setup.c | 32 ++ ...8g2_d_sdl_128x64.c => u8x8_d_sdl_128x64.c} | 44 +-- u8g2/sys/sdl/hello_world_8x8/main.c | 14 +- 19 files changed, 984 insertions(+), 984 deletions(-) delete mode 100644 u8g2/csrc/u8g2.c delete mode 100644 u8g2/csrc/u8g2_byte.c delete mode 100644 u8g2/csrc/u8g2_cad.c delete mode 100644 u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c delete mode 100644 u8g2/csrc/u8g2_d_uc1701_dogs102.c delete mode 100644 u8g2/csrc/u8g2_display.c delete mode 100644 u8g2/csrc/u8g2_gpio.c rename u8g2/csrc/{u8g2.h => u8x8.h} (52%) rename u8g2/csrc/{u8g2_8x8.c => u8x8_8x8.c} (53%) create mode 100644 u8g2/csrc/u8x8_byte.c create mode 100644 u8g2/csrc/u8x8_cad.c create mode 100644 u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c rename u8g2/csrc/{u8g2_d_stdio.c => u8x8_d_stdio.c} (58%) create mode 100644 u8g2/csrc/u8x8_d_uc1701_dogs102.c create mode 100644 u8g2/csrc/u8x8_display.c create mode 100644 u8g2/csrc/u8x8_gpio.c create mode 100644 u8g2/csrc/u8x8_setup.c rename u8g2/sys/sdl/common/{u8g2_d_sdl_128x64.c => u8x8_d_sdl_128x64.c} (88%) diff --git a/u8g2/csrc/u8g2.c b/u8g2/csrc/u8g2.c deleted file mode 100644 index 87a33f7a..00000000 --- a/u8g2/csrc/u8g2.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - - u8g2.c - -*/ - - -#include "u8g2.h" - -uint8_t u8g2_dummy_cb(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - /* the dummy callback will not handle any message and will fail for all messages */ - return 0; -} - - -/* - Description: - Setup u8g2 - Args: - u8g2 An empty u8g2 structure -*/ -void u8g2_SetupDefaults(u8g2_t *u8g2) -{ - u8g2->display_info = NULL; - u8g2->display_cb = u8g2_dummy_cb; - u8g2->cad_cb = u8g2_dummy_cb; - u8g2->byte_cb = u8g2_dummy_cb; - u8g2->gpio_and_delay_cb = u8g2_dummy_cb; -} - - diff --git a/u8g2/csrc/u8g2_byte.c b/u8g2/csrc/u8g2_byte.c deleted file mode 100644 index 96d58c66..00000000 --- a/u8g2/csrc/u8g2_byte.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - - u8g2_byte.c - -*/ - -#include "u8g2.h" - -uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) -{ - return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SET_DC, dc, NULL); -} - -uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) -{ - return u8g2->byte_cb(u8g2, U8G2_MSG_BYTE_SEND, cnt, (void *)data); -} - -uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) -{ - return u8g2_byte_SendBytes(u8g2, 1, &byte); -} - - - -/* - Uses: - u8g2->display_info->sda_setup_time_ns - u8g2->display_info->sck_pulse_width_ns - u8g2->display_info->sck_takeover_edge - u8g2->display_info->chip_disable_level - u8g2->display_info->chip_enable_level - u8g2->display_info->post_chip_enable_wait_ns - u8g2->display_info->pre_chip_disable_wait_ns - Calls to GPIO and DELAY: - U8G2_MSG_DELAY_NANO - U8G2_MSG_GPIO_DC - U8G2_MSG_GPIO_CS - U8G2_MSG_GPIO_CLOCK - U8G2_MSG_GPIO_DATA - Handles: - U8G2_MSG_BYTE_INIT - U8G2_MSG_BYTE_SEND - U8G2_MSG_BYTE_SET_DC - U8G2_MSG_BYTE_START_TRANSFER - U8G2_MSG_BYTE_END_TRANSFER - U8G2_MSG_BYTE_SET_I2C_ADR (ignored) - U8G2_MSG_BYTE_SET_DEVICE (ignored) -*/ -uint8_t u8g2_byte_8bit_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - uint8_t i, b; - uint8_t *data; - uint8_t takeover_edge = u8g2->display_info->sck_takeover_edge; - uint8_t not_takeover_edge = 1 - takeover_edge; - - switch(msg) - { - case U8G2_MSG_BYTE_SEND: - data = (uint8_t *)arg_ptr; - while( arg_int > 0 ) - { - b = *data; - data++; - arg_int--; - for( i = 0; i < 8; i++ ) - { - if ( b & 128 ) - u8g2_gpio_SetData(u8g2, 1); - else - u8g2_gpio_SetData(u8g2, 0); - b <<= 1; - - u8g2_gpio_SetClock(u8g2, not_takeover_edge); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->sda_setup_time_ns); - u8g2_gpio_SetClock(u8g2, takeover_edge); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->sck_pulse_width_ns); - } - } - break; - - case U8G2_MSG_BYTE_INIT: - /* disable chipselect */ - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); - /* no wait required here */ - - /* for SPI: setup correct level of the clock signal */ - u8g2_gpio_SetClock(u8g2, u8g2->display_info->sck_takeover_edge); - break; - case U8G2_MSG_BYTE_SET_DC: - u8g2_gpio_SetDC(u8g2, arg_int); - break; - case U8G2_MSG_BYTE_START_TRANSFER: - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); - break; - case U8G2_MSG_BYTE_END_TRANSFER: - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); - break; - case U8G2_MSG_BYTE_SET_I2C_ADR: - break; - case U8G2_MSG_BYTE_SET_DEVICE: - break; - default: - return 0; - } - return 1; -} - diff --git a/u8g2/csrc/u8g2_cad.c b/u8g2/csrc/u8g2_cad.c deleted file mode 100644 index 9e47f48a..00000000 --- a/u8g2/csrc/u8g2_cad.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - - u8g2_cad.c - - "command arg data" interface to the graphics controller - - The following sequence must be used for any data, which is set to the display: - - - uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) - - any of the following calls - uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) - uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) - uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) - - uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) - - - -*/ -/* -uint8_t u8g2_cad_template(u8g2_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) -{ - uint8_t i; - - switch(msg) - { - case U8G2_MSG_CAD_SEND_CMD: - u8g2_mcd_byte_SetDC(mcd->next, 1); - u8g2_mcd_byte_Send(mcd->next, arg_int); - break; - case U8G2_MSG_CAD_SEND_ARG: - u8g2_mcd_byte_SetDC(mcd->next, 1); - u8g2_mcd_byte_Send(mcd->next, arg_int); - break; - case U8G2_MSG_CAD_SEND_DATA: - u8g2_mcd_byte_SetDC(mcd->next, 0); - for( i = 0; i < 8; i++ ) - u8g2_mcd_byte_Send(mcd->next, ((uint8_t *)arg_ptr)[i]); - break; - case U8G2_MSG_CAD_RESET: - return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_START_TRANSFER: - return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_END_TRANSFER: - return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_SET_I2C_ADR: - return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); - case U8G2_MSG_CAD_SET_DEVICE: - return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); - default: - break; - } - return 1; -} - -*/ - -#include "u8g2.h" - -uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_CMD, cmd, NULL); -} - -uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_ARG, arg, NULL); -} - -uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_SEND_DATA, cnt, data); -} - -uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_START_TRANSFER, 0, NULL); -} - -uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) -{ - return u8g2->cad_cb(u8g2, U8G2_MSG_CAD_END_TRANSFER, 0, NULL); -} - -/* - 0000ccaa command arg combination, aa = no of args, cc = no of commands - 0001dddd data sequence - 11110000 CS Off - 11110001 CS On - 11111110 xxxxxxxx delay in millis - 11111111 End of sequence - -*/ - -void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data) -{ - uint8_t cmd; - uint8_t v; - - for(;;) - { - cmd = *data; - data++; - switch( cmd ) - { - case U8G2_MSG_CAD_SEND_CMD: - case U8G2_MSG_CAD_SEND_ARG: - v = *data; - u8g2->cad_cb(u8g2, cmd, v, NULL); - data++; - break; - case U8G2_MSG_CAD_SEND_DATA: - v = *data; - u8g2_cad_SendData(u8g2, 1, &v); - data++; - break; - case U8G2_MSG_CAD_START_TRANSFER: - case U8G2_MSG_CAD_END_TRANSFER: - u8g2->cad_cb(u8g2, cmd, 0, NULL); - break; - case 0x0fe: - v = *data; - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, v); - data++; - break; - default: - return; - } - } -} - - -/* - convert to bytes by using - dc = 1 for commands and args and - dc = 0 for data -*/ -uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - switch(msg) - { - case U8G2_MSG_CAD_SEND_CMD: - u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_ARG: - u8g2_byte_SetDC(u8g2, 1); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_DATA: - u8g2_byte_SetDC(u8g2, 0); - //u8g2_byte_SendBytes(u8g2, arg_int, arg_ptr); - //break; - /* fall through */ - case U8G2_MSG_CAD_INIT: - case U8G2_MSG_CAD_START_TRANSFER: - case U8G2_MSG_CAD_END_TRANSFER: - case U8G2_MSG_CAD_SET_I2C_ADR: - case U8G2_MSG_CAD_SET_DEVICE: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - default: - return 0; - } - return 1; -} - -/* - convert to bytes by using - dc = 0 for commands and args and - dc = 1 for data -*/ -uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - switch(msg) - { - case U8G2_MSG_CAD_SEND_CMD: - u8g2_byte_SetDC(u8g2, 0); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_ARG: - u8g2_byte_SetDC(u8g2, 0); - u8g2_byte_SendByte(u8g2, arg_int); - break; - case U8G2_MSG_CAD_SEND_DATA: - u8g2_byte_SetDC(u8g2, 1); - //u8g2_byte_SendBytes(u8g2, arg_int, arg_ptr); - //break; - /* fall through */ - case U8G2_MSG_CAD_INIT: - case U8G2_MSG_CAD_START_TRANSFER: - case U8G2_MSG_CAD_END_TRANSFER: - case U8G2_MSG_CAD_SET_I2C_ADR: - case U8G2_MSG_CAD_SET_DEVICE: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); - default: - return 0; - } - return 1; -} - diff --git a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c deleted file mode 100644 index b074c801..00000000 --- a/u8g2/csrc/u8g2_d_ssd1306_128x64_noname.c +++ /dev/null @@ -1,156 +0,0 @@ - -#include "u8g2.h" - - - - -static const uint8_t u8g2_d_ssd1306_128x64_noname_init_seq[] = { - - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - - - U8G2_C(0x0ae), /* display off */ - U8G2_CA(0x0d5, 0x080), /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */ - U8G2_CA(0x0a8, 0x03f), /* multiplex ratio */ - U8G2_CA(0x0d3, 0x000), /* display offset */ - U8G2_C(0x040), /* set display start line to 0 */ - U8G2_CA(0x08d, 0x014), /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */ - U8G2_CA(0x020, 0x000), /* page addressing mode */ - -#if U8G2_DEFAULT_FLIP_MODE == 0 - U8G2_C(0x0a1), /* segment remap a0/a1*/ - U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ -#else - U8G2_C(0x0a0), /* segment remap a0/a1*/ - U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ -#endif - - U8G2_CA(0x0da, 0x012), /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */ - U8G2_CA(0x081, 0x0cf), /* [2] set contrast control */ - U8G2_CA(0x0d9, 0x0f1), /* [2] pre-charge period 0x022/f1*/ - U8G2_CA(0x0db, 0x040), /* vcomh deselect level */ - - U8G2_C(0x02e), /* Deactivate scroll */ - U8G2_C(0x0a4), /* output ram to display */ - U8G2_C(0x0a6), /* none inverted normal display mode */ - - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_ssd1306_128x64_noname_powersave0_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0af), /* display on */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_ssd1306_128x64_noname_powersave1_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0ae), /* display off */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -#ifdef U8G2_WITH_SET_FLIP_MODE -static const uint8_t u8g2_d_ssd1306_128x64_noname_flip0_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0a1), /* segment remap a0/a1*/ - U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_ssd1306_128x64_noname_flip1_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0a0), /* segment remap a0/a1*/ - U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; -#endif - -static const u8g2_display_info_t u8g2_ssd1306_128x64_noname_display_info = -{ - /* chip_enable_level = */ 0, - /* chip_disable_level = */ 1, - - /* post_chip_enable_wait_ns = */ 20, - /* pre_chip_disable_wait_ns = */ 10, - /* reset_pulse_width_ms = */ 100, /* SSD1306: 3 us */ - /* post_reset_wait_ms = */ 100, /* far east OLEDs need much longer setup time */ - /* sda_setup_time_ns = */ 50, /* SSD1306: 15ns, but cycle time is 100ns, so use 100/2 */ - /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/2 */ - /* sck_takeover_edge = */ 1, /* rising edge */ - /* i2c_bus_clock_100kHz = */ 4, - /* data_setup_time_ns = */ 40, - /* write_pulse_width_ns = */ 150, /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */ - /* tile_width = */ 16, - /* tile_hight = */ 8, - /* default_x_offset = */ 0 -}; - -uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - uint8_t x, c; - uint8_t *ptr; - switch(msg) - { - case U8G2_MSG_DISPLAY_INIT: - u8g2_d_helper_display_init(u8g2, &u8g2_ssd1306_128x64_noname_display_info); - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_init_seq); - - break; - case U8G2_MSG_DISPLAY_SET_POWER_SAVE: - if ( arg_int == 0 ) - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_powersave0_seq); - else - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_powersave1_seq); - break; -#ifdef U8G2_WITH_SET_FLIP_MODE - case U8G2_MSG_DISPLAY_SET_FLIP_MODE: - if ( arg_int == 0 ) - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip0_seq); - else - u8g2_cad_SendSequence(u8g2, u8g2_d_ssd1306_128x64_noname_flip1_seq); - break; -#endif -#ifdef U8G2_WITH_SET_CONTRAST - case U8G2_MSG_DISPLAY_SET_CONTRAST: - u8g2_cad_StartTransfer(u8g2); - u8g2_cad_SendCmd(u8g2, 0x081 ); - u8g2_cad_SendArg(u8g2, arg_int ); /* ssd1306 has range from 0 to 255 */ - u8g2_cad_EndTransfer(u8g2); - break; -#endif - case U8G2_MSG_DISPLAY_DRAW_TILE: - u8g2_cad_StartTransfer(u8g2); - x = ((u8g2_tile_t *)arg_ptr)->x_pos; - x *= 8; - x += u8g2->x_offset; - u8g2_cad_SendCmd(u8g2, 0x010 | (x>>4) ); - u8g2_cad_SendCmd(u8g2, 0x000 | ((x&15))); - u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); - - do - { - c = ((u8g2_tile_t *)arg_ptr)->cnt; - ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; - do - { - u8g2_cad_SendData(u8g2, 8, ptr); - ptr += 8; - c--; - } while( c > 0 ); - arg_int--; - } while( arg_int > 0 ); - - u8g2_cad_EndTransfer(u8g2); - break; - default: - return 0; - } - return 1; -} - - diff --git a/u8g2/csrc/u8g2_d_uc1701_dogs102.c b/u8g2/csrc/u8g2_d_uc1701_dogs102.c deleted file mode 100644 index d01e62db..00000000 --- a/u8g2/csrc/u8g2_d_uc1701_dogs102.c +++ /dev/null @@ -1,162 +0,0 @@ - -#include "u8g2.h" - - - - -static const uint8_t u8g2_d_uc1701_dogs102_init_seq[] = { - - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - - U8G2_C(0x0e2), /* soft reset */ - U8G2_C(0x0ae), /* display off */ - U8G2_C(0x040), /* set display start line to 0 */ - -#if U8G2_DEFAULT_FLIP_MODE == 0 - U8G2_C(0x0a1), /* ADC set to reverse */ - U8G2_C(0x0c0), /* common output mode */ -#else - U8G2_C(0x0a0), /* ADC set to reverse */ - U8G2_C(0x0c8), /* common output mode */ -#endif - - U8G2_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */ - U8G2_C(0x0a2), /* LCD bias 1/9 */ - U8G2_C(0x02f), /* all power control circuits on */ - U8G2_C(0x027), /* regulator, booster and follower */ - U8G2_CA(0x081, 0x00e), /* set contrast, contrast value, EA default: 0x010, previous value for S102: 0x0e */ - U8G2_C(0x0fa), /* Set Temp compensation */ - U8G2_C(0x090), /* 0.11 deg/c WP Off WC Off*/ - U8G2_C(0x0a4), /* normal display */ - - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_uc1701_dogs102_powersave0_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0af), /* display on */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_uc1701_dogs102_powersave1_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0ae), /* display off */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -#ifdef U8G2_WITH_SET_FLIP_MODE -static const uint8_t u8g2_d_uc1701_dogs102_flip0_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0a1), /* segment remap a0/a1*/ - U8G2_C(0x0c0), /* c0: scan dir normal, c8: reverse */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; - -static const uint8_t u8g2_d_uc1701_dogs102_flip1_seq[] = { - U8G2_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ - U8G2_C(0x0a0), /* segment remap a0/a1*/ - U8G2_C(0x0c8), /* c0: scan dir normal, c8: reverse */ - U8G2_END_TRANSFER(), /* disable chip */ - U8G2_END() /* end of sequence */ -}; -#endif - - -static const u8g2_display_info_t u8g2_uc1701_display_info = -{ - /* chip_enable_level = */ 0, - /* chip_disable_level = */ 1, - - /* post_chip_enable_wait_ns = */ 5, - /* pre_chip_disable_wait_ns = */ 5, - /* reset_pulse_width_ms = */ 1, - /* post_reset_wait_ms = */ 6, - /* sda_setup_time_ns = */ 15, /* if this is smaller than sck_pulse_width_ns, use sck_pulse_width_ns, so use 15 instead of 12*/ - /* sck_pulse_width_ns = */ 15, - /* sck_takeover_edge = */ 1, /* rising edge */ - /* i2c_bus_clock_100kHz = */ 37, - /* data_setup_time_ns = */ 30, - /* write_pulse_width_ns = */ 40, - /* tile_width = */ 13, - /* tile_hight = */ 8, -#if U8G2_DEFAULT_FLIP_MODE == 0 - /* default_x_offset = */ 0, -#else - /* default_x_offset = */ 30, -#endif -}; - -uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -{ - uint8_t x, c; - uint8_t *ptr; - switch(msg) - { - case U8G2_MSG_DISPLAY_INIT: - u8g2_d_helper_display_init(u8g2, &u8g2_uc1701_display_info); - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_init_seq); - break; - case U8G2_MSG_DISPLAY_SET_POWER_SAVE: - if ( arg_int == 0 ) - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_powersave0_seq); - else - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_powersave1_seq); - break; - #ifdef U8G2_WITH_SET_FLIP_MODE - case U8G2_MSG_DISPLAY_SET_FLIP_MODE: - if ( arg_int == 0 ) - { - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_flip0_seq); - u8g2->x_offset = 0; - } - else - { - u8g2_cad_SendSequence(u8g2, u8g2_d_uc1701_dogs102_flip1_seq); - u8g2->x_offset = 30; - } - break; -#endif -#ifdef U8G2_WITH_SET_CONTRAST - case U8G2_MSG_DISPLAY_SET_CONTRAST: - u8g2_cad_StartTransfer(u8g2); - u8g2_cad_SendCmd(u8g2, 0x081 ); - u8g2_cad_SendArg(u8g2, arg_int >> 2 ); /* uc1701 has range from 0 to 63 */ - u8g2_cad_EndTransfer(u8g2); - break; -#endif - case U8G2_MSG_DISPLAY_DRAW_TILE: - u8g2_cad_StartTransfer(u8g2); - - x = ((u8g2_tile_t *)arg_ptr)->x_pos; - x *= 8; - x += u8g2->x_offset; - u8g2_cad_SendCmd(u8g2, 0x010 | (x>>4) ); - u8g2_cad_SendCmd(u8g2, 0x000 | ((x&15))); - u8g2_cad_SendCmd(u8g2, 0x0b0 | (((u8g2_tile_t *)arg_ptr)->y_pos)); - - do - { - c = ((u8g2_tile_t *)arg_ptr)->cnt; - ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; - do - { - u8g2_cad_SendData(u8g2, 8, ptr); - ptr += 8; - c--; - } while( c > 0 ); - arg_int--; - } while( arg_int > 0 ); - - u8g2_cad_EndTransfer(u8g2); - break; - default: - return 0; - } - return 1; -} - - diff --git a/u8g2/csrc/u8g2_display.c b/u8g2/csrc/u8g2_display.c deleted file mode 100644 index 5c1c43d1..00000000 --- a/u8g2/csrc/u8g2_display.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - - u8g2_display.c - - Abstraction layer for the graphics controller. - Main goal is the placement of a 8x8 pixel block on the display. - -*/ - - -#include "u8g2.h" - - -/*==========================================*/ -/* internal library function */ -/* - this is a helper function for the U8G2_MSG_DISPLAY_INIT function. - It can be called within the display callback function to carry out the usual standard tasks. - -*/ -void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display_info) -{ - /* 1) set display info struct */ - u8g2->display_info = display_info; - u8g2->x_offset = u8g2->display_info->default_x_offset; - - /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ - u8g2_gpio_Init(u8g2); - u8g2_cad_Init(u8g2); - - /* 3) do reset */ - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 0); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8g2_gpio_SetReset(u8g2, 1); - u8g2_gpio_Delay(u8g2, U8G2_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); -} - -/*==========================================*/ -/* official functions */ - -uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) -{ - u8g2_tile_t tile; - tile.x_pos = x; - tile.y_pos = y; - tile.cnt = cnt; - tile.tile_ptr = tile_ptr; - return u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); -} - -void u8g2_display_Init(u8g2_t *u8g2) -{ - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_INIT, 0, NULL); -} - -void u8g2_display_SetPowerSave(u8g2_t *u8g2, uint8_t is_enable) -{ - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_POWER_SAVE, is_enable, NULL); -} - -void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode) -{ - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); -} - -void u8g2_display_SetContrast(u8g2_t *u8g2, uint8_t value) -{ - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_SET_CONTRAST, value, NULL); -} - - -void u8g2_display_ClearScreen(u8g2_t *u8g2) -{ - uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - u8g2_tile_t tile; - uint8_t h; - - tile.x_pos = 0; - tile.cnt = 1; - tile.tile_ptr = buf; - - h = u8g2->display_info->tile_height; - tile.y_pos = 0; - do - { - u8g2->display_cb(u8g2, U8G2_MSG_DISPLAY_DRAW_TILE, u8g2->display_info->tile_width, (void *)&tile); - tile.y_pos++; - } while( tile.y_pos < h ); -} - diff --git a/u8g2/csrc/u8g2_gpio.c b/u8g2/csrc/u8g2_gpio.c deleted file mode 100644 index fff8d7c3..00000000 --- a/u8g2/csrc/u8g2_gpio.c +++ /dev/null @@ -1,15 +0,0 @@ - -#include "u8g2.h" - - -void u8g2_gpio_call(u8g2_t *u8g2, uint8_t msg, uint8_t arg) -{ - u8g2->gpio_and_delay_cb(u8g2, msg, arg, NULL); -} - -/* -void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) -{ - u8g2->gpio_and_delay_cb(u8g2, msg, dly, NULL); -} -*/ \ No newline at end of file diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8x8.h similarity index 52% rename from u8g2/csrc/u8g2.h rename to u8g2/csrc/u8x8.h index 181945dd..48f60d46 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8x8.h @@ -9,11 +9,11 @@ The topmost level is the display layer. It includes the following messages: - U8G2_MSG_DISPLAY_INIT - U8G2_MSG_DISPLAY_SET_FLIP_MODE - U8G2_MSG_DISPLAY_SET_POWER_SAVE - U8G2_MSG_DISPLAY_SET_CONTRAST - U8G2_MSG_DISPLAY_DRAW_TILE + U8X8_MSG_DISPLAY_INIT + U8X8_MSG_DISPLAY_SET_FLIP_MODE + U8X8_MSG_DISPLAY_SET_POWER_SAVE + U8X8_MSG_DISPLAY_SET_CONTRAST + U8X8_MSG_DISPLAY_DRAW_TILE A display driver may decided to breakdown these messages to a lower level interface or implement this functionality directly. @@ -22,50 +22,50 @@ One layer is the Command/Arg/Data interface. It can be used by the display layer to communicate with the display hardware. This layer only deals with data, commands and arguments. D/C line is unknown. - U8G2_MSG_CAD_INIT - U8G2_MSG_CAD_SET_I2C_ADR - U8G2_MSG_CAD_SET_DEVICE - U8G2_MSG_CAD_START_TRANSFER - U8G2_MSG_CAD_SEND_CMD - U8G2_MSG_CAD_SEND_ARG - U8G2_MSG_CAD_SEND_DATA - U8G2_MSG_CAD_END_TRANSFER + U8X8_MSG_CAD_INIT + U8X8_MSG_CAD_SET_I2C_ADR + U8X8_MSG_CAD_SET_DEVICE + U8X8_MSG_CAD_START_TRANSFER + U8X8_MSG_CAD_SEND_CMD + U8X8_MSG_CAD_SEND_ARG + U8X8_MSG_CAD_SEND_DATA + U8X8_MSG_CAD_END_TRANSFER The byte interface is there to send 1 byte (8 bits) to the display hardware. This layer depends on the hardware of a microcontroller, if a specific hardware should be used (I2C or SPI). If this interface is implemented via software, it may use the GPIO level for sending bytes. - U8G2_MSG_BYTE_INIT - U8G2_MSG_BYTE_SEND 30 - U8G2_MSG_BYTE_SET_DC 31 - U8G2_MSG_BYTE_START_TRANSFER - U8G2_MSG_BYTE_END_TRANSFER - U8G2_MSG_BYTE_SET_I2C_ADR - U8G2_MSG_BYTE_SET_DEVICE + U8X8_MSG_BYTE_INIT + U8X8_MSG_BYTE_SEND 30 + U8X8_MSG_BYTE_SET_DC 31 + U8X8_MSG_BYTE_START_TRANSFER + U8X8_MSG_BYTE_END_TRANSFER + U8X8_MSG_BYTE_SET_I2C_ADR + U8X8_MSG_BYTE_SET_DEVICE GPIO and Delay - U8G2_MSG_GPIO_INIT - U8G2_MSG_DELAY_MILLI - U8G2_MSG_DELAY_10MICRO - U8G2_MSG_DELAY_100NANO + U8X8_MSG_GPIO_INIT + U8X8_MSG_DELAY_MILLI + U8X8_MSG_DELAY_10MICRO + U8X8_MSG_DELAY_100NANO */ -#ifndef _U8G2_H -#define _U8G2_H +#ifndef _U8X8_H +#define _U8X8_H /*==========================================*/ /* Global Defines */ -/* Undefine this to remove u8g2_display_SetContrast function */ -#define U8G2_WITH_SET_CONTRAST +/* Undefine this to remove u8x8_display_SetContrast function */ +#define U8X8_WITH_SET_CONTRAST -/* Undefine this to remove u8g2_display_SetFlipMode function */ -#define U8G2_WITH_SET_FLIP_MODE +/* Undefine this to remove u8x8_display_SetFlipMode function */ +#define U8X8_WITH_SET_FLIP_MODE -/* Select 0 or 1 for the default flip mode. This is not affected by U8G2_WITH_FLIP_MODE */ -#define U8G2_DEFAULT_FLIP_MODE 0 +/* Select 0 or 1 for the default flip mode. This is not affected by U8X8_WITH_FLIP_MODE */ +#define U8X8_DEFAULT_FLIP_MODE 0 /*==========================================*/ /* Includes */ @@ -91,50 +91,50 @@ extern "C" { #ifdef __GNUC__ -# define U8G2_NOINLINE __attribute__((noinline)) +# define U8X8_NOINLINE __attribute__((noinline)) #else -# define U8G2_NOINLINE +# define U8X8_NOINLINE #endif #if defined(__GNUC__) && defined(__AVR__) -# define U8G2_SECTION(name) __attribute__ ((section (name))) -# define U8G2_FONT_SECTION(name) U8G2_SECTION(".progmem." name) -# define u8g2_pgm_read(adr) pgm_read_byte_near(adr) +# define U8X8_SECTION(name) __attribute__ ((section (name))) +# define U8X8_FONT_SECTION(name) U8X8_SECTION(".progmem." name) +# define u8x8_pgm_read(adr) pgm_read_byte_near(adr) #endif -#ifndef U8G2_SECTION -# define U8G2_SECTION(name) __attribute__ ((section (name))) -# define U8G2_FONT_SECTION(name) -# define u8g2_pgm_read(adr) (*(const uint8_t *)(adr)) +#ifndef U8X8_SECTION +# define U8X8_SECTION(name) __attribute__ ((section (name))) +# define U8X8_FONT_SECTION(name) +# define u8x8_pgm_read(adr) (*(const uint8_t *)(adr)) #endif /*==========================================*/ /* U8G2 typedefs and data structures */ -typedef uint16_t u8g2_uint_t; /* for pixel position only */ +typedef uint16_t u8x8_uint_t; /* for pixel position only */ -typedef struct u8g2_struct u8g2_t; -typedef struct u8g2_display_info_struct u8g2_display_info_t; -typedef struct u8g2_tile_struct u8g2_tile_t; +typedef struct u8x8_struct u8x8_t; +typedef struct u8x8_display_info_struct u8x8_display_info_t; +typedef struct u8x8_tile_struct u8x8_tile_t; typedef struct u8g2x_struct u8g2x_t; typedef struct u8g2x_cb_struct u8g2x_cb_t; -typedef uint8_t (*u8g2_msg_cb)(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); typedef void (*u8g2x_update_dimension_cb)(u8g2x_t *u8g2x_t); -typedef void (*u8g2x_draw_l90_cb)(u8g2x_t *u8g2x_t, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); +typedef void (*u8g2x_draw_l90_cb)(u8g2x_t *u8g2x_t, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir); -//struct u8g2_mcd_struct +//struct u8x8_mcd_struct //{ -// u8g2_msg_cb cb; /* current callback function */ -// u8g2_t *u8g2; /* pointer to the u8g2 parent to minimize the number of args */ -// u8g2_mcd_t *next; +// u8x8_msg_cb cb; /* current callback function */ +// u8x8_t *u8g2; /* pointer to the u8g2 parent to minimize the number of args */ +// u8x8_mcd_t *next; //}; -struct u8g2_tile_struct +struct u8x8_tile_struct { uint8_t *tile_ptr; /* pointer to one or more tiles */ uint8_t cnt; /* number of tiles */ @@ -143,7 +143,7 @@ struct u8g2_tile_struct }; -struct u8g2_display_info_struct +struct u8x8_display_info_struct { /* == general == */ @@ -188,14 +188,14 @@ struct u8g2_display_info_struct uint8_t default_x_offset; /* default x offset for the display */ }; -struct u8g2_struct +struct u8x8_struct { - //u8g2_t *u8g2_root; /* root of the message call chain */ - const u8g2_display_info_t *display_info; - u8g2_msg_cb display_cb; - u8g2_msg_cb cad_cb; - u8g2_msg_cb byte_cb; - u8g2_msg_cb gpio_and_delay_cb; + //u8x8_t *u8x8_root; /* root of the message call chain */ + const u8x8_display_info_t *display_info; + u8x8_msg_cb display_cb; + u8x8_msg_cb cad_cb; + u8x8_msg_cb byte_cb; + u8x8_msg_cb gpio_and_delay_cb; const uint8_t *font; uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; @@ -210,7 +210,7 @@ struct u8g2x_cb_struct struct u8g2x_struct { - u8g2_t u8x8; + u8x8_t u8x8; u8g2x_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ @@ -218,60 +218,60 @@ struct u8g2x_struct uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ }; -#define u8g2x_GetU8x8(u8g2x) ((u8g2_t *)(u8g2x)) +#define u8g2x_GetU8x8(u8g2x) ((u8x8_t *)(u8g2x)) /*==========================================*/ /* helper functions */ -void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display_info); +void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display_info); /* Display Interface */ /* - Name: U8G2_MSG_DISPLAY_INIT + Name: U8X8_MSG_DISPLAY_INIT Args: None Tasks: 1) setup u8g2->display_info copy u8g2->display_info->default_x_offset to u8g2->x_offset 2) put interface into default state: - execute u8g2_gpio_Init for port directions - execute u8g2_cad_Init for default port levels + execute u8x8_gpio_Init for port directions + execute u8x8_cad_Init for default port levels 3) set CS status (not clear, may be done in cad/byte interface 4) execute display reset (gpio interface) 5) send setup sequence to display, do not activate display, disable "power save" will follow */ -#define U8G2_MSG_DISPLAY_INIT 10 +#define U8X8_MSG_DISPLAY_INIT 10 /* - Name: U8G2_MSG_DISPLAY_SET_POWER_SAVE + Name: U8X8_MSG_DISPLAY_SET_POWER_SAVE Args: arg_int: 0: normal mode (RAM is visible on the display), 1: nothing is shown Tasks: Depending on arg_int, put the display into normal or power save mode. Send the corresponding sequence to the display. In power save mode, it must be possible to modify the RAM content. */ -#define U8G2_MSG_DISPLAY_SET_POWER_SAVE 11 +#define U8X8_MSG_DISPLAY_SET_POWER_SAVE 11 /* - Name: U8G2_MSG_DISPLAY_SET_FLIP_MODE + Name: U8X8_MSG_DISPLAY_SET_FLIP_MODE Args: arg_int: 0: normal mode, 1: flipped HW screen (180 degree) Tasks: Reprogramms the display controller to rotate the display by 180 degree (arg_int = 1) or not (arg_int = 0) This may change u8g2->x_offset if the display is smaller than the controller ram - This message should only be supported if U8G2_WITH_FLIP_MODE is defined. + This message should only be supported if U8X8_WITH_FLIP_MODE is defined. */ -#define U8G2_MSG_DISPLAY_SET_FLIP_MODE 13 +#define U8X8_MSG_DISPLAY_SET_FLIP_MODE 13 /* arg_int: 0..255 contrast value */ -#define U8G2_MSG_DISPLAY_SET_CONTRAST 14 +#define U8X8_MSG_DISPLAY_SET_CONTRAST 14 /* - Name: U8G2_MSG_DISPLAY_DRAW_TILE + Name: U8X8_MSG_DISPLAY_DRAW_TILE Args: arg_int: How often to repeat this tile pattern - arg_ptr: pointer to u8g2_tile_t + arg_ptr: pointer to u8x8_tile_t uint8_t *tile_ptr; pointer to one or more tiles (number is "cnt") uint8_t cnt; number of tiles uint8_t x_pos; first tile x position @@ -294,21 +294,21 @@ void u8g2_d_helper_display_init(u8g2_t *u8g2, const u8g2_display_info_t *display ABABAB. Totally, cnt*arg_int tiles will be drawn. */ -#define U8G2_MSG_DISPLAY_DRAW_TILE 15 +#define U8X8_MSG_DISPLAY_DRAW_TILE 15 /* arg_ptr: layout struct */ -//#define U8G2_MSG_DISPLAY_GET_LAYOUT 16 +//#define U8X8_MSG_DISPLAY_GET_LAYOUT 16 -/* u8g2_display.c */ -uint8_t u8g2_display_DrawTile(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); +/* u8x8_display.c */ +uint8_t u8x8_display_DrawTile(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); -/* Init display, but keep display in power save mode. Usually this command must be followed by u8g2_display_SetPowerSave() */ -void u8g2_display_Init(u8g2_t *u8g2); +/* Init display, but keep display in power save mode. Usually this command must be followed by u8x8_display_SetPowerSave() */ +void u8x8_display_Init(u8x8_t *u8g2); /* wake up display from power save mode */ -void u8g2_display_SetPowerSave(u8g2_t *u8g2, uint8_t is_enable); -void u8g2_display_SetFlipMode(u8g2_t *u8g2, uint8_t mode); -void u8g2_display_SetContrast(u8g2_t *u8g2, uint8_t value); -void u8g2_display_ClearScreen(u8g2_t *u8g2); +void u8x8_display_SetPowerSave(u8x8_t *u8g2, uint8_t is_enable); +void u8x8_display_SetFlipMode(u8x8_t *u8g2, uint8_t mode); +void u8x8_display_SetContrast(u8x8_t *u8g2, uint8_t value); +void u8x8_display_ClearScreen(u8x8_t *u8g2); @@ -316,83 +316,83 @@ void u8g2_display_ClearScreen(u8g2_t *u8g2); /* Command Arg Data (CAD) Interface */ /* - U8G2_MSG_CAD_INIT + U8X8_MSG_CAD_INIT no args - call U8G2_MSG_BYTE_INIT + call U8X8_MSG_BYTE_INIT setup default values for the I/O lines */ -#define U8G2_MSG_CAD_INIT 20 +#define U8X8_MSG_CAD_INIT 20 -#define U8G2_MSG_CAD_SEND_CMD 21 +#define U8X8_MSG_CAD_SEND_CMD 21 /* arg_int: cmd byte */ -#define U8G2_MSG_CAD_SEND_ARG 22 +#define U8X8_MSG_CAD_SEND_ARG 22 /* arg_int: arg byte */ -#define U8G2_MSG_CAD_SEND_DATA 23 +#define U8X8_MSG_CAD_SEND_DATA 23 /* arg_int: expected cs level after processing this msg */ -#define U8G2_MSG_CAD_START_TRANSFER 24 +#define U8X8_MSG_CAD_START_TRANSFER 24 /* arg_int: expected cs level after processing this msg */ -#define U8G2_MSG_CAD_END_TRANSFER 25 +#define U8X8_MSG_CAD_END_TRANSFER 25 /* arg_int = 0: disable chip, arg_int = 1: enable chip */ -#define U8G2_MSG_CAD_SET_I2C_ADR 26 -#define U8G2_MSG_CAD_SET_DEVICE 27 +#define U8X8_MSG_CAD_SET_I2C_ADR 26 +#define U8X8_MSG_CAD_SET_DEVICE 27 /* u8g_cad.c */ -#define u8g2_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8G2_MSG_CAD_INIT, 0, NULL )) +#define u8x8_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8X8_MSG_CAD_INIT, 0, NULL )) -uint8_t u8g2_cad_SendCmd(u8g2_t *u8g2, uint8_t cmd) U8G2_NOINLINE; -uint8_t u8g2_cad_SendArg(u8g2_t *u8g2, uint8_t arg) U8G2_NOINLINE; -uint8_t u8g2_cad_SendData(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; -uint8_t u8g2_cad_StartTransfer(u8g2_t *u8g2) U8G2_NOINLINE; -uint8_t u8g2_cad_EndTransfer(u8g2_t *u8g2) U8G2_NOINLINE; +uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) U8X8_NOINLINE; +uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) U8X8_NOINLINE; +uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; +uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) U8X8_NOINLINE; +uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) U8X8_NOINLINE; /* -#define U8G2_C(c0) (0x04), (c0) -#define U8G2_CA(c0,a0) (0x05), (c0), (a0) -#define U8G2_CAA(c0,a0,a1) (0x06), (c0), (a0), (a1) -#define U8G2_DATA() (0x10) -#define U8G2_D1(d0) (0x11), (d0) +#define U8X8_C(c0) (0x04), (c0) +#define U8X8_CA(c0,a0) (0x05), (c0), (a0) +#define U8X8_CAA(c0,a0,a1) (0x06), (c0), (a0), (a1) +#define U8X8_DATA() (0x10) +#define U8X8_D1(d0) (0x11), (d0) */ -#define U8G2_C(c0) (U8G2_MSG_CAD_SEND_CMD), (c0) -#define U8G2_CA(c0,a0) (U8G2_MSG_CAD_SEND_CMD), (c0), (U8G2_MSG_CAD_SEND_ARG), (a0) -#define U8G2_CAA(c0,a0,a1) (U8G2_MSG_CAD_SEND_CMD), (c0), (U8G2_MSG_CAD_SEND_ARG), (a0), (U8G2_MSG_CAD_SEND_ARG), (a1) -#define U8G2_D1(d0) (U8G2_MSG_CAD_SEND_DATA), (d0) +#define U8X8_C(c0) (U8X8_MSG_CAD_SEND_CMD), (c0) +#define U8X8_CA(c0,a0) (U8X8_MSG_CAD_SEND_CMD), (c0), (U8X8_MSG_CAD_SEND_ARG), (a0) +#define U8X8_CAA(c0,a0,a1) (U8X8_MSG_CAD_SEND_CMD), (c0), (U8X8_MSG_CAD_SEND_ARG), (a0), (U8X8_MSG_CAD_SEND_ARG), (a1) +#define U8X8_D1(d0) (U8X8_MSG_CAD_SEND_DATA), (d0) -#define U8G2_START_TRANSFER() (U8G2_MSG_CAD_START_TRANSFER) -#define U8G2_END_TRANSFER() (U8G2_MSG_CAD_END_TRANSFER) -#define U8G2_DLY(m) (0xfe),(m) -#define U8G2_END() (0xff) +#define U8X8_START_TRANSFER() (U8X8_MSG_CAD_START_TRANSFER) +#define U8X8_END_TRANSFER() (U8X8_MSG_CAD_END_TRANSFER) +#define U8X8_DLY(m) (0xfe),(m) +#define U8X8_END() (0xff) -void u8g2_cad_SendSequence(u8g2_t *u8g2, uint8_t const *data); -uint8_t u8g2_cad_110(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); -uint8_t u8g2_cad_001(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data); +uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ /* Byte Interface */ -#define U8G2_MSG_BYTE_INIT U8G2_MSG_CAD_INIT -#define U8G2_MSG_BYTE_SET_DC 32 +#define U8X8_MSG_BYTE_INIT U8X8_MSG_CAD_INIT +#define U8X8_MSG_BYTE_SET_DC 32 -#define U8G2_MSG_BYTE_SEND U8G2_MSG_CAD_SEND_DATA +#define U8X8_MSG_BYTE_SEND U8X8_MSG_CAD_SEND_DATA -#define U8G2_MSG_BYTE_START_TRANSFER U8G2_MSG_CAD_START_TRANSFER -#define U8G2_MSG_BYTE_END_TRANSFER U8G2_MSG_CAD_END_TRANSFER +#define U8X8_MSG_BYTE_START_TRANSFER U8X8_MSG_CAD_START_TRANSFER +#define U8X8_MSG_BYTE_END_TRANSFER U8X8_MSG_CAD_END_TRANSFER -#define U8G2_MSG_BYTE_SET_I2C_ADR U8G2_MSG_CAD_SET_I2C_ADR -#define U8G2_MSG_BYTE_SET_DEVICE U8G2_MSG_CAD_SET_DEVICE +#define U8X8_MSG_BYTE_SET_I2C_ADR U8X8_MSG_CAD_SET_I2C_ADR +#define U8X8_MSG_BYTE_SET_DEVICE U8X8_MSG_CAD_SET_DEVICE -uint8_t u8g2_byte_SetDC(u8g2_t *u8g2, uint8_t dc) U8G2_NOINLINE; -uint8_t u8g2_byte_SendByte(u8g2_t *u8g2, uint8_t byte) U8G2_NOINLINE; -uint8_t u8g2_byte_SendBytes(u8g2_t *u8g2, uint8_t cnt, uint8_t *data) U8G2_NOINLINE; +uint8_t u8x8_byte_SetDC(u8x8_t *u8g2, uint8_t dc) U8X8_NOINLINE; +uint8_t u8x8_byte_SendByte(u8x8_t *u8g2, uint8_t byte) U8X8_NOINLINE; +uint8_t u8x8_byte_SendBytes(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; -uint8_t u8g2_byte_8bit_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ @@ -400,80 +400,80 @@ uint8_t u8g2_byte_8bit_sw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void * /* - U8G2_MSG_GPIO_AND_DELAY_INIT + U8X8_MSG_GPIO_AND_DELAY_INIT no args setup port directions, do not set IO levels, this is done with BYTE/CAD_INIT */ -#define U8G2_MSG_GPIO_AND_DELAY_INIT 40 +#define U8X8_MSG_GPIO_AND_DELAY_INIT 40 /* arg_int: milliseconds */ -#define U8G2_MSG_DELAY_MILLI 41 +#define U8X8_MSG_DELAY_MILLI 41 -#define U8G2_MSG_DELAY_10MICRO 42 -#define U8G2_MSG_DELAY_100NANO 43 -#define U8G2_MSG_DELAY_NANO 44 +#define U8X8_MSG_DELAY_10MICRO 42 +#define U8X8_MSG_DELAY_100NANO 43 +#define U8X8_MSG_DELAY_NANO 44 -#define U8G2_MSG_GPIO_DC 45 -#define U8G2_MSG_GPIO_CS 46 -#define U8G2_MSG_GPIO_RESET 47 -#define U8G2_MSG_GPIO_CLOCK 48 -#define U8G2_MSG_GPIO_DATA 49 +#define U8X8_MSG_GPIO_DC 45 +#define U8X8_MSG_GPIO_CS 46 +#define U8X8_MSG_GPIO_RESET 47 +#define U8X8_MSG_GPIO_CLOCK 48 +#define U8X8_MSG_GPIO_DATA 49 -#define u8g2_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) +#define u8x8_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) /* -#define u8g2_gpio_SetDC(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_DC, (v), NULL )) -#define u8g2_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_CS, (v), NULL )) -#define u8g2_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8G2_MSG_GPIO_RESET, (v), NULL )) +#define u8x8_gpio_SetDC(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_DC, (v), NULL )) +#define u8x8_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_CS, (v), NULL )) +#define u8x8_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_RESET, (v), NULL )) */ -#define u8g2_gpio_SetDC(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_DC, (v)) -#define u8g2_gpio_SetCS(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) -#define u8g2_gpio_SetReset(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CS, (v)) -#define u8g2_gpio_SetClock(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_CLOCK, (v)) -#define u8g2_gpio_SetData(u8g2, v) u8g2_gpio_call(u8g2, U8G2_MSG_GPIO_DATA, (v)) +#define u8x8_gpio_SetDC(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_DC, (v)) +#define u8x8_gpio_SetCS(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CS, (v)) +#define u8x8_gpio_SetReset(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CS, (v)) +#define u8x8_gpio_SetClock(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CLOCK, (v)) +#define u8x8_gpio_SetData(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_DATA, (v)) -void u8g2_gpio_call(u8g2_t *u8g2, uint8_t msg, uint8_t arg) U8G2_NOINLINE; +void u8x8_gpio_call(u8x8_t *u8g2, uint8_t msg, uint8_t arg) U8X8_NOINLINE; -#define u8g2_gpio_Delay(u8g2, msg, dly) u8g2_gpio_call((u8g2), (msg), (dly)) -//void u8g2_gpio_Delay(u8g2_t *u8g2, uint8_t msg, uint8_t dly) U8G2_NOINLINE; +#define u8x8_gpio_Delay(u8g2, msg, dly) u8x8_gpio_call((u8g2), (msg), (dly)) +//void u8x8_gpio_Delay(u8x8_t *u8g2, uint8_t msg, uint8_t dly) U8X8_NOINLINE; /*==========================================*/ /* u8g2.c */ -void u8g2_SetupDefaults(u8g2_t *u8g2); +void u8x8_SetupDefaults(u8x8_t *u8g2); /*==========================================*/ -/* u8g2_d_stdio.c */ -void u8g2_SetupStdio(u8g2_t *u8g2); +/* u8x8_d_stdio.c */ +void u8x8_SetupStdio(u8x8_t *u8g2); /*==========================================*/ -/* u8g2_d_sdl_128x64.c */ -void u8g2_Setup_SDL_128x64(u8g2_t *u8g2); +/* u8x8_d_sdl_128x64.c */ +void u8x8_Setup_SDL_128x64(u8x8_t *u8g2); void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x); int u8g_sdl_get_key(void); /*==========================================*/ -/* u8g2_d_uc1701_dogs102.c */ -uint8_t u8g2_d_uc1701_dogs102(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +/* u8x8_d_uc1701_dogs102.c */ +uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ -/* u8g2_d_ssd1306_128x64_noname.c */ -uint8_t u8g2_d_ssd1306_128x64_noname(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +/* u8x8_d_ssd1306_128x64_noname.c */ +uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ -/* u8g2_8x8.c */ -void u8g2_Set8x8Font(u8g2_t *u8g2, const uint8_t *font_8x8); -void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); -void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s); +/* u8x8_8x8.c */ +void u8x8_Set8x8Font(u8x8_t *u8g2, const uint8_t *font_8x8); +void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); +void u8x8_Draw8x8String(u8x8_t *u8g2, uint8_t x, uint8_t y, const char *s); /*==========================================*/ /* high level interface */ -void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); +void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir); void u8g2x_SendBuffer(u8g2x_t *u8g2x); @@ -482,5 +482,5 @@ void u8g2x_SendBuffer(u8g2x_t *u8g2x); #endif -#endif /* _U8G2_H */ +#endif /* _U8X8_H */ diff --git a/u8g2/csrc/u8g2_8x8.c b/u8g2/csrc/u8x8_8x8.c similarity index 53% rename from u8g2/csrc/u8g2_8x8.c rename to u8g2/csrc/u8x8_8x8.c index f4e72eb7..22d5c873 100644 --- a/u8g2/csrc/u8g2_8x8.c +++ b/u8g2/csrc/u8x8_8x8.c @@ -1,25 +1,25 @@ /* - u8g2_8x8.c + u8x8_8x8.c font procedures, directly interfaces display procedures */ -#include "u8g2.h" +#include "u8x8.h" -void u8g2_Set8x8Font(u8g2_t *u8g2, const uint8_t *font_8x8) +void u8x8_Set8x8Font(u8x8_t *u8g2, const uint8_t *font_8x8) { u8g2->font = font_8x8; } -void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) +void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) { uint8_t first, last, i; uint8_t buf[8]; uint16_t offset; - first = u8g2_pgm_read(u8g2->font+0); - last = u8g2_pgm_read(u8g2->font+1); + first = u8x8_pgm_read(u8g2->font+0); + last = u8x8_pgm_read(u8g2->font+1); if ( first <= encoding && encoding <= last ) { @@ -29,7 +29,7 @@ void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) offset +=2; for( i = 0; i < 8; i++ ) { - buf[i] = u8g2_pgm_read(u8g2->font+offset); + buf[i] = u8x8_pgm_read(u8g2->font+offset); offset++; } } @@ -40,14 +40,14 @@ void u8g2_Draw8x8Glyph(u8g2_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) buf[i] = 0; } } - u8g2_display_DrawTile(u8g2, x, y, 1, buf); + u8x8_display_DrawTile(u8g2, x, y, 1, buf); } -void u8g2_Draw8x8String(u8g2_t *u8g2, uint8_t x, uint8_t y, const char *s) +void u8x8_Draw8x8String(u8x8_t *u8g2, uint8_t x, uint8_t y, const char *s) { while( *s != '\0' ) { - u8g2_Draw8x8Glyph(u8g2, x, y, (uint8_t)*s); + u8x8_Draw8x8Glyph(u8g2, x, y, (uint8_t)*s); s++; x++; } diff --git a/u8g2/csrc/u8x8_byte.c b/u8g2/csrc/u8x8_byte.c new file mode 100644 index 00000000..d9090db6 --- /dev/null +++ b/u8g2/csrc/u8x8_byte.c @@ -0,0 +1,110 @@ +/* + + u8x8_byte.c + +*/ + +#include "u8x8.h" + +uint8_t u8x8_byte_SetDC(u8x8_t *u8g2, uint8_t dc) +{ + return u8g2->byte_cb(u8g2, U8X8_MSG_BYTE_SET_DC, dc, NULL); +} + +uint8_t u8x8_byte_SendBytes(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) +{ + return u8g2->byte_cb(u8g2, U8X8_MSG_BYTE_SEND, cnt, (void *)data); +} + +uint8_t u8x8_byte_SendByte(u8x8_t *u8g2, uint8_t byte) +{ + return u8x8_byte_SendBytes(u8g2, 1, &byte); +} + + + +/* + Uses: + u8g2->display_info->sda_setup_time_ns + u8g2->display_info->sck_pulse_width_ns + u8g2->display_info->sck_takeover_edge + u8g2->display_info->chip_disable_level + u8g2->display_info->chip_enable_level + u8g2->display_info->post_chip_enable_wait_ns + u8g2->display_info->pre_chip_disable_wait_ns + Calls to GPIO and DELAY: + U8X8_MSG_DELAY_NANO + U8X8_MSG_GPIO_DC + U8X8_MSG_GPIO_CS + U8X8_MSG_GPIO_CLOCK + U8X8_MSG_GPIO_DATA + Handles: + U8X8_MSG_BYTE_INIT + U8X8_MSG_BYTE_SEND + U8X8_MSG_BYTE_SET_DC + U8X8_MSG_BYTE_START_TRANSFER + U8X8_MSG_BYTE_END_TRANSFER + U8X8_MSG_BYTE_SET_I2C_ADR (ignored) + U8X8_MSG_BYTE_SET_DEVICE (ignored) +*/ +uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t i, b; + uint8_t *data; + uint8_t takeover_edge = u8g2->display_info->sck_takeover_edge; + uint8_t not_takeover_edge = 1 - takeover_edge; + + switch(msg) + { + case U8X8_MSG_BYTE_SEND: + data = (uint8_t *)arg_ptr; + while( arg_int > 0 ) + { + b = *data; + data++; + arg_int--; + for( i = 0; i < 8; i++ ) + { + if ( b & 128 ) + u8x8_gpio_SetData(u8g2, 1); + else + u8x8_gpio_SetData(u8g2, 0); + b <<= 1; + + u8x8_gpio_SetClock(u8g2, not_takeover_edge); + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->sda_setup_time_ns); + u8x8_gpio_SetClock(u8g2, takeover_edge); + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->sck_pulse_width_ns); + } + } + break; + + case U8X8_MSG_BYTE_INIT: + /* disable chipselect */ + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ + + /* for SPI: setup correct level of the clock signal */ + u8x8_gpio_SetClock(u8g2, u8g2->display_info->sck_takeover_edge); + break; + case U8X8_MSG_BYTE_SET_DC: + u8x8_gpio_SetDC(u8g2, arg_int); + break; + case U8X8_MSG_BYTE_START_TRANSFER: + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); + break; + case U8X8_MSG_BYTE_END_TRANSFER: + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + break; + case U8X8_MSG_BYTE_SET_I2C_ADR: + break; + case U8X8_MSG_BYTE_SET_DEVICE: + break; + default: + return 0; + } + return 1; +} + diff --git a/u8g2/csrc/u8x8_cad.c b/u8g2/csrc/u8x8_cad.c new file mode 100644 index 00000000..67279fad --- /dev/null +++ b/u8g2/csrc/u8x8_cad.c @@ -0,0 +1,202 @@ +/* + + u8x8_cad.c + + "command arg data" interface to the graphics controller + + The following sequence must be used for any data, which is set to the display: + + + uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) + + any of the following calls + uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) + uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) + uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) + + uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) + + + +*/ +/* +uint8_t u8x8_cad_template(u8x8_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +{ + uint8_t i; + + switch(msg) + { + case U8X8_MSG_CAD_SEND_CMD: + u8x8_mcd_byte_SetDC(mcd->next, 1); + u8x8_mcd_byte_Send(mcd->next, arg_int); + break; + case U8X8_MSG_CAD_SEND_ARG: + u8x8_mcd_byte_SetDC(mcd->next, 1); + u8x8_mcd_byte_Send(mcd->next, arg_int); + break; + case U8X8_MSG_CAD_SEND_DATA: + u8x8_mcd_byte_SetDC(mcd->next, 0); + for( i = 0; i < 8; i++ ) + u8x8_mcd_byte_Send(mcd->next, ((uint8_t *)arg_ptr)[i]); + break; + case U8X8_MSG_CAD_RESET: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8X8_MSG_CAD_START_TRANSFER: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8X8_MSG_CAD_END_TRANSFER: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8X8_MSG_CAD_SET_I2C_ADR: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + case U8X8_MSG_CAD_SET_DEVICE: + return mcd->next->cb(mcd->next, msg, arg_int, arg_ptr); + default: + break; + } + return 1; +} + +*/ + +#include "u8x8.h" + +uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) +{ + return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_CMD, cmd, NULL); +} + +uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) +{ + return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_ARG, arg, NULL); +} + +uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) +{ + return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_DATA, cnt, data); +} + +uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) +{ + return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_START_TRANSFER, 0, NULL); +} + +uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) +{ + return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_END_TRANSFER, 0, NULL); +} + +/* + 0000ccaa command arg combination, aa = no of args, cc = no of commands + 0001dddd data sequence + 11110000 CS Off + 11110001 CS On + 11111110 xxxxxxxx delay in millis + 11111111 End of sequence + +*/ + +void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data) +{ + uint8_t cmd; + uint8_t v; + + for(;;) + { + cmd = *data; + data++; + switch( cmd ) + { + case U8X8_MSG_CAD_SEND_CMD: + case U8X8_MSG_CAD_SEND_ARG: + v = *data; + u8g2->cad_cb(u8g2, cmd, v, NULL); + data++; + break; + case U8X8_MSG_CAD_SEND_DATA: + v = *data; + u8x8_cad_SendData(u8g2, 1, &v); + data++; + break; + case U8X8_MSG_CAD_START_TRANSFER: + case U8X8_MSG_CAD_END_TRANSFER: + u8g2->cad_cb(u8g2, cmd, 0, NULL); + break; + case 0x0fe: + v = *data; + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, v); + data++; + break; + default: + return; + } + } +} + + +/* + convert to bytes by using + dc = 1 for commands and args and + dc = 0 for data +*/ +uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8X8_MSG_CAD_SEND_CMD: + u8x8_byte_SetDC(u8g2, 1); + u8x8_byte_SendByte(u8g2, arg_int); + break; + case U8X8_MSG_CAD_SEND_ARG: + u8x8_byte_SetDC(u8g2, 1); + u8x8_byte_SendByte(u8g2, arg_int); + break; + case U8X8_MSG_CAD_SEND_DATA: + u8x8_byte_SetDC(u8g2, 0); + //u8x8_byte_SendBytes(u8g2, arg_int, arg_ptr); + //break; + /* fall through */ + case U8X8_MSG_CAD_INIT: + case U8X8_MSG_CAD_START_TRANSFER: + case U8X8_MSG_CAD_END_TRANSFER: + case U8X8_MSG_CAD_SET_I2C_ADR: + case U8X8_MSG_CAD_SET_DEVICE: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + default: + return 0; + } + return 1; +} + +/* + convert to bytes by using + dc = 0 for commands and args and + dc = 1 for data +*/ +uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8X8_MSG_CAD_SEND_CMD: + u8x8_byte_SetDC(u8g2, 0); + u8x8_byte_SendByte(u8g2, arg_int); + break; + case U8X8_MSG_CAD_SEND_ARG: + u8x8_byte_SetDC(u8g2, 0); + u8x8_byte_SendByte(u8g2, arg_int); + break; + case U8X8_MSG_CAD_SEND_DATA: + u8x8_byte_SetDC(u8g2, 1); + //u8x8_byte_SendBytes(u8g2, arg_int, arg_ptr); + //break; + /* fall through */ + case U8X8_MSG_CAD_INIT: + case U8X8_MSG_CAD_START_TRANSFER: + case U8X8_MSG_CAD_END_TRANSFER: + case U8X8_MSG_CAD_SET_I2C_ADR: + case U8X8_MSG_CAD_SET_DEVICE: + return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + default: + return 0; + } + return 1; +} + diff --git a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c new file mode 100644 index 00000000..5dc047ca --- /dev/null +++ b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c @@ -0,0 +1,156 @@ + +#include "u8x8.h" + + + + +static const uint8_t u8x8_d_ssd1306_128x64_noname_init_seq[] = { + + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + + + U8X8_C(0x0ae), /* display off */ + U8X8_CA(0x0d5, 0x080), /* clock divide ratio (0x00=1) and oscillator frequency (0x8) */ + U8X8_CA(0x0a8, 0x03f), /* multiplex ratio */ + U8X8_CA(0x0d3, 0x000), /* display offset */ + U8X8_C(0x040), /* set display start line to 0 */ + U8X8_CA(0x08d, 0x014), /* [2] charge pump setting (p62): 0x014 enable, 0x010 disable */ + U8X8_CA(0x020, 0x000), /* page addressing mode */ + +#if U8X8_DEFAULT_FLIP_MODE == 0 + U8X8_C(0x0a1), /* segment remap a0/a1*/ + U8X8_C(0x0c8), /* c0: scan dir normal, c8: reverse */ +#else + U8X8_C(0x0a0), /* segment remap a0/a1*/ + U8X8_C(0x0c0), /* c0: scan dir normal, c8: reverse */ +#endif + + U8X8_CA(0x0da, 0x012), /* com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) */ + U8X8_CA(0x081, 0x0cf), /* [2] set contrast control */ + U8X8_CA(0x0d9, 0x0f1), /* [2] pre-charge period 0x022/f1*/ + U8X8_CA(0x0db, 0x040), /* vcomh deselect level */ + + U8X8_C(0x02e), /* Deactivate scroll */ + U8X8_C(0x0a4), /* output ram to display */ + U8X8_C(0x0a6), /* none inverted normal display mode */ + + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_ssd1306_128x64_noname_powersave0_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0af), /* display on */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_ssd1306_128x64_noname_powersave1_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0ae), /* display off */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +#ifdef U8X8_WITH_SET_FLIP_MODE +static const uint8_t u8x8_d_ssd1306_128x64_noname_flip0_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0a1), /* segment remap a0/a1*/ + U8X8_C(0x0c8), /* c0: scan dir normal, c8: reverse */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_ssd1306_128x64_noname_flip1_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0a0), /* segment remap a0/a1*/ + U8X8_C(0x0c0), /* c0: scan dir normal, c8: reverse */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; +#endif + +static const u8x8_display_info_t u8x8_ssd1306_128x64_noname_display_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + + /* post_chip_enable_wait_ns = */ 20, + /* pre_chip_disable_wait_ns = */ 10, + /* reset_pulse_width_ms = */ 100, /* SSD1306: 3 us */ + /* post_reset_wait_ms = */ 100, /* far east OLEDs need much longer setup time */ + /* sda_setup_time_ns = */ 50, /* SSD1306: 15ns, but cycle time is 100ns, so use 100/2 */ + /* sck_pulse_width_ns = */ 50, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/2 */ + /* sck_takeover_edge = */ 1, /* rising edge */ + /* i2c_bus_clock_100kHz = */ 4, + /* data_setup_time_ns = */ 40, + /* write_pulse_width_ns = */ 150, /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */ + /* tile_width = */ 16, + /* tile_hight = */ 8, + /* default_x_offset = */ 0 +}; + +uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t x, c; + uint8_t *ptr; + switch(msg) + { + case U8X8_MSG_DISPLAY_INIT: + u8x8_d_helper_display_init(u8g2, &u8x8_ssd1306_128x64_noname_display_info); + u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_init_seq); + + break; + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: + if ( arg_int == 0 ) + u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_powersave0_seq); + else + u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_powersave1_seq); + break; +#ifdef U8X8_WITH_SET_FLIP_MODE + case U8X8_MSG_DISPLAY_SET_FLIP_MODE: + if ( arg_int == 0 ) + u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_flip0_seq); + else + u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_flip1_seq); + break; +#endif +#ifdef U8X8_WITH_SET_CONTRAST + case U8X8_MSG_DISPLAY_SET_CONTRAST: + u8x8_cad_StartTransfer(u8g2); + u8x8_cad_SendCmd(u8g2, 0x081 ); + u8x8_cad_SendArg(u8g2, arg_int ); /* ssd1306 has range from 0 to 255 */ + u8x8_cad_EndTransfer(u8g2); + break; +#endif + case U8X8_MSG_DISPLAY_DRAW_TILE: + u8x8_cad_StartTransfer(u8g2); + x = ((u8x8_tile_t *)arg_ptr)->x_pos; + x *= 8; + x += u8g2->x_offset; + u8x8_cad_SendCmd(u8g2, 0x010 | (x>>4) ); + u8x8_cad_SendCmd(u8g2, 0x000 | ((x&15))); + u8x8_cad_SendCmd(u8g2, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); + + do + { + c = ((u8x8_tile_t *)arg_ptr)->cnt; + ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + do + { + u8x8_cad_SendData(u8g2, 8, ptr); + ptr += 8; + c--; + } while( c > 0 ); + arg_int--; + } while( arg_int > 0 ); + + u8x8_cad_EndTransfer(u8g2); + break; + default: + return 0; + } + return 1; +} + + diff --git a/u8g2/csrc/u8g2_d_stdio.c b/u8g2/csrc/u8x8_d_stdio.c similarity index 58% rename from u8g2/csrc/u8g2_d_stdio.c rename to u8g2/csrc/u8x8_d_stdio.c index bfada5f2..8d350915 100644 --- a/u8g2/csrc/u8g2_d_stdio.c +++ b/u8g2/csrc/u8x8_d_stdio.c @@ -1,5 +1,5 @@ -#include "u8g2.h" +#include "u8x8.h" #include @@ -36,20 +36,20 @@ void bitmap_show(void) } -uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_stdio(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { - case U8G2_MSG_DISPLAY_INIT: + case U8X8_MSG_DISPLAY_INIT: break; - case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) bitmap_show(); break; - case U8G2_MSG_DISPLAY_SET_CONTRAST: + case U8X8_MSG_DISPLAY_SET_CONTRAST: break; - case U8G2_MSG_DISPLAY_DRAW_TILE: - bitmap_place_tile(((u8g2_tile_t *)arg_ptr)->x_pos, ((u8g2_tile_t *)arg_ptr)->y_pos, ((u8g2_tile_t *)arg_ptr)->tile_ptr); + case U8X8_MSG_DISPLAY_DRAW_TILE: + bitmap_place_tile(((u8x8_tile_t *)arg_ptr)->x_pos, ((u8x8_tile_t *)arg_ptr)->y_pos, ((u8x8_tile_t *)arg_ptr)->tile_ptr); break; default: break; @@ -59,9 +59,9 @@ uint8_t u8g2_d_stdio(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -void u8g2_SetupStdio(u8g2_t *u8g2) +void u8x8_SetupStdio(u8x8_t *u8g2) { - u8g2_SetupDefaults(u8g2); - u8g2->display_cb = u8g2_d_stdio; + u8x8_SetupDefaults(u8g2); + u8g2->display_cb = u8x8_d_stdio; } diff --git a/u8g2/csrc/u8x8_d_uc1701_dogs102.c b/u8g2/csrc/u8x8_d_uc1701_dogs102.c new file mode 100644 index 00000000..48517b2a --- /dev/null +++ b/u8g2/csrc/u8x8_d_uc1701_dogs102.c @@ -0,0 +1,162 @@ + +#include "u8x8.h" + + + + +static const uint8_t u8x8_d_uc1701_dogs102_init_seq[] = { + + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + + U8X8_C(0x0e2), /* soft reset */ + U8X8_C(0x0ae), /* display off */ + U8X8_C(0x040), /* set display start line to 0 */ + +#if U8X8_DEFAULT_FLIP_MODE == 0 + U8X8_C(0x0a1), /* ADC set to reverse */ + U8X8_C(0x0c0), /* common output mode */ +#else + U8X8_C(0x0a0), /* ADC set to reverse */ + U8X8_C(0x0c8), /* common output mode */ +#endif + + U8X8_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */ + U8X8_C(0x0a2), /* LCD bias 1/9 */ + U8X8_C(0x02f), /* all power control circuits on */ + U8X8_C(0x027), /* regulator, booster and follower */ + U8X8_CA(0x081, 0x00e), /* set contrast, contrast value, EA default: 0x010, previous value for S102: 0x0e */ + U8X8_C(0x0fa), /* Set Temp compensation */ + U8X8_C(0x090), /* 0.11 deg/c WP Off WC Off*/ + U8X8_C(0x0a4), /* normal display */ + + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_uc1701_dogs102_powersave0_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0af), /* display on */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_uc1701_dogs102_powersave1_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0ae), /* display off */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +#ifdef U8X8_WITH_SET_FLIP_MODE +static const uint8_t u8x8_d_uc1701_dogs102_flip0_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0a1), /* segment remap a0/a1*/ + U8X8_C(0x0c0), /* c0: scan dir normal, c8: reverse */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; + +static const uint8_t u8x8_d_uc1701_dogs102_flip1_seq[] = { + U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */ + U8X8_C(0x0a0), /* segment remap a0/a1*/ + U8X8_C(0x0c8), /* c0: scan dir normal, c8: reverse */ + U8X8_END_TRANSFER(), /* disable chip */ + U8X8_END() /* end of sequence */ +}; +#endif + + +static const u8x8_display_info_t u8x8_uc1701_display_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + + /* post_chip_enable_wait_ns = */ 5, + /* pre_chip_disable_wait_ns = */ 5, + /* reset_pulse_width_ms = */ 1, + /* post_reset_wait_ms = */ 6, + /* sda_setup_time_ns = */ 15, /* if this is smaller than sck_pulse_width_ns, use sck_pulse_width_ns, so use 15 instead of 12*/ + /* sck_pulse_width_ns = */ 15, + /* sck_takeover_edge = */ 1, /* rising edge */ + /* i2c_bus_clock_100kHz = */ 37, + /* data_setup_time_ns = */ 30, + /* write_pulse_width_ns = */ 40, + /* tile_width = */ 13, + /* tile_hight = */ 8, +#if U8X8_DEFAULT_FLIP_MODE == 0 + /* default_x_offset = */ 0, +#else + /* default_x_offset = */ 30, +#endif +}; + +uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t x, c; + uint8_t *ptr; + switch(msg) + { + case U8X8_MSG_DISPLAY_INIT: + u8x8_d_helper_display_init(u8g2, &u8x8_uc1701_display_info); + u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_init_seq); + break; + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: + if ( arg_int == 0 ) + u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_powersave0_seq); + else + u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_powersave1_seq); + break; + #ifdef U8X8_WITH_SET_FLIP_MODE + case U8X8_MSG_DISPLAY_SET_FLIP_MODE: + if ( arg_int == 0 ) + { + u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_flip0_seq); + u8g2->x_offset = 0; + } + else + { + u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_flip1_seq); + u8g2->x_offset = 30; + } + break; +#endif +#ifdef U8X8_WITH_SET_CONTRAST + case U8X8_MSG_DISPLAY_SET_CONTRAST: + u8x8_cad_StartTransfer(u8g2); + u8x8_cad_SendCmd(u8g2, 0x081 ); + u8x8_cad_SendArg(u8g2, arg_int >> 2 ); /* uc1701 has range from 0 to 63 */ + u8x8_cad_EndTransfer(u8g2); + break; +#endif + case U8X8_MSG_DISPLAY_DRAW_TILE: + u8x8_cad_StartTransfer(u8g2); + + x = ((u8x8_tile_t *)arg_ptr)->x_pos; + x *= 8; + x += u8g2->x_offset; + u8x8_cad_SendCmd(u8g2, 0x010 | (x>>4) ); + u8x8_cad_SendCmd(u8g2, 0x000 | ((x&15))); + u8x8_cad_SendCmd(u8g2, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); + + do + { + c = ((u8x8_tile_t *)arg_ptr)->cnt; + ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + do + { + u8x8_cad_SendData(u8g2, 8, ptr); + ptr += 8; + c--; + } while( c > 0 ); + arg_int--; + } while( arg_int > 0 ); + + u8x8_cad_EndTransfer(u8g2); + break; + default: + return 0; + } + return 1; +} + + diff --git a/u8g2/csrc/u8x8_display.c b/u8g2/csrc/u8x8_display.c new file mode 100644 index 00000000..d7d1dead --- /dev/null +++ b/u8g2/csrc/u8x8_display.c @@ -0,0 +1,92 @@ +/* + + u8x8_display.c + + Abstraction layer for the graphics controller. + Main goal is the placement of a 8x8 pixel block on the display. + +*/ + + +#include "u8x8.h" + + +/*==========================================*/ +/* internal library function */ +/* + this is a helper function for the U8X8_MSG_DISPLAY_INIT function. + It can be called within the display callback function to carry out the usual standard tasks. + +*/ +void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display_info) +{ + /* 1) set display info struct */ + u8g2->display_info = display_info; + u8g2->x_offset = u8g2->display_info->default_x_offset; + + /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ + u8x8_gpio_Init(u8g2); + u8x8_cad_Init(u8g2); + + /* 3) do reset */ + u8x8_gpio_SetReset(u8g2, 1); + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8x8_gpio_SetReset(u8g2, 0); + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); + u8x8_gpio_SetReset(u8g2, 1); + u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); +} + +/*==========================================*/ +/* official functions */ + +uint8_t u8x8_display_DrawTile(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) +{ + u8x8_tile_t tile; + tile.x_pos = x; + tile.y_pos = y; + tile.cnt = cnt; + tile.tile_ptr = tile_ptr; + return u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); +} + +void u8x8_display_Init(u8x8_t *u8g2) +{ + u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_INIT, 0, NULL); +} + +void u8x8_display_SetPowerSave(u8x8_t *u8g2, uint8_t is_enable) +{ + u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_POWER_SAVE, is_enable, NULL); +} + +void u8x8_display_SetFlipMode(u8x8_t *u8g2, uint8_t mode) +{ + u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); +} + +void u8x8_display_SetContrast(u8x8_t *u8g2, uint8_t value) +{ + u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_CONTRAST, value, NULL); +} + + +void u8x8_display_ClearScreen(u8x8_t *u8g2) +{ + uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + u8x8_tile_t tile; + uint8_t h; + + tile.x_pos = 0; + tile.cnt = 1; + tile.tile_ptr = buf; + + h = u8g2->display_info->tile_height; + tile.y_pos = 0; + do + { + u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_DRAW_TILE, u8g2->display_info->tile_width, (void *)&tile); + tile.y_pos++; + } while( tile.y_pos < h ); +} + diff --git a/u8g2/csrc/u8x8_gpio.c b/u8g2/csrc/u8x8_gpio.c new file mode 100644 index 00000000..9dba0097 --- /dev/null +++ b/u8g2/csrc/u8x8_gpio.c @@ -0,0 +1,15 @@ + +#include "u8x8.h" + + +void u8x8_gpio_call(u8x8_t *u8g2, uint8_t msg, uint8_t arg) +{ + u8g2->gpio_and_delay_cb(u8g2, msg, arg, NULL); +} + +/* +void u8x8_gpio_Delay(u8x8_t *u8g2, uint8_t msg, uint8_t dly) +{ + u8g2->gpio_and_delay_cb(u8g2, msg, dly, NULL); +} +*/ \ No newline at end of file diff --git a/u8g2/csrc/u8x8_setup.c b/u8g2/csrc/u8x8_setup.c new file mode 100644 index 00000000..bdd598b8 --- /dev/null +++ b/u8g2/csrc/u8x8_setup.c @@ -0,0 +1,32 @@ +/* + + u8g2_setup.c + +*/ + + +#include "u8x8.h" + +uint8_t u8x8_dummy_cb(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + /* the dummy callback will not handle any message and will fail for all messages */ + return 0; +} + + +/* + Description: + Setup u8g2 + Args: + u8g2 An empty u8g2 structure +*/ +void u8x8_SetupDefaults(u8x8_t *u8g2) +{ + u8g2->display_info = NULL; + u8g2->display_cb = u8x8_dummy_cb; + u8g2->cad_cb = u8x8_dummy_cb; + u8g2->byte_cb = u8x8_dummy_cb; + u8g2->gpio_and_delay_cb = u8x8_dummy_cb; +} + + diff --git a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c similarity index 88% rename from u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c rename to u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 97f6ccfa..e51a9919 100644 --- a/u8g2/sys/sdl/common/u8g2_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -1,8 +1,8 @@ /* - u8g2_d_sdl_128x64.c + u8x8_d_sdl_128x64.c */ -#include "u8g2.h" +#include "u8x8.h" #include "SDL.h" #include "SDL_video.h" #include @@ -183,7 +183,7 @@ void main(void) } */ -static const u8g2_display_info_t u8g2_sdl_128x64_info = +static const u8x8_display_info_t u8x8_sdl_128x64_info = { /* chip_enable_level = */ 0, /* chip_disable_level = */ 1, @@ -200,7 +200,7 @@ static const u8g2_display_info_t u8g2_sdl_128x64_info = /* write_pulse_width_ns = */ 0, /* tile_width = */ 16, /* tile_hight = */ 8, -#if U8G2_DEFAULT_FLIP_MODE == 0 +#if U8X8_DEFAULT_FLIP_MODE == 0 /* default_x_offset = */ 0, #else /* default_x_offset = */ 0, @@ -208,34 +208,34 @@ static const u8g2_display_info_t u8g2_sdl_128x64_info = }; -uint8_t u8g2_d_sdl(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_sdl(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t x, y, c; uint8_t *ptr; switch(msg) { - case U8G2_MSG_DISPLAY_INIT: - u8g2_d_helper_display_init(u8g2, &u8g2_sdl_128x64_info); + case U8X8_MSG_DISPLAY_INIT: + u8x8_d_helper_display_init(u8g2, &u8x8_sdl_128x64_info); u8g_sdl_init(); break; - case U8G2_MSG_DISPLAY_SET_POWER_SAVE: + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: break; - case U8G2_MSG_DISPLAY_SET_FLIP_MODE: + case U8X8_MSG_DISPLAY_SET_FLIP_MODE: break; - case U8G2_MSG_DISPLAY_SET_CONTRAST: + case U8X8_MSG_DISPLAY_SET_CONTRAST: break; - case U8G2_MSG_DISPLAY_DRAW_TILE: - x = ((u8g2_tile_t *)arg_ptr)->x_pos; + case U8X8_MSG_DISPLAY_DRAW_TILE: + x = ((u8x8_tile_t *)arg_ptr)->x_pos; x *= 8; x += u8g2->x_offset; - y = ((u8g2_tile_t *)arg_ptr)->y_pos; + y = ((u8x8_tile_t *)arg_ptr)->y_pos; y *= 8; do { - c = ((u8g2_tile_t *)arg_ptr)->cnt; - ptr = ((u8g2_tile_t *)arg_ptr)->tile_ptr; + c = ((u8x8_tile_t *)arg_ptr)->cnt; + ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; u8g_sdl_set_multiple_8pixel(x, y, c*8, ptr); arg_int--; } while( arg_int > 0 ); @@ -252,13 +252,13 @@ uint8_t u8g2_d_sdl(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) } -void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) +void u8x8_Setup_SDL_128x64(u8x8_t *u8g2) { /* setup defaults */ - u8g2_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8g2); /* setup specific callbacks */ - u8g2->display_cb = u8g2_d_sdl; + u8g2->display_cb = u8x8_d_sdl; } @@ -272,14 +272,14 @@ void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) buf[i] = (i>>2); */ - u8g2_Setup_SDL_128x64(u8g2x_GetU8x8(u8g2x)); + u8x8_Setup_SDL_128x64(u8g2x_GetU8x8(u8g2x)); u8g2x->tile_buf_ptr = buf; u8g2x->tile_buf_height = 8; u8g2x->tile_curr_row = 0; u8g2x->draw_color = 1; } -void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y) +void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y) { uint8_t *ptr; uint8_t bit_pos, mask; @@ -312,7 +312,7 @@ void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y) dir 0: horizontal line (left to right) 1: vertical line (top to bottom) */ -void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir) { if ( dir == 0 ) { @@ -347,7 +347,7 @@ static void u8g2x_send_tile_row(u8g2x_t *u8g2x, uint8_t tile_row) offset *= 8; ptr += offset; - u8g2_display_DrawTile(u8g2x_GetU8x8(u8g2x), 0, tile_row, w, ptr); + u8x8_display_DrawTile(u8g2x_GetU8x8(u8g2x), 0, tile_row, w, ptr); } void u8g2x_SendBuffer(u8g2x_t *u8g2x) diff --git a/u8g2/sys/sdl/hello_world_8x8/main.c b/u8g2/sys/sdl/hello_world_8x8/main.c index dbb1df26..19192023 100644 --- a/u8g2/sys/sdl/hello_world_8x8/main.c +++ b/u8g2/sys/sdl/hello_world_8x8/main.c @@ -1,9 +1,9 @@ -#include "u8g2.h" +#include "u8x8.h" -u8g2_t u8g2; +u8x8_t u8g2; -const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, @@ -56,11 +56,11 @@ const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { int main(void) { - u8g2_Setup_SDL_128x64(&u8g2); - u8g2_display_Init(&u8g2); + u8x8_Setup_SDL_128x64(&u8g2); + u8x8_display_Init(&u8g2); - u8g2_Set8x8Font(&u8g2, bdf_font); - u8g2_Draw8x8String(&u8g2, 0, 0, "Hello World!"); + u8x8_Set8x8Font(&u8g2, bdf_font); + u8x8_Draw8x8String(&u8g2, 0, 0, "Hello World!"); while( u8g_sdl_get_key() < 0 ) ; From 4e206e7168bdd716774545baafabe189659926a9 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 10 Oct 2015 08:39:21 +0200 Subject: [PATCH 047/109] rename --- u8g2/sys/sdl/hvline/main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index 230fdc5b..ead1f616 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -1,8 +1,8 @@ -#include "u8g2.h" +#include "u8x8.h" -const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, @@ -57,8 +57,8 @@ u8g2x_t u8g2x; int main(void) { u8g2x_Setup_SDL_128x64(&u8g2x); - u8g2_display_Init(u8g2x_GetU8x8(&u8g2x)); - u8g2_display_SetPowerSave(u8g2x_GetU8x8(&u8g2x), 0); + u8x8_display_Init(u8g2x_GetU8x8(&u8g2x)); + u8x8_display_SetPowerSave(u8g2x_GetU8x8(&u8g2x), 0); u8g2x_DrawHVLine(&u8g2x, 5, 20, 40, 0); @@ -71,8 +71,8 @@ int main(void) u8g2x_SendBuffer(&u8g2x); - u8g2_Set8x8Font(u8g2x_GetU8x8(&u8g2x), bdf_font); - u8g2_Draw8x8String(u8g2x_GetU8x8(&u8g2x), 0, 0, "Hello World!"); + u8x8_Set8x8Font(u8g2x_GetU8x8(&u8g2x), bdf_font); + u8x8_Draw8x8String(u8g2x_GetU8x8(&u8g2x), 0, 0, "Hello World!"); From 5eeb9f1c078b04f1ab19040b23c34f6c2fbf2170 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 10 Oct 2015 11:13:45 +0200 Subject: [PATCH 048/109] u8x8 renameing, optimized dogs102 loop --- u8g2/csrc/u8x8_d_uc1701_dogs102.c | 4 ++ u8g2/sys/arduino/test/test.ino | 110 +++++++++++++++--------------- 2 files changed, 59 insertions(+), 55 deletions(-) diff --git a/u8g2/csrc/u8x8_d_uc1701_dogs102.c b/u8g2/csrc/u8x8_d_uc1701_dogs102.c index 48517b2a..090c1427 100644 --- a/u8g2/csrc/u8x8_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8x8_d_uc1701_dogs102.c @@ -142,12 +142,16 @@ uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void * { c = ((u8x8_tile_t *)arg_ptr)->cnt; ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + + u8x8_cad_SendData(u8g2, c*8, ptr); + /* do { u8x8_cad_SendData(u8g2, 8, ptr); ptr += 8; c--; } while( c > 0 ); + */ arg_int--; } while( arg_int > 0 ); diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 64e2f7e5..75b7a303 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -3,7 +3,7 @@ #include #include -#include "u8g2.h" +#include "u8x8.h" /* Fontname: FreeType-Amstrad CPC extended-Medium-R-Normal--8-80-72-72-P-64-ISO10646-1 @@ -11,9 +11,9 @@ Glyphs: 95/196 BBX Build Mode: 3 */ -#include "u8g2.h" +//#include "u8x2.h" -const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, @@ -65,11 +65,11 @@ const uint8_t bdf_font[762] U8G2_FONT_SECTION("bdf_font") = { -uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_gpio_and_delay_arduino(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { - case U8G2_MSG_GPIO_AND_DELAY_INIT: + case U8X8_MSG_GPIO_AND_DELAY_INIT: pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); @@ -77,27 +77,27 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, pinMode(13, OUTPUT); break; - case U8G2_MSG_DELAY_MILLI: + case U8X8_MSG_DELAY_MILLI: delay(arg_int); break; - case U8G2_MSG_GPIO_DC: + case U8X8_MSG_GPIO_DC: digitalWrite(9, arg_int); break; - case U8G2_MSG_GPIO_CS: + case U8X8_MSG_GPIO_CS: digitalWrite(10, arg_int); break; - case U8G2_MSG_GPIO_RESET: + case U8X8_MSG_GPIO_RESET: digitalWrite(8, arg_int); break; - case U8G2_MSG_GPIO_CLOCK: + case U8X8_MSG_GPIO_CLOCK: digitalWrite(13, arg_int); break; - case U8G2_MSG_GPIO_DATA: + case U8X8_MSG_GPIO_DATA: digitalWrite(11, arg_int); break; @@ -109,13 +109,13 @@ uint8_t u8g2_gpio_and_delay_arduino(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, -uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_byte_arduino_hw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t *data; switch(msg) { - case U8G2_MSG_BYTE_SEND: + case U8X8_MSG_BYTE_SEND: data = (uint8_t *)arg_ptr; while( arg_int > 0 ) @@ -125,34 +125,34 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, voi arg_int--; } break; - case U8G2_MSG_BYTE_INIT: + case U8X8_MSG_BYTE_INIT: /* disable chipselect */ - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); /* no wait required here */ /* for SPI: setup correct level of the clock signal */ digitalWrite(13, u8g2->display_info->sck_takeover_edge); break; - case U8G2_MSG_BYTE_SET_DC: - u8g2_gpio_SetDC(u8g2, arg_int); + case U8X8_MSG_BYTE_SET_DC: + u8x8_gpio_SetDC(u8g2, arg_int); break; - case U8G2_MSG_BYTE_START_TRANSFER: + case U8X8_MSG_BYTE_START_TRANSFER: SPI.begin(); SPI.setClockDivider( SPI_CLOCK_DIV2 ); SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); break; - case U8G2_MSG_BYTE_END_TRANSFER: - u8g2->gpio_and_delay_cb(u8g2, U8G2_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); - u8g2_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + case U8X8_MSG_BYTE_END_TRANSFER: + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); SPI.end(); break; - case U8G2_MSG_BYTE_SET_I2C_ADR: + case U8X8_MSG_BYTE_SET_I2C_ADR: break; - case U8G2_MSG_BYTE_SET_DEVICE: + case U8X8_MSG_BYTE_SET_DEVICE: break; default: return 0; @@ -160,66 +160,66 @@ uint8_t u8g2_byte_arduino_hw_spi(u8g2_t *u8g2, uint8_t msg, uint8_t arg_int, voi return 1; } -void u8g2_Setup_UC1701_DOGS102(u8g2_t *u8g2) +void u8x8_Setup_UC1701_DOGS102(u8x8_t *u8g2) { /* setup defaults */ - u8g2_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8g2); /* setup specific callbacks */ - u8g2->display_cb = u8g2_d_uc1701_dogs102; - u8g2->cad_cb = u8g2_cad_001; - u8g2->byte_cb = u8g2_byte_8bit_sw_spi; - u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; + u8g2->display_cb = u8x8_d_uc1701_dogs102; + u8g2->cad_cb = u8x8_cad_001; + u8g2->byte_cb = u8x8_byte_8bit_sw_spi; + u8g2->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; } -void u8g2_Setup_SSD1306_128x64_NONAME(u8g2_t *u8g2) +void u8x8_Setup_SSD1306_128x64_NONAME(u8x8_t *u8g2) { /* setup defaults */ - u8g2_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8g2); /* setup specific callbacks */ - u8g2->display_cb = u8g2_d_ssd1306_128x64_noname; - u8g2->cad_cb = u8g2_cad_001; - //u8g2->byte_cb = u8g2_byte_arduino_hw_spi; - u8g2->byte_cb = u8g2_byte_8bit_sw_spi; - u8g2->gpio_and_delay_cb = u8g2_gpio_and_delay_arduino; + u8g2->display_cb = u8x8_d_ssd1306_128x64_noname; + u8g2->cad_cb = u8x8_cad_001; + //u8g2->byte_cb = u8x8_byte_arduino_hw_spi; + u8g2->byte_cb = u8x8_byte_8bit_sw_spi; + u8g2->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; } -u8g2_t u8g2; +u8x8_t u8g2; uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; void setup(void) { - //u8g2_Setup_UC1701_DOGS102(&u8g2); - u8g2_Setup_SSD1306_128x64_NONAME(&u8g2); + u8x8_Setup_UC1701_DOGS102(&u8g2); + //u8x8_Setup_SSD1306_128x64_NONAME(&u8g2); } void loop(void) { - u8g2_display_Init(&u8g2); - //u8g2_display_SetFlipMode(&u8g2, 1); + u8x8_display_Init(&u8g2); + u8x8_display_SetFlipMode(&u8g2, 1); for(;;) { - u8g2_display_ClearScreen(&u8g2); - u8g2_display_SetPowerSave(&u8g2, 0); - //u8g2_display_SetContrast(&u8g2, 10); + u8x8_display_ClearScreen(&u8g2); + u8x8_display_SetPowerSave(&u8g2, 0); + //u8x8_display_SetContrast(&u8g2, 10); delay(500); - u8g2_Set8x8Font(&u8g2, bdf_font); - u8g2_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); - u8g2_Draw8x8String(&u8g2, 3, 1, "World B"); + u8x8_Set8x8Font(&u8g2, bdf_font); + u8x8_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); + u8x8_Draw8x8String(&u8g2, 3, 1, "World B"); - u8g2_display_DrawTile(&u8g2, 1, 1, 1, tile); - u8g2_display_DrawTile(&u8g2, 2, 2, 1, tile); - u8g2_display_DrawTile(&u8g2, 3, 3, 1, tile); - u8g2_display_DrawTile(&u8g2, 4, 4, 1, tile); - u8g2_display_DrawTile(&u8g2, 5, 5, 1, tile); - u8g2_display_DrawTile(&u8g2, 6, 6, 1, tile); + u8x8_display_DrawTile(&u8g2, 1, 1, 1, tile); + u8x8_display_DrawTile(&u8g2, 2, 2, 1, tile); + u8x8_display_DrawTile(&u8g2, 3, 3, 1, tile); + u8x8_display_DrawTile(&u8g2, 4, 4, 1, tile); + u8x8_display_DrawTile(&u8g2, 5, 5, 1, tile); + u8x8_display_DrawTile(&u8g2, 6, 6, 1, tile); delay(2000); } From 7974c439baa9250f5e27d01b6093d4b5da4fc68e Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 11 Oct 2015 09:56:40 +0200 Subject: [PATCH 049/109] LC7981 update --- csrc/u8g_dev_lc7981_160x80.c | 2 +- sys/arduino/HelloWorld/Makefile.105.uno_ch341 | 286 ++++++++++++++++++ sys/arduino/U8gLogo/Makefile.105.uno_ch341 | 286 ++++++++++++++++++ 3 files changed, 573 insertions(+), 1 deletion(-) create mode 100644 sys/arduino/HelloWorld/Makefile.105.uno_ch341 create mode 100644 sys/arduino/U8gLogo/Makefile.105.uno_ch341 diff --git a/csrc/u8g_dev_lc7981_160x80.c b/csrc/u8g_dev_lc7981_160x80.c index e05fa03a..3de20992 100644 --- a/csrc/u8g_dev_lc7981_160x80.c +++ b/csrc/u8g_dev_lc7981_160x80.c @@ -75,7 +75,7 @@ static const uint8_t u8g_dev_lc7981_160x80_init_seq[] PROGMEM = { U8G_ESC_ADR(1), /* instruction mode */ 0x003, /* time division */ U8G_ESC_ADR(0), /* data mode */ - 0x07f, /* */ + 0x050, /* Oct 2015: Changed from 7f to 50 (1/80 duty cycle) */ U8G_ESC_ADR(1), /* instruction mode */ 0x008, /* display start low */ diff --git a/sys/arduino/HelloWorld/Makefile.105.uno_ch341 b/sys/arduino/HelloWorld/Makefile.105.uno_ch341 new file mode 100644 index 00000000..4c52fa92 --- /dev/null +++ b/sys/arduino/HelloWorld/Makefile.105.uno_ch341 @@ -0,0 +1,286 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +# AVRDUDE_PORT:=/dev/ttyACM0 +AVRDUDE_PORT:=/dev/ttyUSB0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/sys/arduino/U8gLogo/Makefile.105.uno_ch341 b/sys/arduino/U8gLogo/Makefile.105.uno_ch341 new file mode 100644 index 00000000..4c52fa92 --- /dev/null +++ b/sys/arduino/U8gLogo/Makefile.105.uno_ch341 @@ -0,0 +1,286 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +# AVRDUDE_PORT:=/dev/ttyACM0 +AVRDUDE_PORT:=/dev/ttyUSB0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + From be0e6c042fd6ba79d69dc224bf6800e38500a418 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 11 Oct 2015 10:37:09 +0200 Subject: [PATCH 050/109] u8g2 renaming --- u8g2/csrc/u8x8.h | 84 ++++++++++++------------ u8g2/csrc/u8x8_8x8.c | 18 ++--- u8g2/csrc/u8x8_byte.c | 56 ++++++++-------- u8g2/csrc/u8x8_cad.c | 74 ++++++++++----------- u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c | 36 +++++----- u8g2/csrc/u8x8_d_stdio.c | 8 +-- u8g2/csrc/u8x8_d_uc1701_dogs102.c | 42 ++++++------ u8g2/csrc/u8x8_display.c | 50 +++++++------- u8g2/csrc/u8x8_gpio.c | 8 +-- u8g2/csrc/u8x8_setup.c | 20 +++--- 10 files changed, 198 insertions(+), 198 deletions(-) diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 48f60d46..db4744a9 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -121,7 +121,7 @@ typedef struct u8x8_tile_struct u8x8_tile_t; typedef struct u8g2x_struct u8g2x_t; typedef struct u8g2x_cb_struct u8g2x_cb_t; -typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); typedef void (*u8g2x_update_dimension_cb)(u8g2x_t *u8g2x_t); typedef void (*u8g2x_draw_l90_cb)(u8g2x_t *u8g2x_t, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir); @@ -300,15 +300,15 @@ void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display //#define U8X8_MSG_DISPLAY_GET_LAYOUT 16 /* u8x8_display.c */ -uint8_t u8x8_display_DrawTile(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); +uint8_t u8x8_display_DrawTile(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); /* Init display, but keep display in power save mode. Usually this command must be followed by u8x8_display_SetPowerSave() */ -void u8x8_display_Init(u8x8_t *u8g2); +void u8x8_display_Init(u8x8_t *u8x8); /* wake up display from power save mode */ -void u8x8_display_SetPowerSave(u8x8_t *u8g2, uint8_t is_enable); -void u8x8_display_SetFlipMode(u8x8_t *u8g2, uint8_t mode); -void u8x8_display_SetContrast(u8x8_t *u8g2, uint8_t value); -void u8x8_display_ClearScreen(u8x8_t *u8g2); +void u8x8_display_SetPowerSave(u8x8_t *u8x8, uint8_t is_enable); +void u8x8_display_SetFlipMode(u8x8_t *u8x8, uint8_t mode); +void u8x8_display_SetContrast(u8x8_t *u8x8, uint8_t value); +void u8x8_display_ClearScreen(u8x8_t *u8x8); @@ -341,13 +341,13 @@ void u8x8_display_ClearScreen(u8x8_t *u8g2); /* u8g_cad.c */ -#define u8x8_cad_Init(u8g2) ((u8g2)->cad_cb((u8g2), U8X8_MSG_CAD_INIT, 0, NULL )) +#define u8x8_cad_Init(u8x8) ((u8x8)->cad_cb((u8x8), U8X8_MSG_CAD_INIT, 0, NULL )) -uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) U8X8_NOINLINE; -uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) U8X8_NOINLINE; -uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; -uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) U8X8_NOINLINE; -uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) U8X8_NOINLINE; +uint8_t u8x8_cad_SendCmd(u8x8_t *u8x8, uint8_t cmd) U8X8_NOINLINE; +uint8_t u8x8_cad_SendArg(u8x8_t *u8x8, uint8_t arg) U8X8_NOINLINE; +uint8_t u8x8_cad_SendData(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; +uint8_t u8x8_cad_StartTransfer(u8x8_t *u8x8) U8X8_NOINLINE; +uint8_t u8x8_cad_EndTransfer(u8x8_t *u8x8) U8X8_NOINLINE; /* #define U8X8_C(c0) (0x04), (c0) @@ -368,9 +368,9 @@ uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) U8X8_NOINLINE; #define U8X8_DLY(m) (0xfe),(m) #define U8X8_END() (0xff) -void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data); -uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); -uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +void u8x8_cad_SendSequence(u8x8_t *u8x8, uint8_t const *data); +uint8_t u8x8_cad_110(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_cad_001(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ @@ -388,11 +388,11 @@ uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); #define U8X8_MSG_BYTE_SET_DEVICE U8X8_MSG_CAD_SET_DEVICE -uint8_t u8x8_byte_SetDC(u8x8_t *u8g2, uint8_t dc) U8X8_NOINLINE; -uint8_t u8x8_byte_SendByte(u8x8_t *u8g2, uint8_t byte) U8X8_NOINLINE; -uint8_t u8x8_byte_SendBytes(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; +uint8_t u8x8_byte_SetDC(u8x8_t *u8x8, uint8_t dc) U8X8_NOINLINE; +uint8_t u8x8_byte_SendByte(u8x8_t *u8x8, uint8_t byte) U8X8_NOINLINE; +uint8_t u8x8_byte_SendBytes(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) U8X8_NOINLINE; -uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ @@ -419,56 +419,56 @@ uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void * #define U8X8_MSG_GPIO_CLOCK 48 #define U8X8_MSG_GPIO_DATA 49 -#define u8x8_gpio_Init(u8g2) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) +#define u8x8_gpio_Init(u8x8) ((u8x8)->gpio_and_delay_cb((u8x8), U8X8_MSG_GPIO_AND_DELAY_INIT, 0, NULL )) /* -#define u8x8_gpio_SetDC(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_DC, (v), NULL )) -#define u8x8_gpio_SetCS(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_CS, (v), NULL )) -#define u8x8_gpio_SetReset(u8g2, v) ((u8g2)->gpio_and_delay_cb((u8g2), U8X8_MSG_GPIO_RESET, (v), NULL )) +#define u8x8_gpio_SetDC(u8x8, v) ((u8x8)->gpio_and_delay_cb((u8x8), U8X8_MSG_GPIO_DC, (v), NULL )) +#define u8x8_gpio_SetCS(u8x8, v) ((u8x8)->gpio_and_delay_cb((u8x8), U8X8_MSG_GPIO_CS, (v), NULL )) +#define u8x8_gpio_SetReset(u8x8, v) ((u8x8)->gpio_and_delay_cb((u8x8), U8X8_MSG_GPIO_RESET, (v), NULL )) */ -#define u8x8_gpio_SetDC(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_DC, (v)) -#define u8x8_gpio_SetCS(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CS, (v)) -#define u8x8_gpio_SetReset(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CS, (v)) -#define u8x8_gpio_SetClock(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_CLOCK, (v)) -#define u8x8_gpio_SetData(u8g2, v) u8x8_gpio_call(u8g2, U8X8_MSG_GPIO_DATA, (v)) +#define u8x8_gpio_SetDC(u8x8, v) u8x8_gpio_call(u8x8, U8X8_MSG_GPIO_DC, (v)) +#define u8x8_gpio_SetCS(u8x8, v) u8x8_gpio_call(u8x8, U8X8_MSG_GPIO_CS, (v)) +#define u8x8_gpio_SetReset(u8x8, v) u8x8_gpio_call(u8x8, U8X8_MSG_GPIO_CS, (v)) +#define u8x8_gpio_SetClock(u8x8, v) u8x8_gpio_call(u8x8, U8X8_MSG_GPIO_CLOCK, (v)) +#define u8x8_gpio_SetData(u8x8, v) u8x8_gpio_call(u8x8, U8X8_MSG_GPIO_DATA, (v)) -void u8x8_gpio_call(u8x8_t *u8g2, uint8_t msg, uint8_t arg) U8X8_NOINLINE; +void u8x8_gpio_call(u8x8_t *u8x8, uint8_t msg, uint8_t arg) U8X8_NOINLINE; -#define u8x8_gpio_Delay(u8g2, msg, dly) u8x8_gpio_call((u8g2), (msg), (dly)) -//void u8x8_gpio_Delay(u8x8_t *u8g2, uint8_t msg, uint8_t dly) U8X8_NOINLINE; +#define u8x8_gpio_Delay(u8x8, msg, dly) u8x8_gpio_call((u8x8), (msg), (dly)) +//void u8x8_gpio_Delay(u8x8_t *u8x8, uint8_t msg, uint8_t dly) U8X8_NOINLINE; /*==========================================*/ -/* u8g2.c */ -void u8x8_SetupDefaults(u8x8_t *u8g2); +/* u8x8_setup.c */ +void u8x8_SetupDefaults(u8x8_t *u8x8); /*==========================================*/ /* u8x8_d_stdio.c */ -void u8x8_SetupStdio(u8x8_t *u8g2); +void u8x8_SetupStdio(u8x8_t *u8x8); /*==========================================*/ /* u8x8_d_sdl_128x64.c */ -void u8x8_Setup_SDL_128x64(u8x8_t *u8g2); -void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x); +void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); +void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2); int u8g_sdl_get_key(void); /*==========================================*/ /* u8x8_d_uc1701_dogs102.c */ -uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ /* u8x8_d_ssd1306_128x64_noname.c */ -uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr); +uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); /*==========================================*/ /* u8x8_8x8.c */ -void u8x8_Set8x8Font(u8x8_t *u8g2, const uint8_t *font_8x8); -void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding); -void u8x8_Draw8x8String(u8x8_t *u8g2, uint8_t x, uint8_t y, const char *s); +void u8x8_Set8x8Font(u8x8_t *u8x8, const uint8_t *font_8x8); +void u8x8_Draw8x8Glyph(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t encoding); +void u8x8_Draw8x8String(u8x8_t *u8x8, uint8_t x, uint8_t y, const char *s); /*==========================================*/ /* high level interface */ diff --git a/u8g2/csrc/u8x8_8x8.c b/u8g2/csrc/u8x8_8x8.c index 22d5c873..fd53d8c2 100644 --- a/u8g2/csrc/u8x8_8x8.c +++ b/u8g2/csrc/u8x8_8x8.c @@ -8,18 +8,18 @@ #include "u8x8.h" -void u8x8_Set8x8Font(u8x8_t *u8g2, const uint8_t *font_8x8) +void u8x8_Set8x8Font(u8x8_t *u8x8, const uint8_t *font_8x8) { - u8g2->font = font_8x8; + u8x8->font = font_8x8; } -void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) +void u8x8_Draw8x8Glyph(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t encoding) { uint8_t first, last, i; uint8_t buf[8]; uint16_t offset; - first = u8x8_pgm_read(u8g2->font+0); - last = u8x8_pgm_read(u8g2->font+1); + first = u8x8_pgm_read(u8x8->font+0); + last = u8x8_pgm_read(u8x8->font+1); if ( first <= encoding && encoding <= last ) { @@ -29,7 +29,7 @@ void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) offset +=2; for( i = 0; i < 8; i++ ) { - buf[i] = u8x8_pgm_read(u8g2->font+offset); + buf[i] = u8x8_pgm_read(u8x8->font+offset); offset++; } } @@ -40,14 +40,14 @@ void u8x8_Draw8x8Glyph(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t encoding) buf[i] = 0; } } - u8x8_display_DrawTile(u8g2, x, y, 1, buf); + u8x8_display_DrawTile(u8x8, x, y, 1, buf); } -void u8x8_Draw8x8String(u8x8_t *u8g2, uint8_t x, uint8_t y, const char *s) +void u8x8_Draw8x8String(u8x8_t *u8x8, uint8_t x, uint8_t y, const char *s) { while( *s != '\0' ) { - u8x8_Draw8x8Glyph(u8g2, x, y, (uint8_t)*s); + u8x8_Draw8x8Glyph(u8x8, x, y, (uint8_t)*s); s++; x++; } diff --git a/u8g2/csrc/u8x8_byte.c b/u8g2/csrc/u8x8_byte.c index d9090db6..37ea230c 100644 --- a/u8g2/csrc/u8x8_byte.c +++ b/u8g2/csrc/u8x8_byte.c @@ -6,32 +6,32 @@ #include "u8x8.h" -uint8_t u8x8_byte_SetDC(u8x8_t *u8g2, uint8_t dc) +uint8_t u8x8_byte_SetDC(u8x8_t *u8x8, uint8_t dc) { - return u8g2->byte_cb(u8g2, U8X8_MSG_BYTE_SET_DC, dc, NULL); + return u8x8->byte_cb(u8x8, U8X8_MSG_BYTE_SET_DC, dc, NULL); } -uint8_t u8x8_byte_SendBytes(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) +uint8_t u8x8_byte_SendBytes(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) { - return u8g2->byte_cb(u8g2, U8X8_MSG_BYTE_SEND, cnt, (void *)data); + return u8x8->byte_cb(u8x8, U8X8_MSG_BYTE_SEND, cnt, (void *)data); } -uint8_t u8x8_byte_SendByte(u8x8_t *u8g2, uint8_t byte) +uint8_t u8x8_byte_SendByte(u8x8_t *u8x8, uint8_t byte) { - return u8x8_byte_SendBytes(u8g2, 1, &byte); + return u8x8_byte_SendBytes(u8x8, 1, &byte); } /* Uses: - u8g2->display_info->sda_setup_time_ns - u8g2->display_info->sck_pulse_width_ns - u8g2->display_info->sck_takeover_edge - u8g2->display_info->chip_disable_level - u8g2->display_info->chip_enable_level - u8g2->display_info->post_chip_enable_wait_ns - u8g2->display_info->pre_chip_disable_wait_ns + u8x8->display_info->sda_setup_time_ns + u8x8->display_info->sck_pulse_width_ns + u8x8->display_info->sck_takeover_edge + u8x8->display_info->chip_disable_level + u8x8->display_info->chip_enable_level + u8x8->display_info->post_chip_enable_wait_ns + u8x8->display_info->pre_chip_disable_wait_ns Calls to GPIO and DELAY: U8X8_MSG_DELAY_NANO U8X8_MSG_GPIO_DC @@ -47,11 +47,11 @@ uint8_t u8x8_byte_SendByte(u8x8_t *u8g2, uint8_t byte) U8X8_MSG_BYTE_SET_I2C_ADR (ignored) U8X8_MSG_BYTE_SET_DEVICE (ignored) */ -uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t i, b; uint8_t *data; - uint8_t takeover_edge = u8g2->display_info->sck_takeover_edge; + uint8_t takeover_edge = u8x8->display_info->sck_takeover_edge; uint8_t not_takeover_edge = 1 - takeover_edge; switch(msg) @@ -66,37 +66,37 @@ uint8_t u8x8_byte_8bit_sw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void * for( i = 0; i < 8; i++ ) { if ( b & 128 ) - u8x8_gpio_SetData(u8g2, 1); + u8x8_gpio_SetData(u8x8, 1); else - u8x8_gpio_SetData(u8g2, 0); + u8x8_gpio_SetData(u8x8, 0); b <<= 1; - u8x8_gpio_SetClock(u8g2, not_takeover_edge); - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->sda_setup_time_ns); - u8x8_gpio_SetClock(u8g2, takeover_edge); - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->sck_pulse_width_ns); + u8x8_gpio_SetClock(u8x8, not_takeover_edge); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->sda_setup_time_ns); + u8x8_gpio_SetClock(u8x8, takeover_edge); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->sck_pulse_width_ns); } } break; case U8X8_MSG_BYTE_INIT: /* disable chipselect */ - u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); /* no wait required here */ /* for SPI: setup correct level of the clock signal */ - u8x8_gpio_SetClock(u8g2, u8g2->display_info->sck_takeover_edge); + u8x8_gpio_SetClock(u8x8, u8x8->display_info->sck_takeover_edge); break; case U8X8_MSG_BYTE_SET_DC: - u8x8_gpio_SetDC(u8g2, arg_int); + u8x8_gpio_SetDC(u8x8, arg_int); break; case U8X8_MSG_BYTE_START_TRANSFER: - u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); - u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); + u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level); + u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL); break; case U8X8_MSG_BYTE_END_TRANSFER: - u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); - u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL); + u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); break; case U8X8_MSG_BYTE_SET_I2C_ADR: break; diff --git a/u8g2/csrc/u8x8_cad.c b/u8g2/csrc/u8x8_cad.c index 67279fad..048fe367 100644 --- a/u8g2/csrc/u8x8_cad.c +++ b/u8g2/csrc/u8x8_cad.c @@ -7,20 +7,20 @@ The following sequence must be used for any data, which is set to the display: - uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) + uint8_t u8x8_cad_StartTransfer(u8x8_t *u8x8) any of the following calls - uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) - uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) - uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) + uint8_t u8x8_cad_SendCmd(u8x8_t *u8x8, uint8_t cmd) + uint8_t u8x8_cad_SendArg(u8x8_t *u8x8, uint8_t arg) + uint8_t u8x8_cad_SendData(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) - uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) + uint8_t u8x8_cad_EndTransfer(u8x8_t *u8x8) */ /* -uint8_t u8x8_cad_template(u8x8_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg_ptr) +uint8_t u8x8_cad_template(u8x8_t *u8x8, uint8_t msg, uint16_t arg_int, void *arg_ptr) { uint8_t i; @@ -59,29 +59,29 @@ uint8_t u8x8_cad_template(u8x8_t *u8g2, uint8_t msg, uint16_t arg_int, void *arg #include "u8x8.h" -uint8_t u8x8_cad_SendCmd(u8x8_t *u8g2, uint8_t cmd) +uint8_t u8x8_cad_SendCmd(u8x8_t *u8x8, uint8_t cmd) { - return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_CMD, cmd, NULL); + return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_CMD, cmd, NULL); } -uint8_t u8x8_cad_SendArg(u8x8_t *u8g2, uint8_t arg) +uint8_t u8x8_cad_SendArg(u8x8_t *u8x8, uint8_t arg) { - return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_ARG, arg, NULL); + return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_ARG, arg, NULL); } -uint8_t u8x8_cad_SendData(u8x8_t *u8g2, uint8_t cnt, uint8_t *data) +uint8_t u8x8_cad_SendData(u8x8_t *u8x8, uint8_t cnt, uint8_t *data) { - return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_SEND_DATA, cnt, data); + return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_SEND_DATA, cnt, data); } -uint8_t u8x8_cad_StartTransfer(u8x8_t *u8g2) +uint8_t u8x8_cad_StartTransfer(u8x8_t *u8x8) { - return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_START_TRANSFER, 0, NULL); + return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_START_TRANSFER, 0, NULL); } -uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) +uint8_t u8x8_cad_EndTransfer(u8x8_t *u8x8) { - return u8g2->cad_cb(u8g2, U8X8_MSG_CAD_END_TRANSFER, 0, NULL); + return u8x8->cad_cb(u8x8, U8X8_MSG_CAD_END_TRANSFER, 0, NULL); } /* @@ -94,7 +94,7 @@ uint8_t u8x8_cad_EndTransfer(u8x8_t *u8g2) */ -void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data) +void u8x8_cad_SendSequence(u8x8_t *u8x8, uint8_t const *data) { uint8_t cmd; uint8_t v; @@ -108,21 +108,21 @@ void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data) case U8X8_MSG_CAD_SEND_CMD: case U8X8_MSG_CAD_SEND_ARG: v = *data; - u8g2->cad_cb(u8g2, cmd, v, NULL); + u8x8->cad_cb(u8x8, cmd, v, NULL); data++; break; case U8X8_MSG_CAD_SEND_DATA: v = *data; - u8x8_cad_SendData(u8g2, 1, &v); + u8x8_cad_SendData(u8x8, 1, &v); data++; break; case U8X8_MSG_CAD_START_TRANSFER: case U8X8_MSG_CAD_END_TRANSFER: - u8g2->cad_cb(u8g2, cmd, 0, NULL); + u8x8->cad_cb(u8x8, cmd, 0, NULL); break; case 0x0fe: v = *data; - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, v); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_MILLI, v); data++; break; default: @@ -137,21 +137,21 @@ void u8x8_cad_SendSequence(u8x8_t *u8g2, uint8_t const *data) dc = 1 for commands and args and dc = 0 for data */ -uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_cad_110(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { case U8X8_MSG_CAD_SEND_CMD: - u8x8_byte_SetDC(u8g2, 1); - u8x8_byte_SendByte(u8g2, arg_int); + u8x8_byte_SetDC(u8x8, 1); + u8x8_byte_SendByte(u8x8, arg_int); break; case U8X8_MSG_CAD_SEND_ARG: - u8x8_byte_SetDC(u8g2, 1); - u8x8_byte_SendByte(u8g2, arg_int); + u8x8_byte_SetDC(u8x8, 1); + u8x8_byte_SendByte(u8x8, arg_int); break; case U8X8_MSG_CAD_SEND_DATA: - u8x8_byte_SetDC(u8g2, 0); - //u8x8_byte_SendBytes(u8g2, arg_int, arg_ptr); + u8x8_byte_SetDC(u8x8, 0); + //u8x8_byte_SendBytes(u8x8, arg_int, arg_ptr); //break; /* fall through */ case U8X8_MSG_CAD_INIT: @@ -159,7 +159,7 @@ uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) case U8X8_MSG_CAD_END_TRANSFER: case U8X8_MSG_CAD_SET_I2C_ADR: case U8X8_MSG_CAD_SET_DEVICE: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + return u8x8->byte_cb(u8x8, msg, arg_int, arg_ptr); default: return 0; } @@ -171,21 +171,21 @@ uint8_t u8x8_cad_110(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) dc = 0 for commands and args and dc = 1 for data */ -uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_cad_001(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { case U8X8_MSG_CAD_SEND_CMD: - u8x8_byte_SetDC(u8g2, 0); - u8x8_byte_SendByte(u8g2, arg_int); + u8x8_byte_SetDC(u8x8, 0); + u8x8_byte_SendByte(u8x8, arg_int); break; case U8X8_MSG_CAD_SEND_ARG: - u8x8_byte_SetDC(u8g2, 0); - u8x8_byte_SendByte(u8g2, arg_int); + u8x8_byte_SetDC(u8x8, 0); + u8x8_byte_SendByte(u8x8, arg_int); break; case U8X8_MSG_CAD_SEND_DATA: - u8x8_byte_SetDC(u8g2, 1); - //u8x8_byte_SendBytes(u8g2, arg_int, arg_ptr); + u8x8_byte_SetDC(u8x8, 1); + //u8x8_byte_SendBytes(u8x8, arg_int, arg_ptr); //break; /* fall through */ case U8X8_MSG_CAD_INIT: @@ -193,7 +193,7 @@ uint8_t u8x8_cad_001(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) case U8X8_MSG_CAD_END_TRANSFER: case U8X8_MSG_CAD_SET_I2C_ADR: case U8X8_MSG_CAD_SET_DEVICE: - return u8g2->byte_cb(u8g2, msg, arg_int, arg_ptr); + return u8x8->byte_cb(u8x8, msg, arg_int, arg_ptr); default: return 0; } diff --git a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c index 5dc047ca..fb2391e4 100644 --- a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c @@ -90,47 +90,47 @@ static const u8x8_display_info_t u8x8_ssd1306_128x64_noname_display_info = /* default_x_offset = */ 0 }; -uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t x, c; uint8_t *ptr; switch(msg) { case U8X8_MSG_DISPLAY_INIT: - u8x8_d_helper_display_init(u8g2, &u8x8_ssd1306_128x64_noname_display_info); - u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_init_seq); + u8x8_d_helper_display_init(u8x8, &u8x8_ssd1306_128x64_noname_display_info); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_init_seq); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) - u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_powersave0_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_powersave0_seq); else - u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_powersave1_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_powersave1_seq); break; #ifdef U8X8_WITH_SET_FLIP_MODE case U8X8_MSG_DISPLAY_SET_FLIP_MODE: if ( arg_int == 0 ) - u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_flip0_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_flip0_seq); else - u8x8_cad_SendSequence(u8g2, u8x8_d_ssd1306_128x64_noname_flip1_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_flip1_seq); break; #endif #ifdef U8X8_WITH_SET_CONTRAST case U8X8_MSG_DISPLAY_SET_CONTRAST: - u8x8_cad_StartTransfer(u8g2); - u8x8_cad_SendCmd(u8g2, 0x081 ); - u8x8_cad_SendArg(u8g2, arg_int ); /* ssd1306 has range from 0 to 255 */ - u8x8_cad_EndTransfer(u8g2); + u8x8_cad_StartTransfer(u8x8); + u8x8_cad_SendCmd(u8x8, 0x081 ); + u8x8_cad_SendArg(u8x8, arg_int ); /* ssd1306 has range from 0 to 255 */ + u8x8_cad_EndTransfer(u8x8); break; #endif case U8X8_MSG_DISPLAY_DRAW_TILE: - u8x8_cad_StartTransfer(u8g2); + u8x8_cad_StartTransfer(u8x8); x = ((u8x8_tile_t *)arg_ptr)->x_pos; x *= 8; - x += u8g2->x_offset; - u8x8_cad_SendCmd(u8g2, 0x010 | (x>>4) ); - u8x8_cad_SendCmd(u8g2, 0x000 | ((x&15))); - u8x8_cad_SendCmd(u8g2, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); + x += u8x8->x_offset; + u8x8_cad_SendCmd(u8x8, 0x010 | (x>>4) ); + u8x8_cad_SendCmd(u8x8, 0x000 | ((x&15))); + u8x8_cad_SendCmd(u8x8, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); do { @@ -138,14 +138,14 @@ uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; do { - u8x8_cad_SendData(u8g2, 8, ptr); + u8x8_cad_SendData(u8x8, 8, ptr); ptr += 8; c--; } while( c > 0 ); arg_int--; } while( arg_int > 0 ); - u8x8_cad_EndTransfer(u8g2); + u8x8_cad_EndTransfer(u8x8); break; default: return 0; diff --git a/u8g2/csrc/u8x8_d_stdio.c b/u8g2/csrc/u8x8_d_stdio.c index 8d350915..4da80010 100644 --- a/u8g2/csrc/u8x8_d_stdio.c +++ b/u8g2/csrc/u8x8_d_stdio.c @@ -36,7 +36,7 @@ void bitmap_show(void) } -uint8_t u8x8_d_stdio(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_stdio(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { @@ -59,9 +59,9 @@ uint8_t u8x8_d_stdio(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) -void u8x8_SetupStdio(u8x8_t *u8g2) +void u8x8_SetupStdio(u8x8_t *u8x8) { - u8x8_SetupDefaults(u8g2); - u8g2->display_cb = u8x8_d_stdio; + u8x8_SetupDefaults(u8x8); + u8x8->display_cb = u8x8_d_stdio; } diff --git a/u8g2/csrc/u8x8_d_uc1701_dogs102.c b/u8g2/csrc/u8x8_d_uc1701_dogs102.c index 090c1427..9d2c5b9e 100644 --- a/u8g2/csrc/u8x8_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8x8_d_uc1701_dogs102.c @@ -90,64 +90,64 @@ static const u8x8_display_info_t u8x8_uc1701_display_info = #endif }; -uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { uint8_t x, c; uint8_t *ptr; switch(msg) { case U8X8_MSG_DISPLAY_INIT: - u8x8_d_helper_display_init(u8g2, &u8x8_uc1701_display_info); - u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_init_seq); + u8x8_d_helper_display_init(u8x8, &u8x8_uc1701_display_info); + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_init_seq); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) - u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_powersave0_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_powersave0_seq); else - u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_powersave1_seq); + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_powersave1_seq); break; #ifdef U8X8_WITH_SET_FLIP_MODE case U8X8_MSG_DISPLAY_SET_FLIP_MODE: if ( arg_int == 0 ) { - u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_flip0_seq); - u8g2->x_offset = 0; + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_flip0_seq); + u8x8->x_offset = 0; } else { - u8x8_cad_SendSequence(u8g2, u8x8_d_uc1701_dogs102_flip1_seq); - u8g2->x_offset = 30; + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_flip1_seq); + u8x8->x_offset = 30; } break; #endif #ifdef U8X8_WITH_SET_CONTRAST case U8X8_MSG_DISPLAY_SET_CONTRAST: - u8x8_cad_StartTransfer(u8g2); - u8x8_cad_SendCmd(u8g2, 0x081 ); - u8x8_cad_SendArg(u8g2, arg_int >> 2 ); /* uc1701 has range from 0 to 63 */ - u8x8_cad_EndTransfer(u8g2); + u8x8_cad_StartTransfer(u8x8); + u8x8_cad_SendCmd(u8x8, 0x081 ); + u8x8_cad_SendArg(u8x8, arg_int >> 2 ); /* uc1701 has range from 0 to 63 */ + u8x8_cad_EndTransfer(u8x8); break; #endif case U8X8_MSG_DISPLAY_DRAW_TILE: - u8x8_cad_StartTransfer(u8g2); + u8x8_cad_StartTransfer(u8x8); x = ((u8x8_tile_t *)arg_ptr)->x_pos; x *= 8; - x += u8g2->x_offset; - u8x8_cad_SendCmd(u8g2, 0x010 | (x>>4) ); - u8x8_cad_SendCmd(u8g2, 0x000 | ((x&15))); - u8x8_cad_SendCmd(u8g2, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); + x += u8x8->x_offset; + u8x8_cad_SendCmd(u8x8, 0x010 | (x>>4) ); + u8x8_cad_SendCmd(u8x8, 0x000 | ((x&15))); + u8x8_cad_SendCmd(u8x8, 0x0b0 | (((u8x8_tile_t *)arg_ptr)->y_pos)); do { c = ((u8x8_tile_t *)arg_ptr)->cnt; ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; - u8x8_cad_SendData(u8g2, c*8, ptr); + u8x8_cad_SendData(u8x8, c*8, ptr); /* do { - u8x8_cad_SendData(u8g2, 8, ptr); + u8x8_cad_SendData(u8x8, 8, ptr); ptr += 8; c--; } while( c > 0 ); @@ -155,7 +155,7 @@ uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void * arg_int--; } while( arg_int > 0 ); - u8x8_cad_EndTransfer(u8g2); + u8x8_cad_EndTransfer(u8x8); break; default: return 0; diff --git a/u8g2/csrc/u8x8_display.c b/u8g2/csrc/u8x8_display.c index d7d1dead..f18aa537 100644 --- a/u8g2/csrc/u8x8_display.c +++ b/u8g2/csrc/u8x8_display.c @@ -3,7 +3,7 @@ u8x8_display.c Abstraction layer for the graphics controller. - Main goal is the placement of a 8x8 pixel block on the display. + Main goal is the placement of a 8x8 pixel block (tile) on the display. */ @@ -18,60 +18,60 @@ It can be called within the display callback function to carry out the usual standard tasks. */ -void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display_info) +void u8x8_d_helper_display_init(u8x8_t *u8x8, const u8x8_display_info_t *display_info) { /* 1) set display info struct */ - u8g2->display_info = display_info; - u8g2->x_offset = u8g2->display_info->default_x_offset; + u8x8->display_info = display_info; + u8x8->x_offset = u8x8->display_info->default_x_offset; /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ - u8x8_gpio_Init(u8g2); - u8x8_cad_Init(u8g2); + u8x8_gpio_Init(u8x8); + u8x8_cad_Init(u8x8); /* 3) do reset */ - u8x8_gpio_SetReset(u8g2, 1); - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8x8_gpio_SetReset(u8g2, 0); - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->reset_pulse_width_ms); - u8x8_gpio_SetReset(u8g2, 1); - u8x8_gpio_Delay(u8g2, U8X8_MSG_DELAY_MILLI, u8g2->display_info->post_reset_wait_ms); + u8x8_gpio_SetReset(u8x8, 1); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_MILLI, u8x8->display_info->reset_pulse_width_ms); + u8x8_gpio_SetReset(u8x8, 0); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_MILLI, u8x8->display_info->reset_pulse_width_ms); + u8x8_gpio_SetReset(u8x8, 1); + u8x8_gpio_Delay(u8x8, U8X8_MSG_DELAY_MILLI, u8x8->display_info->post_reset_wait_ms); } /*==========================================*/ /* official functions */ -uint8_t u8x8_display_DrawTile(u8x8_t *u8g2, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) +uint8_t u8x8_display_DrawTile(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) { u8x8_tile_t tile; tile.x_pos = x; tile.y_pos = y; tile.cnt = cnt; tile.tile_ptr = tile_ptr; - return u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); + return u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); } -void u8x8_display_Init(u8x8_t *u8g2) +void u8x8_display_Init(u8x8_t *u8x8) { - u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_INIT, 0, NULL); + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_INIT, 0, NULL); } -void u8x8_display_SetPowerSave(u8x8_t *u8g2, uint8_t is_enable) +void u8x8_display_SetPowerSave(u8x8_t *u8x8, uint8_t is_enable) { - u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_POWER_SAVE, is_enable, NULL); + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_SET_POWER_SAVE, is_enable, NULL); } -void u8x8_display_SetFlipMode(u8x8_t *u8g2, uint8_t mode) +void u8x8_display_SetFlipMode(u8x8_t *u8x8, uint8_t mode) { - u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_SET_FLIP_MODE, mode, NULL); } -void u8x8_display_SetContrast(u8x8_t *u8g2, uint8_t value) +void u8x8_display_SetContrast(u8x8_t *u8x8, uint8_t value) { - u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_SET_CONTRAST, value, NULL); + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_SET_CONTRAST, value, NULL); } -void u8x8_display_ClearScreen(u8x8_t *u8g2) +void u8x8_display_ClearScreen(u8x8_t *u8x8) { uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; u8x8_tile_t tile; @@ -81,11 +81,11 @@ void u8x8_display_ClearScreen(u8x8_t *u8g2) tile.cnt = 1; tile.tile_ptr = buf; - h = u8g2->display_info->tile_height; + h = u8x8->display_info->tile_height; tile.y_pos = 0; do { - u8g2->display_cb(u8g2, U8X8_MSG_DISPLAY_DRAW_TILE, u8g2->display_info->tile_width, (void *)&tile); + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_DRAW_TILE, u8x8->display_info->tile_width, (void *)&tile); tile.y_pos++; } while( tile.y_pos < h ); } diff --git a/u8g2/csrc/u8x8_gpio.c b/u8g2/csrc/u8x8_gpio.c index 9dba0097..5f17d5a2 100644 --- a/u8g2/csrc/u8x8_gpio.c +++ b/u8g2/csrc/u8x8_gpio.c @@ -2,14 +2,14 @@ #include "u8x8.h" -void u8x8_gpio_call(u8x8_t *u8g2, uint8_t msg, uint8_t arg) +void u8x8_gpio_call(u8x8_t *u8x8, uint8_t msg, uint8_t arg) { - u8g2->gpio_and_delay_cb(u8g2, msg, arg, NULL); + u8x8->gpio_and_delay_cb(u8x8, msg, arg, NULL); } /* -void u8x8_gpio_Delay(u8x8_t *u8g2, uint8_t msg, uint8_t dly) +void u8x8_gpio_Delay(u8x8_t *u8x8, uint8_t msg, uint8_t dly) { - u8g2->gpio_and_delay_cb(u8g2, msg, dly, NULL); + u8x8->gpio_and_delay_cb(u8x8, msg, dly, NULL); } */ \ No newline at end of file diff --git a/u8g2/csrc/u8x8_setup.c b/u8g2/csrc/u8x8_setup.c index bdd598b8..8f3f8871 100644 --- a/u8g2/csrc/u8x8_setup.c +++ b/u8g2/csrc/u8x8_setup.c @@ -1,13 +1,13 @@ /* - u8g2_setup.c + u8x8_setup.c */ #include "u8x8.h" -uint8_t u8x8_dummy_cb(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_dummy_cb(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { /* the dummy callback will not handle any message and will fail for all messages */ return 0; @@ -16,17 +16,17 @@ uint8_t u8x8_dummy_cb(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) /* Description: - Setup u8g2 + Setup u8x8 Args: - u8g2 An empty u8g2 structure + u8x8 An empty u8x8 structure */ -void u8x8_SetupDefaults(u8x8_t *u8g2) +void u8x8_SetupDefaults(u8x8_t *u8x8) { - u8g2->display_info = NULL; - u8g2->display_cb = u8x8_dummy_cb; - u8g2->cad_cb = u8x8_dummy_cb; - u8g2->byte_cb = u8x8_dummy_cb; - u8g2->gpio_and_delay_cb = u8x8_dummy_cb; + u8x8->display_info = NULL; + u8x8->display_cb = u8x8_dummy_cb; + u8x8->cad_cb = u8x8_dummy_cb; + u8x8->byte_cb = u8x8_dummy_cb; + u8x8->gpio_and_delay_cb = u8x8_dummy_cb; } From 00fc6d3094a46f0f13fc782348ca5405cc7bf749 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 11 Oct 2015 18:47:01 +0200 Subject: [PATCH 051/109] u8g2x --> u8g2 --- u8g2/csrc/u8x8.h | 28 ++++++++--------- u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 42 ++++++++++++------------- u8g2/sys/sdl/hvline/main.c | 22 ++++++------- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index db4744a9..ca1fa083 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -111,20 +111,20 @@ extern "C" { /*==========================================*/ /* U8G2 typedefs and data structures */ -typedef uint16_t u8x8_uint_t; /* for pixel position only */ +typedef uint16_t u8g2_uint_t; /* for pixel position only */ typedef struct u8x8_struct u8x8_t; typedef struct u8x8_display_info_struct u8x8_display_info_t; typedef struct u8x8_tile_struct u8x8_tile_t; -typedef struct u8g2x_struct u8g2x_t; -typedef struct u8g2x_cb_struct u8g2x_cb_t; +typedef struct u8g2_struct u8g2_t; +typedef struct u8g2_cb_struct u8g2_cb_t; typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); -typedef void (*u8g2x_update_dimension_cb)(u8g2x_t *u8g2x_t); -typedef void (*u8g2x_draw_l90_cb)(u8g2x_t *u8g2x_t, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir); +typedef void (*u8g2_update_dimension_cb)(u8g2_t *u8g2_t); +typedef void (*u8g2_draw_l90_cb)(u8g2_t *u8g2_t, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); //struct u8x8_mcd_struct @@ -201,24 +201,24 @@ struct u8x8_struct }; -struct u8g2x_cb_struct +struct u8g2_cb_struct { - u8g2x_update_dimension_cb update; - u8g2x_draw_l90_cb draw_l90; + u8g2_update_dimension_cb update; + u8g2_draw_l90_cb draw_l90; }; -struct u8g2x_struct +struct u8g2_struct { u8x8_t u8x8; - u8g2x_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ + u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ uint8_t tile_curr_row; /* current row for picture loop */ uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ }; -#define u8g2x_GetU8x8(u8g2x) ((u8x8_t *)(u8g2x)) +#define u8g2_GetU8x8(u8g2) ((u8x8_t *)(u8g2)) /*==========================================*/ @@ -451,7 +451,7 @@ void u8x8_SetupStdio(u8x8_t *u8x8); /*==========================================*/ /* u8x8_d_sdl_128x64.c */ void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); -void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2); +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2); int u8g_sdl_get_key(void); @@ -473,8 +473,8 @@ void u8x8_Draw8x8String(u8x8_t *u8x8, uint8_t x, uint8_t y, const char *s); /*==========================================*/ /* high level interface */ -void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir); -void u8g2x_SendBuffer(u8g2x_t *u8g2x); +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); +void u8g2_SendBuffer(u8g2_t *u8g2); #ifdef __cplusplus diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index e51a9919..4f973574 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -262,7 +262,7 @@ void u8x8_Setup_SDL_128x64(u8x8_t *u8g2) } -void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) { static uint8_t buf[128*8]; @@ -272,30 +272,30 @@ void u8g2x_Setup_SDL_128x64(u8g2x_t *u8g2x) buf[i] = (i>>2); */ - u8x8_Setup_SDL_128x64(u8g2x_GetU8x8(u8g2x)); - u8g2x->tile_buf_ptr = buf; - u8g2x->tile_buf_height = 8; - u8g2x->tile_curr_row = 0; - u8g2x->draw_color = 1; + u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2)); + u8g2->tile_buf_ptr = buf; + u8g2->tile_buf_height = 8; + u8g2->tile_curr_row = 0; + u8g2->draw_color = 1; } -void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y) +void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { uint8_t *ptr; uint8_t bit_pos, mask; uint16_t offset; - ptr = u8g2x->tile_buf_ptr; + ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ bit_pos = y; /* overflow truncate is ok here... */ bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ - offset *= u8g2x_GetU8x8(u8g2x)->display_info->tile_width; + offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; ptr += offset; ptr += x; mask = 1; mask <<= bit_pos; - if ( u8g2x->draw_color != 0 ) + if ( u8g2->draw_color != 0 ) { *ptr |= mask; } @@ -312,13 +312,13 @@ void u8g2x_draw_pixel(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y) dir 0: horizontal line (left to right) 1: vertical line (top to bottom) */ -void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t len, uint8_t dir) +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { if ( dir == 0 ) { do { - u8g2x_draw_pixel(u8g2x, x, y); + u8g2_draw_pixel(u8g2, x, y); x++; len--; } while( len != 0 ); @@ -327,36 +327,36 @@ void u8g2x_DrawHVLine(u8g2x_t *u8g2x, u8x8_uint_t x, u8x8_uint_t y, u8x8_uint_t { do { - u8g2x_draw_pixel(u8g2x, x, y); + u8g2_draw_pixel(u8g2, x, y); y++; len--; } while( len != 0 ); } } -static void u8g2x_send_tile_row(u8g2x_t *u8g2x, uint8_t tile_row) +static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) { uint8_t *ptr; uint16_t offset; uint8_t w; - w = u8g2x_GetU8x8(u8g2x)->display_info->tile_width; + w = u8g2_GetU8x8(u8g2)->display_info->tile_width; offset = tile_row; - ptr = u8g2x->tile_buf_ptr; + ptr = u8g2->tile_buf_ptr; offset *= w; offset *= 8; ptr += offset; - u8x8_display_DrawTile(u8g2x_GetU8x8(u8g2x), 0, tile_row, w, ptr); + u8x8_display_DrawTile(u8g2_GetU8x8(u8g2), 0, tile_row, w, ptr); } -void u8g2x_SendBuffer(u8g2x_t *u8g2x) +void u8g2_SendBuffer(u8g2_t *u8g2) { - uint8_t cnt = u8g2x->tile_buf_height; - uint8_t row = u8g2x->tile_curr_row; + uint8_t cnt = u8g2->tile_buf_height; + uint8_t row = u8g2->tile_curr_row; do { - u8g2x_send_tile_row(u8g2x, row); + u8g2_send_tile_row(u8g2, row); cnt--; row++; } while( cnt > 0 ); diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index ead1f616..1645e2bb 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -52,27 +52,27 @@ const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, 65,0,2,3,1,3,2,1,1,0}; -u8g2x_t u8g2x; +u8g2_t u8g2; int main(void) { - u8g2x_Setup_SDL_128x64(&u8g2x); - u8x8_display_Init(u8g2x_GetU8x8(&u8g2x)); - u8x8_display_SetPowerSave(u8g2x_GetU8x8(&u8g2x), 0); + u8g2_Setup_SDL_128x64(&u8g2); + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); - u8g2x_DrawHVLine(&u8g2x, 5, 20, 40, 0); - u8g2x_DrawHVLine(&u8g2x, 5, 22, 40, 0); - u8g2x_DrawHVLine(&u8g2x, 5, 24, 40, 0); + u8g2_DrawHVLine(&u8g2, 5, 20, 40, 0); + u8g2_DrawHVLine(&u8g2, 5, 22, 40, 0); + u8g2_DrawHVLine(&u8g2, 5, 24, 40, 0); - u8g2x_DrawHVLine(&u8g2x, 5, 24, 40, 1); + u8g2_DrawHVLine(&u8g2, 5, 24, 40, 1); - u8g2x_SendBuffer(&u8g2x); + u8g2_SendBuffer(&u8g2); - u8x8_Set8x8Font(u8g2x_GetU8x8(&u8g2x), bdf_font); - u8x8_Draw8x8String(u8g2x_GetU8x8(&u8g2x), 0, 0, "Hello World!"); + u8x8_Set8x8Font(u8g2_GetU8x8(&u8g2), bdf_font); + u8x8_Draw8x8String(u8g2_GetU8x8(&u8g2), 0, 0, "Hello World!"); From 3a37d2ca5afd5a786bfe763249ecc68be677fdd5 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 14 Oct 2015 23:26:28 +0200 Subject: [PATCH 052/109] u8g2 / u8x8 --- u8g2/csrc/u8g2.h | 32 +++++++ u8g2/csrc/u8g2_hvline.c | 102 +++++++++++++++++++++++ u8g2/csrc/u8g2_setup.c | 35 ++++++++ u8g2/csrc/u8x8.h | 32 +++++-- u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c | 8 +- u8g2/csrc/u8x8_d_uc1701_dogs102.c | 7 +- u8g2/csrc/u8x8_display.c | 21 ++++- u8g2/sys/arduino/test/test.ino | 33 ++++---- u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 69 +++------------ 9 files changed, 253 insertions(+), 86 deletions(-) create mode 100644 u8g2/csrc/u8g2.h create mode 100644 u8g2/csrc/u8g2_hvline.c create mode 100644 u8g2/csrc/u8g2_setup.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h new file mode 100644 index 00000000..ce55f64f --- /dev/null +++ b/u8g2/csrc/u8g2.h @@ -0,0 +1,32 @@ +/* + + u8g2.h + + call sequence + + u8g2_Setup_XYZ + u8x8_Setup_XYZ + u8x8_SetupDefaults(u8g2); + assign u8x8 callbacks + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_SETUP, 0, NULL); + setup tile buffer + + + + + +*/ + + + + +#ifndef _U8G2_H +#define _U8G2_H + +#include "u8x8.h" + + + + +#endif + diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c new file mode 100644 index 00000000..d9f73aa5 --- /dev/null +++ b/u8g2/csrc/u8g2_hvline.c @@ -0,0 +1,102 @@ +/* + + u8g2_hvline.c + +*/ + +#include "u8g2.h" + + +void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) +{ + uint8_t *ptr; + uint8_t bit_pos, mask; + uint16_t offset; + ptr = u8g2->tile_buf_ptr; + /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ + bit_pos = y; /* overflow truncate is ok here... */ + bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ + y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ + offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ + offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; + ptr += offset; + ptr += x; + mask = 1; + mask <<= bit_pos; + if ( u8g2->draw_color != 0 ) + { + *ptr |= mask; + } + else + { + mask ^= 255; + *ptr &= mask; + } +} + +/* + x,y Upper left position of the line + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) +*/ +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + if ( dir == 0 ) + { + do + { + u8g2_draw_pixel(u8g2, x, y); + x++; + len--; + } while( len != 0 ); + } + else + { + do + { + u8g2_draw_pixel(u8g2, x, y); + y++; + len--; + } while( len != 0 ); + } +} + +/* + Description: + clip range from a (included) to b (excluded) agains c (included) to d (excluded) + Assumptions: + a <= b + c <= d +*/ +static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uint_t c, u8g2_uint_t d) +{ + u8g2_uint_t a = *ap; + u8g2_uint_t b = *bp; + + if ( a >= d ) + return 0; + if ( b <= c ) + return 0; + if ( a < c ) + *ap = c; + if ( b > d ) + *bp = d; + return 1; +} + + + +/* + x,y Upper left position of the line + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) +*/ +void u8g2_ClipAndDrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + +} + + + diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c new file mode 100644 index 00000000..7e192530 --- /dev/null +++ b/u8g2/csrc/u8g2_setup.c @@ -0,0 +1,35 @@ +/* + + u8g2_setup.c + +*/ +#include "u8g2.h" + + +/*============================================*/ +/* + update dimension: + calculate the following variables: + u8g2_uint_t buf_x0; left corner of the buffer + u8g2_uint_t buf_x1; right corner of the buffer (excluded) + u8g2_uint_t buf_y0; + u8g2_uint_t buf_y1; +*/ + +void u8g2_update_dimension_r0(u8g2_t *u8g2) +{ + u8g2_uint_t h, w; + h = u8g2->tile_buf_height; + h *= 8; + w = u8g2_GetU8x8(u8g2)->display_info->tile_width; + w *= 8; + u8g2->buf_x0 = 0; + u8g2->buf_y0 = u8g2->tile_curr_row; + u8g2->buf_y0 *= 8; + + u8g2->buf_x1 = u8g2->buf_x0; + u8g2->buf_x1 += w; + u8g2->buf_y1 = u8g2->buf_y0; + u8g2->buf_y1 += h; +} + diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index ca1fa083..5ffe4dad 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -1,5 +1,5 @@ /* - u8g2.h + u8x8.h @@ -9,6 +9,7 @@ The topmost level is the display layer. It includes the following messages: + U8X8_MSG_DISPLAY_SETUP no communicaation with the display, setup memory ony U8X8_MSG_DISPLAY_INIT U8X8_MSG_DISPLAY_SET_FLIP_MODE U8X8_MSG_DISPLAY_SET_POWER_SAVE @@ -123,8 +124,8 @@ typedef struct u8g2_cb_struct u8g2_cb_t; typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); -typedef void (*u8g2_update_dimension_cb)(u8g2_t *u8g2_t); -typedef void (*u8g2_draw_l90_cb)(u8g2_t *u8g2_t, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); +typedef void (*u8g2_update_dimension_cb)(u8g2_t *u8g2); +typedef void (*u8g2_draw_l90_cb)(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); //struct u8x8_mcd_struct @@ -212,27 +213,46 @@ struct u8g2_struct { u8x8_t u8x8; u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ + + /* the following variables must be assigned during u8g2 setup */ uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ uint8_t tile_curr_row; /* current row for picture loop */ + + /* the following variables are set by the update dimension callback */ + u8g2_uint_t buf_x0; /* left corner of the buffer */ + u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ + u8g2_uint_t buf_y0; + u8g2_uint_t buf_y1; + uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ }; #define u8g2_GetU8x8(u8g2) ((u8x8_t *)(u8g2)) + + /*==========================================*/ /* helper functions */ -void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display_info); +void u8x8_d_helper_display_setup(u8x8_t *u8x8, const u8x8_display_info_t *display_info); +void u8x8_d_helper_display_init(u8x8_t *u8g2); /* Display Interface */ /* - Name: U8X8_MSG_DISPLAY_INIT + Name: U8X8_MSG_DISPLAY_SETUP Args: None Tasks: 1) setup u8g2->display_info copy u8g2->display_info->default_x_offset to u8g2->x_offset +*/ +#define U8X8_MSG_DISPLAY_SETUP 9 + +/* + Name: U8X8_MSG_DISPLAY_INIT + Args: None + Tasks: 2) put interface into default state: execute u8x8_gpio_Init for port directions @@ -302,6 +322,8 @@ void u8x8_d_helper_display_init(u8x8_t *u8g2, const u8x8_display_info_t *display /* u8x8_display.c */ uint8_t u8x8_display_DrawTile(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); +/* setup display memory structures */ +void u8x8_display_Setup(u8x8_t *u8x8); /* Init display, but keep display in power save mode. Usually this command must be followed by u8x8_display_SetPowerSave() */ void u8x8_display_Init(u8x8_t *u8x8); /* wake up display from power save mode */ diff --git a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c index fb2391e4..35e47073 100644 --- a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c @@ -96,10 +96,12 @@ uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, uint8_t *ptr; switch(msg) { + case U8X8_MSG_DISPLAY_SETUP: + u8x8_d_helper_display_setup(u8x8, &u8x8_ssd1306_128x64_noname_display_info); + break; case U8X8_MSG_DISPLAY_INIT: - u8x8_d_helper_display_init(u8x8, &u8x8_ssd1306_128x64_noname_display_info); - u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_init_seq); - + u8x8_d_helper_display_init(u8x8); + u8x8_cad_SendSequence(u8x8, u8x8_d_ssd1306_128x64_noname_init_seq); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) diff --git a/u8g2/csrc/u8x8_d_uc1701_dogs102.c b/u8g2/csrc/u8x8_d_uc1701_dogs102.c index 9d2c5b9e..90154866 100644 --- a/u8g2/csrc/u8x8_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8x8_d_uc1701_dogs102.c @@ -96,9 +96,12 @@ uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void * uint8_t *ptr; switch(msg) { + case U8X8_MSG_DISPLAY_SETUP: + u8x8_d_helper_display_setup(u8x8, &u8x8_uc1701_display_info); + break; case U8X8_MSG_DISPLAY_INIT: - u8x8_d_helper_display_init(u8x8, &u8x8_uc1701_display_info); - u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_init_seq); + u8x8_d_helper_display_init(u8x8); + u8x8_cad_SendSequence(u8x8, u8x8_d_uc1701_dogs102_init_seq); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: if ( arg_int == 0 ) diff --git a/u8g2/csrc/u8x8_display.c b/u8g2/csrc/u8x8_display.c index f18aa537..dc3d74dd 100644 --- a/u8g2/csrc/u8x8_display.c +++ b/u8g2/csrc/u8x8_display.c @@ -13,17 +13,26 @@ /*==========================================*/ /* internal library function */ + /* - this is a helper function for the U8X8_MSG_DISPLAY_INIT function. + this is a helper function for the U8X8_MSG_DISPLAY_SETUP function. It can be called within the display callback function to carry out the usual standard tasks. */ -void u8x8_d_helper_display_init(u8x8_t *u8x8, const u8x8_display_info_t *display_info) +void u8x8_d_helper_display_setup(u8x8_t *u8x8, const u8x8_display_info_t *display_info) { /* 1) set display info struct */ u8x8->display_info = display_info; u8x8->x_offset = u8x8->display_info->default_x_offset; - +} + +/* + this is a helper function for the U8X8_MSG_DISPLAY_INIT function. + It can be called within the display callback function to carry out the usual standard tasks. + +*/ +void u8x8_d_helper_display_init(u8x8_t *u8x8) +{ /* 2) apply port directions to the GPIO lines and apply default values for the IO lines*/ u8x8_gpio_Init(u8x8); u8x8_cad_Init(u8x8); @@ -50,6 +59,12 @@ uint8_t u8x8_display_DrawTile(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t cnt, u return u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_DRAW_TILE, 1, (void *)&tile); } +/* should be implemented as macro */ +void u8x8_display_Setup(u8x8_t *u8x8) +{ + u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_SETUP, 0, NULL); +} + void u8x8_display_Init(u8x8_t *u8x8) { u8x8->display_cb(u8x8, U8X8_MSG_DISPLAY_INIT, 0, NULL); diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 75b7a303..9eb86152 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -160,30 +160,35 @@ uint8_t u8x8_byte_arduino_hw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, voi return 1; } -void u8x8_Setup_UC1701_DOGS102(u8x8_t *u8g2) +void u8x8_Setup_UC1701_DOGS102(u8x8_t *u8x8) { /* setup defaults */ - u8x8_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8x8); /* setup specific callbacks */ - u8g2->display_cb = u8x8_d_uc1701_dogs102; - u8g2->cad_cb = u8x8_cad_001; - u8g2->byte_cb = u8x8_byte_8bit_sw_spi; - u8g2->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; - + u8x8->display_cb = u8x8_d_uc1701_dogs102; + u8x8->cad_cb = u8x8_cad_001; + u8x8->byte_cb = u8x8_byte_8bit_sw_spi; + u8x8->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; + + /* setup display info */ + u8x8_display_Setup(u8x8); } -void u8x8_Setup_SSD1306_128x64_NONAME(u8x8_t *u8g2) +void u8x8_Setup_SSD1306_128x64_NONAME(u8x8_t *u8x8) { /* setup defaults */ - u8x8_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8x8); /* setup specific callbacks */ - u8g2->display_cb = u8x8_d_ssd1306_128x64_noname; - u8g2->cad_cb = u8x8_cad_001; - //u8g2->byte_cb = u8x8_byte_arduino_hw_spi; - u8g2->byte_cb = u8x8_byte_8bit_sw_spi; - u8g2->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; + u8x8->display_cb = u8x8_d_ssd1306_128x64_noname; + u8x8->cad_cb = u8x8_cad_001; + //u8x8->byte_cb = u8x8_byte_arduino_hw_spi; + u8x8->byte_cb = u8x8_byte_8bit_sw_spi; + u8x8->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; + + /* setup display info */ + u8x8_display_Setup(u8x8); } diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 4f973574..05b433c7 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -214,8 +214,11 @@ uint8_t u8x8_d_sdl(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) uint8_t *ptr; switch(msg) { + case U8X8_MSG_DISPLAY_SETUP: + u8x8_d_helper_display_setup(u8g2, &u8x8_sdl_128x64_info); + break; case U8X8_MSG_DISPLAY_INIT: - u8x8_d_helper_display_init(u8g2, &u8x8_sdl_128x64_info); + u8x8_d_helper_display_init(u8g2); u8g_sdl_init(); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: @@ -252,14 +255,16 @@ uint8_t u8x8_d_sdl(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) } -void u8x8_Setup_SDL_128x64(u8x8_t *u8g2) +void u8x8_Setup_SDL_128x64(u8x8_t *u8x8) { /* setup defaults */ - u8x8_SetupDefaults(u8g2); + u8x8_SetupDefaults(u8x8); /* setup specific callbacks */ - u8g2->display_cb = u8x8_d_sdl; - + u8x8->display_cb = u8x8_d_sdl; + + /* setup display info */ + u8x8_display_Setup(u8x8); } void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) @@ -279,60 +284,6 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) u8g2->draw_color = 1; } -void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) -{ - uint8_t *ptr; - uint8_t bit_pos, mask; - uint16_t offset; - ptr = u8g2->tile_buf_ptr; - /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ - bit_pos = y; /* overflow truncate is ok here... */ - bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ - y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ - offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ - offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; - ptr += offset; - ptr += x; - mask = 1; - mask <<= bit_pos; - if ( u8g2->draw_color != 0 ) - { - *ptr |= mask; - } - else - { - mask ^= 255; - *ptr &= mask; - } -} - -/* - x,y Upper left position of the line - len length of the line in pixel, len must not be 0 - dir 0: horizontal line (left to right) - 1: vertical line (top to bottom) -*/ -void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) -{ - if ( dir == 0 ) - { - do - { - u8g2_draw_pixel(u8g2, x, y); - x++; - len--; - } while( len != 0 ); - } - else - { - do - { - u8g2_draw_pixel(u8g2, x, y); - y++; - len--; - } while( len != 0 ); - } -} static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) { From 201742c71fc3378e91ba447d0def5d6a6aed47fb Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 17 Oct 2015 15:38:37 +0200 Subject: [PATCH 053/109] sw architecture --- u8g2/doc/u8g2_software_architecture.odg | Bin 0 -> 12510 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 u8g2/doc/u8g2_software_architecture.odg diff --git a/u8g2/doc/u8g2_software_architecture.odg b/u8g2/doc/u8g2_software_architecture.odg new file mode 100644 index 0000000000000000000000000000000000000000..3b467fb2fff0a97ca85d7364b13ab1bf798cb27f GIT binary patch literal 12510 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 Date: Sat, 17 Oct 2015 16:19:21 +0200 Subject: [PATCH 054/109] u8g2 api --- u8g2/csrc/u8g2_setup.c | 17 +++++++++++++++++ u8g2/csrc/u8x8.h | 7 +++++-- u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 5 ++++- u8g2/sys/sdl/hvline/main.c | 3 ++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 7e192530..62f5c613 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -33,3 +33,20 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) u8g2->buf_y1 += h; } + +/*============================================*/ +void u8g2_draw_l90_r0(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ +} + + + + +/*============================================*/ +const u8g2_cb_t u8g2_cb_r0 = { u8g2_update_dimension_r0, u8g2_draw_l90_r0 }; + + + + + + \ No newline at end of file diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 5ffe4dad..fb988726 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -212,7 +212,7 @@ struct u8g2_cb_struct struct u8g2_struct { u8x8_t u8x8; - u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ + const u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ /* the following variables must be assigned during u8g2 setup */ uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ @@ -473,7 +473,7 @@ void u8x8_SetupStdio(u8x8_t *u8x8); /*==========================================*/ /* u8x8_d_sdl_128x64.c */ void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); -void u8g2_Setup_SDL_128x64(u8g2_t *u8g2); +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); int u8g_sdl_get_key(void); @@ -499,6 +499,9 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len void u8g2_SendBuffer(u8g2_t *u8g2); +/* u8g2_setup.c */ +extern const u8g2_cb_t u8g2_cb_r0; + #ifdef __cplusplus } #endif diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 05b433c7..00218415 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -267,7 +267,7 @@ void u8x8_Setup_SDL_128x64(u8x8_t *u8x8) u8x8_display_Setup(u8x8); } -void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) { static uint8_t buf[128*8]; @@ -282,6 +282,9 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2) u8g2->tile_buf_height = 8; u8g2->tile_curr_row = 0; u8g2->draw_color = 1; + + u8g2->cb = u8g2_cb; + u8g2->cb->update(u8g2); } diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index 1645e2bb..d8ae5fdc 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -56,7 +56,8 @@ u8g2_t u8g2; int main(void) { - u8g2_Setup_SDL_128x64(&u8g2); + u8g2_Setup_SDL_128x64(&u8g2, &u8g2_cb_r0); + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); From a0d3360baa3f1adb73a34f1cedc9b17d3100f1c2 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 17 Oct 2015 23:30:31 +0200 Subject: [PATCH 055/109] hvline clipping --- u8g2/csrc/u8g2_hvline.c | 41 +++++++++++++++++++++++++++++++++++--- u8g2/csrc/u8g2_setup.c | 6 ++++++ u8g2/sys/sdl/hvline/main.c | 2 ++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index d9f73aa5..294ab136 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -5,6 +5,7 @@ */ #include "u8g2.h" +#include void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) @@ -12,6 +13,13 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) uint8_t *ptr; uint8_t bit_pos, mask; uint16_t offset; + + assert(x >= u8g2->buf_x0); + assert(x < u8g2->buf_x1); + assert(y >= u8g2->buf_y0); + assert(y < u8g2->buf_y1); + + ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ bit_pos = y; /* overflow truncate is ok here... */ @@ -40,7 +48,7 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) dir 0: horizontal line (left to right) 1: vertical line (top to bottom) */ -void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { if ( dir == 0 ) { @@ -93,9 +101,36 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin dir 0: horizontal line (left to right) 1: vertical line (top to bottom) */ -void u8g2_ClipAndDrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { - + u8g2_uint_t a; + if ( dir == 0 ) + { + if ( y < u8g2->buf_y0 ) + return; + if ( y >= u8g2->buf_y1 ) + return; + a = x; + a += len; + if ( u8g2_clip_intersection(&x, &a, u8g2->buf_x0, u8g2->buf_x1) == 0 ) + return; + len = a; + len -= x; + } + else + { + if ( x < u8g2->buf_x0 ) + return; + if ( x >= u8g2->buf_x1 ) + return; + a = y; + a += len; + if ( u8g2_clip_intersection(&y, &a, u8g2->buf_y0, u8g2->buf_y1) == 0 ) + return; + len = a; + len -= y; + } + u8g2_draw_hv_line(u8g2, x, y, len, dir); } diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 62f5c613..6cd97406 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -31,6 +31,12 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) u8g2->buf_x1 += w; u8g2->buf_y1 = u8g2->buf_y0; u8g2->buf_y1 += h; + + + /* + printf("x0=%d x1=%d y0=%d y1=%d\n", + u8g2->buf_x0, u8g2->buf_x1, u8g2->buf_y0, u8g2->buf_y1); + */ } diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index d8ae5fdc..ef3109a3 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -67,6 +67,8 @@ int main(void) u8g2_DrawHVLine(&u8g2, 5, 24, 40, 0); u8g2_DrawHVLine(&u8g2, 5, 24, 40, 1); + + u8g2_DrawHVLine(&u8g2, 120, 24, 40, 0); u8g2_SendBuffer(&u8g2); From c38465d7305de7f64b059533bd9169b0b129b6b9 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 18 Oct 2015 12:00:22 +0200 Subject: [PATCH 056/109] clipping --- u8g2/csrc/u8g2_hvline.c | 8 +++++--- u8g2/sys/sdl/hvline/main.c | 12 +++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 294ab136..eef3bb6d 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -74,18 +74,20 @@ static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_u Description: clip range from a (included) to b (excluded) agains c (included) to d (excluded) Assumptions: - a <= b - c <= d + a <= b (also rare, this is checked and 0 is returned) + c <= d (this is not checked) + will return 0 if there is no intersection and if a > b */ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uint_t c, u8g2_uint_t d) { u8g2_uint_t a = *ap; u8g2_uint_t b = *bp; - if ( a >= d ) return 0; if ( b <= c ) return 0; + if ( a > b ) /* this is a very rare case */ + return 0; if ( a < c ) *ap = c; if ( b > d ) diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index ef3109a3..f2726d73 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -68,7 +68,17 @@ int main(void) u8g2_DrawHVLine(&u8g2, 5, 24, 40, 1); - u8g2_DrawHVLine(&u8g2, 120, 24, 40, 0); + /* clipping tests */ + u8g2_DrawHVLine(&u8g2, 60000, 10000, 39, 0); + u8g2_DrawHVLine(&u8g2, 140, 40, 40, 0); + u8g2_DrawHVLine(&u8g2, 120, 41, 40, 0); + u8g2_DrawHVLine(&u8g2, 120, 42, 0xff8f, 0); /* difficult case, something should be drawn, but there is an internal overflow, which just detected */ + u8g2_DrawHVLine(&u8g2, 120, 43, 6, 0); + + u8g2_DrawHVLine(&u8g2, 99, 70, 40, 1); + u8g2_DrawHVLine(&u8g2, 98, 60, 40, 1); + u8g2_DrawHVLine(&u8g2, 97, 60, 0xfff0, 1); /* difficult case, something should be drawn, but there is an internal overflow, which just detected */ + u8g2_DrawHVLine(&u8g2, 96, 60, 3, 1); u8g2_SendBuffer(&u8g2); From 55b747992bd19ff94e8dd68bd6146563fa36626f Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 18 Oct 2015 12:21:33 +0200 Subject: [PATCH 057/109] more clipping --- u8g2/csrc/u8g2_hvline.c | 8 ++++++-- u8g2/sys/sdl/hvline/main.c | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index eef3bb6d..d1f471a8 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -74,7 +74,7 @@ static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_u Description: clip range from a (included) to b (excluded) agains c (included) to d (excluded) Assumptions: - a <= b (also rare, this is checked and 0 is returned) + a <= b (also rare, this is checked) c <= d (this is not checked) will return 0 if there is no intersection and if a > b */ @@ -87,7 +87,11 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin if ( b <= c ) return 0; if ( a > b ) /* this is a very rare case */ - return 0; + { /* there are two options to react: just return 0 or calculate the correct value */ + //return 0; /* just returning 0 is disabled here, instead the correct clipping is done */ + b = d-1; + *bp = b; + } if ( a < c ) *ap = c; if ( b > d ) diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index f2726d73..a1fb8bb6 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -72,12 +72,12 @@ int main(void) u8g2_DrawHVLine(&u8g2, 60000, 10000, 39, 0); u8g2_DrawHVLine(&u8g2, 140, 40, 40, 0); u8g2_DrawHVLine(&u8g2, 120, 41, 40, 0); - u8g2_DrawHVLine(&u8g2, 120, 42, 0xff8f, 0); /* difficult case, something should be drawn, but there is an internal overflow, which just detected */ + u8g2_DrawHVLine(&u8g2, 120, 42, 0xff8f, 0); /* rare case */ u8g2_DrawHVLine(&u8g2, 120, 43, 6, 0); u8g2_DrawHVLine(&u8g2, 99, 70, 40, 1); u8g2_DrawHVLine(&u8g2, 98, 60, 40, 1); - u8g2_DrawHVLine(&u8g2, 97, 60, 0xfff0, 1); /* difficult case, something should be drawn, but there is an internal overflow, which just detected */ + u8g2_DrawHVLine(&u8g2, 97, 60, 0xfff0, 1); /* rare case */ u8g2_DrawHVLine(&u8g2, 96, 60, 3, 1); From 4aaa367507286b45e2d7478021644408281468be Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 18 Oct 2015 13:25:32 +0200 Subject: [PATCH 058/109] handling of more clipping cases --- u8g2/csrc/u8g2_hvline.c | 34 +++++++++++++++++++++++++++------- u8g2/sys/sdl/hvline/main.c | 8 ++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index d1f471a8..f79a3771 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -74,7 +74,7 @@ static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_u Description: clip range from a (included) to b (excluded) agains c (included) to d (excluded) Assumptions: - a <= b (also rare, this is checked) + a <= b (this is checked and handled correctly) c <= d (this is not checked) will return 0 if there is no intersection and if a > b */ @@ -82,20 +82,40 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin { u8g2_uint_t a = *ap; u8g2_uint_t b = *bp; + + /* handle the a>b case correctly. If code and time is critical, this could */ + /* be removed completly (be aware about memory curruption for wrong */ + /* arguments) or return 0 for a>b (will lead to skipped lines for wrong */ + /* arguments) */ + + /* removing the following if clause completly may lead to memory corruption of a>b */ + if ( a > b ) + { + /* replacing this if with a simple "return 0;" will not handle the case with negative a */ + if ( a < d ) + { + b = d; + b--; + *bp = b; + } + else + { + a = 0; + *ap = a; + } + } + + /* from now on, the asumption a <= b is ok */ + if ( a >= d ) return 0; if ( b <= c ) return 0; - if ( a > b ) /* this is a very rare case */ - { /* there are two options to react: just return 0 or calculate the correct value */ - //return 0; /* just returning 0 is disabled here, instead the correct clipping is done */ - b = d-1; - *bp = b; - } if ( a < c ) *ap = c; if ( b > d ) *bp = d; + return 1; } diff --git a/u8g2/sys/sdl/hvline/main.c b/u8g2/sys/sdl/hvline/main.c index a1fb8bb6..e8937ba6 100644 --- a/u8g2/sys/sdl/hvline/main.c +++ b/u8g2/sys/sdl/hvline/main.c @@ -75,6 +75,14 @@ int main(void) u8g2_DrawHVLine(&u8g2, 120, 42, 0xff8f, 0); /* rare case */ u8g2_DrawHVLine(&u8g2, 120, 43, 6, 0); + u8g2_DrawHVLine(&u8g2, 0, 40, 10, 0); + u8g2_DrawHVLine(&u8g2, -2, 41, 5, 0); + u8g2_DrawHVLine(&u8g2, -3, 42, 5, 0); + u8g2_DrawHVLine(&u8g2, -8, 43, 5, 0); + u8g2_DrawHVLine(&u8g2, 0, 44, 10, 0); + + + u8g2_DrawHVLine(&u8g2, 99, 70, 40, 1); u8g2_DrawHVLine(&u8g2, 98, 60, 40, 1); u8g2_DrawHVLine(&u8g2, 97, 60, 0xfff0, 1); /* rare case */ From 35b0aefdb169961584e88e0a10756c0660f4210e Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 18 Oct 2015 13:40:49 +0200 Subject: [PATCH 059/109] handling of more clipping cases --- u8g2/csrc/u8g2_hvline.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index f79a3771..017351a3 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -47,8 +47,10 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) len length of the line in pixel, len must not be 0 dir 0: horizontal line (left to right) 1: vertical line (top to bottom) + asumption: + all clipping done */ -static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { if ( dir == 0 ) { @@ -127,7 +129,7 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin dir 0: horizontal line (left to right) 1: vertical line (top to bottom) */ -void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { u8g2_uint_t a; if ( dir == 0 ) @@ -156,8 +158,31 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len len = a; len -= y; } - u8g2_draw_hv_line(u8g2, x, y, len, dir); + u8g2_unsafe_draw_hv_line(u8g2, x, y, len, dir); } +/* + x,y Upper left position of the line + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) + 2: horizontal line (right to left) + 3: vertical line (bottom to top) +*/ +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + if ( dir == 2 ) + { + x -= len; + x++; + } + else if ( dir == 3 ) + { + y -= len; + y++; + } + dir &= 1; + u8g2_draw_hv_line(u8g2, x, y, len, dir); +} From ebe7d183c4be432a1da8b521ebae5a45f06f972f Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Tue, 20 Oct 2015 19:18:57 +0100 Subject: [PATCH 060/109] Add support for Linux i2c-dev based devices This com drivers used the Linux userspace API to access the I2C bus. Currently it only supports Solomon SSD devices. --- csrc/u8g.h | 7 ++ csrc/u8g_com_linux_ssd_i2c.c | 168 +++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 csrc/u8g_com_linux_ssd_i2c.c diff --git a/csrc/u8g.h b/csrc/u8g.h index 422a48bc..fc92e513 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -707,6 +707,8 @@ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */ +uint8_t u8g_com_linux_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_linux_ssd_i2c.c */ + uint8_t u8g_com_psoc5_ssd_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_spi.c */ uint8_t u8g_com_psoc5_ssd_hw_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_psoc5_ssd_hw_parallel.c */ @@ -865,6 +867,11 @@ defined(__18CXX) || defined(__PIC32MX) #define U8G_COM_SSD_I2C u8g_com_raspberrypi_ssd_i2c_fn #endif #endif +#ifndef U8G_COM_SSD_I2C +#if defined(U8G_LINUX) +#define U8G_COM_SSD_I2C u8g_com_linux_ssd_i2c_fn +#endif +#endif #if defined(U8G_CYPRESS_PSOC5) #define U8G_COM_HW_SPI u8g_com_psoc5_ssd_hw_spi_fn #define U8G_COM_FAST_PARALLEL u8g_com_psoc5_ssd_hw_parallel_fn diff --git a/csrc/u8g_com_linux_ssd_i2c.c b/csrc/u8g_com_linux_ssd_i2c.c new file mode 100644 index 00000000..bd5b735c --- /dev/null +++ b/csrc/u8g_com_linux_ssd_i2c.c @@ -0,0 +1,168 @@ +/* + + u8g_com_linux_ssd_i2c.c + + com interface for linux i2c-dev and the SSDxxxx chip (SOLOMON) variant + I2C protocol + + + Universal 8bit Graphics Library + + Copyright (c) 2012, olikraus@gmail.com + Copyright (c) 2015, daniel@redfelineninja.org.uk + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "u8g.h" + +#if defined(U8G_LINUX) + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + +#define I2C_SLA 0x3c +#define I2C_CMD_MODE 0x80 +#define I2C_DATA_MODE 0x40 +#define MAX_PACKET 64 + +#ifndef U8G_WITH_PINLIST +#error U8G_WITH_PINLIST is mandatory for this driver +#endif + +static void set_cmd_mode(u8g_t *u8g, bool cmd_mode) +{ + u8g->pin_list[U8G_PI_A0_STATE] = cmd_mode; +} + +static bool get_cmd_mode(u8g_t *u8g) +{ + return u8g->pin_list[U8G_PI_A0_STATE]; +} + +static uint8_t send_data_burst(u8g_t *u8g, int fd, uint8_t *buf, size_t buflen) +{ + uint8_t i2cbuf[2*MAX_PACKET]; + uint8_t i2clen; + int res; + + /* ignore bursts when there is no file open */ + if (fd < 0) + return 0; + + if (get_cmd_mode(u8g)) { + i2clen = 0; + while (buflen > 0) { + i2cbuf[i2clen++] = I2C_CMD_MODE; + i2cbuf[i2clen++] = *buf++; + buflen--; + } + } else { + i2cbuf[0] = I2C_DATA_MODE; + memcpy(i2cbuf+1, buf, buflen); + i2clen = buflen + 1; + } + + res = write(fd, i2cbuf, i2clen); + if (res < 0) + fprintf(stderr, "I2C write failed (%s)\n", strerror(errno)); + else if (res != i2clen) + fprintf(stderr, "Incomplete I2C write (%d of %d packet)\n", res, i2clen); + + return res == i2clen; +} + +uint8_t u8g_com_linux_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + static int fd = -1; + char dev[24]; + + switch(msg) + { + case U8G_COM_MSG_INIT: + sprintf(dev, "/dev/i2c-%d", u8g->pin_list[U8G_PI_I2C_OPTION]); + fd = open(dev, O_RDWR); + if (fd < 0) { + fprintf(stderr, "cannot open %s (%s)\n", dev, strerror(errno)); + return 0; + } + + if (ioctl(fd, I2C_SLAVE, I2C_SLA) < 0) { + fprintf(stderr, "cannot set slave address (%s)\n", strerror(errno)); + return 0; + } + + break; + + case U8G_COM_MSG_STOP: + /* ignored - i2c-dev will automatically stop between writes */ + break; + + case U8G_COM_MSG_RESET: + /* ignored - no obvious means to reset an SSD via I2C */ + break; + + case U8G_COM_MSG_CHIP_SELECT: + set_cmd_mode(u8g, true); + break; + + case U8G_COM_MSG_WRITE_BYTE: + send_data_burst(u8g, fd, &arg_val, 1); + break; + + case U8G_COM_MSG_WRITE_SEQ: + case U8G_COM_MSG_WRITE_SEQ_P: /* no progmem in Linux */ + while (arg_val > MAX_PACKET) { + send_data_burst(u8g, fd, arg_ptr, MAX_PACKET); + arg_ptr += MAX_PACKET; + arg_val -= MAX_PACKET; + } + send_data_burst(u8g, fd, arg_ptr, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: + /* choose cmd (arg_val = 0) or data mode (arg_val = 1) */ + set_cmd_mode(u8g, !arg_val); + break; + } + + return 1; +} + +#endif /* U8G_LINUX */ From c72921365531aa3da95074a70cc96ec6992b8b2c Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Tue, 20 Oct 2015 19:27:55 +0100 Subject: [PATCH 061/109] Examples for the recently added i2c-dev driver Tested using u8g_dev_ssd1306_128x64_i2c; looks good. --- sys/i2cdev/chess/Makefile | 1 + sys/i2cdev/chess/chess.c | 86 +++++++++++ sys/i2cdev/common/getch.c | 20 +++ sys/i2cdev/common/init.c | 51 +++++++ sys/i2cdev/common/linux.mk | 14 ++ sys/i2cdev/common/u8g_linux.h | 8 ++ sys/i2cdev/graphics_test/Makefile | 1 + sys/i2cdev/graphics_test/graphics_test.c | 138 ++++++++++++++++++ sys/i2cdev/helloworld/Makefile | 1 + sys/i2cdev/helloworld/helloworld.c | 18 +++ sys/i2cdev/menu/Makefile | 1 + sys/i2cdev/menu/menu.c | 85 +++++++++++ sys/i2cdev/u8g_logo/Makefile | 1 + sys/i2cdev/u8g_logo/u8g_logo.c | 173 +++++++++++++++++++++++ 14 files changed, 598 insertions(+) create mode 100644 sys/i2cdev/chess/Makefile create mode 100644 sys/i2cdev/chess/chess.c create mode 100644 sys/i2cdev/common/getch.c create mode 100644 sys/i2cdev/common/init.c create mode 100644 sys/i2cdev/common/linux.mk create mode 100644 sys/i2cdev/common/u8g_linux.h create mode 100644 sys/i2cdev/graphics_test/Makefile create mode 100644 sys/i2cdev/graphics_test/graphics_test.c create mode 100644 sys/i2cdev/helloworld/Makefile create mode 100644 sys/i2cdev/helloworld/helloworld.c create mode 100644 sys/i2cdev/menu/Makefile create mode 100644 sys/i2cdev/menu/menu.c create mode 100644 sys/i2cdev/u8g_logo/Makefile create mode 100644 sys/i2cdev/u8g_logo/u8g_logo.c diff --git a/sys/i2cdev/chess/Makefile b/sys/i2cdev/chess/Makefile new file mode 100644 index 00000000..893cc67d --- /dev/null +++ b/sys/i2cdev/chess/Makefile @@ -0,0 +1 @@ +include ../common/linux.mk diff --git a/sys/i2cdev/chess/chess.c b/sys/i2cdev/chess/chess.c new file mode 100644 index 00000000..8b74a72f --- /dev/null +++ b/sys/i2cdev/chess/chess.c @@ -0,0 +1,86 @@ +#include +#include + +#include "u8g_linux.h" + + +uint8_t get_key_code(void) +{ + uint8_t chess_key = CHESS_KEY_NONE; + int ch = u8g_linux_getch(); + + switch ( ch ) { + case 'n': + case 274: // arrow down + case 275: // arrow right + chess_key = CHESS_KEY_NEXT; + break; + case 'p': + case 273: // arrow up + case 276: // arrow left + chess_key = CHESS_KEY_PREV; + break; + case ' ': + chess_key = CHESS_KEY_SELECT; + break; + case 'q': + exit(0); + break; + } + return chess_key; +} + +int main(int argc, const char *argv[]) +{ + + uint8_t keyCode = CHESS_KEY_NONE; + uint8_t is_redraw = 1; + + u8g_t u8g; + + u8g_linux_Init(&u8g, argc, argv); + u8g_FirstPage(&u8g); + chess_Init(&u8g, 0); + +#ifdef PERFTEST + chess_Step(CHESS_KEY_SELECT); + chess_Step(CHESS_KEY_NONE); + chess_Step(CHESS_KEY_NEXT); + chess_Step(CHESS_KEY_NONE); + chess_Step(CHESS_KEY_NEXT); + chess_Step(CHESS_KEY_NONE); +#endif + + for(;;) + { + + + if ( is_redraw != 0 ) + { +#ifdef PERFTEST + int i; + for( i = 0; i < 500; i++ ) + { +#endif + u8g_FirstPage(&u8g); + do { + chess_Draw(); + } while( u8g_NextPage(&u8g) ); +#ifdef PERFTEST + } +#endif + is_redraw--; + } +#ifdef PERFTEST + exit(0); +#endif + + keyCode = get_key_code(); + if ( keyCode != CHESS_KEY_NONE ) + { + is_redraw = 2; + chess_Step(keyCode); + } + chess_Step(CHESS_KEY_NONE); + } +} diff --git a/sys/i2cdev/common/getch.c b/sys/i2cdev/common/getch.c new file mode 100644 index 00000000..d138b00c --- /dev/null +++ b/sys/i2cdev/common/getch.c @@ -0,0 +1,20 @@ +#include "u8g_linux.h" + +#include +#include +#include + +int u8g_linux_getch( void ) +{ + int ch; + struct termios oldt, newt; + + tcgetattr ( STDIN_FILENO, &oldt ); + newt = oldt; + newt.c_lflag &= ~( ICANON | ECHO ); + tcsetattr ( STDIN_FILENO, TCSANOW, &newt ); + ch = getchar(); + tcsetattr ( STDIN_FILENO, TCSANOW, &oldt ); + + return ch; +} diff --git a/sys/i2cdev/common/init.c b/sys/i2cdev/common/init.c new file mode 100644 index 00000000..473836bd --- /dev/null +++ b/sys/i2cdev/common/init.c @@ -0,0 +1,51 @@ +/* + + >>> PLEASE UNCOMMENT DISPLAY TYPE IN THE INIT PROCEDURE <<< + +*/ + +#include "u8g_linux.h" + +#include +#include + +void u8g_linux_Init(u8g_t *u8g, int argc, const char *argv[]) +{ + uint8_t ok = 255; + uint8_t i2c_bus; + + if (argc <= 1) { + fprintf(stderr, "Usage: %s I2CBUS\n", argv[0]); + exit(1); + } + + i2c_bus = atoi(argv[1]); + + /* + Please uncomment one of the displays below + Notes: + - "2x": high speed version, which uses more RAM + */ + + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_128x32_2x_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_128x32_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_128x64_2x_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_128x64_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_64x48_2x_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_64x48_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1306_adafruit_128x64_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1309_128x64_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1327_96x96_2x_gr_i2c, i2c_bus); + // ok = u8g_InitI2C(u8g, &u8g_dev_ssd1327_96x96_gr_i2c, i2c_bus); + + /* flip screen, if required */ + // u8g_SetRot180(u8g); + + if (ok == 255) { + fprintf(stderr, "No display driver selected (see src/linux/common/init.c)\n"); + exit(2); + } + + if (!ok) + exit(3); +} diff --git a/sys/i2cdev/common/linux.mk b/sys/i2cdev/common/linux.mk new file mode 100644 index 00000000..85b0e862 --- /dev/null +++ b/sys/i2cdev/common/linux.mk @@ -0,0 +1,14 @@ +CC = gcc +CFLAGS = -g -Wall -I../../../csrc/. -I../common -DU8G_LINUX -DU8G_WITH_PINLIST + +APP = $(notdir $(shell pwd)) +SRC = $(wildcard ../../../csrc/*.c ../../../sfntsrc/*.c ../common/*.c) $(APP).c + +OBJ = $(SRC:.c=.o) + +$(APP): $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $(APP) + +clean: + $(RM) $(OBJ) $(APP) + diff --git a/sys/i2cdev/common/u8g_linux.h b/sys/i2cdev/common/u8g_linux.h new file mode 100644 index 00000000..26c3442b --- /dev/null +++ b/sys/i2cdev/common/u8g_linux.h @@ -0,0 +1,8 @@ +#ifndef U8G_LINUX_H_ + +#include "u8g.h" + +void u8g_linux_Init(u8g_t *u8g, int argc, const char *argv[]); +int u8g_linux_getch(void); + +#endif /* U8G_LINUX_H_ */ diff --git a/sys/i2cdev/graphics_test/Makefile b/sys/i2cdev/graphics_test/Makefile new file mode 100644 index 00000000..893cc67d --- /dev/null +++ b/sys/i2cdev/graphics_test/Makefile @@ -0,0 +1 @@ +include ../common/linux.mk diff --git a/sys/i2cdev/graphics_test/graphics_test.c b/sys/i2cdev/graphics_test/graphics_test.c new file mode 100644 index 00000000..1ed50c03 --- /dev/null +++ b/sys/i2cdev/graphics_test/graphics_test.c @@ -0,0 +1,138 @@ +/* + + graphics_test.c + + Linux U8glib Example + + Universal 8bit Graphics Library + + Copyright (c) 2013, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "u8g_linux.h" + + +/*========================================================================*/ +/* main */ + +u8g_t u8g; + +void u8g_prepare(void) { + u8g_SetFont(&u8g, u8g_font_6x10); + u8g_SetFontRefHeightExtendedText(&u8g); + u8g_SetDefaultForegroundColor(&u8g); + u8g_SetFontPosTop(&u8g); +} + +void u8g_box_frame(uint8_t a) { + u8g_DrawStr(&u8g, 0, 0, "drawBox"); + u8g_DrawBox(&u8g, 5,10,20,10); + u8g_DrawBox(&u8g, 10+a,15,30,7); + u8g_DrawStr(&u8g, 0, 30, "drawFrame"); + u8g_DrawFrame(&u8g, 5,10+30,20,10); + u8g_DrawFrame(&u8g, 10+a,15+30,30,7); +} + +void u8g_string(uint8_t a) { + u8g_DrawStr(&u8g, 30+a,31, " 0"); + u8g_DrawStr90(&u8g, 30,31+a, " 90"); + u8g_DrawStr180(&u8g, 30-a,31, " 180"); + u8g_DrawStr270(&u8g, 30,31-a, " 270"); +} + +void u8g_line(uint8_t a) { + u8g_DrawStr(&u8g, 0, 0, "drawLine"); + u8g_DrawLine(&u8g, 7+a, 10, 40, 55); + u8g_DrawLine(&u8g, 7+a*2, 10, 60, 55); + u8g_DrawLine(&u8g, 7+a*3, 10, 80, 55); + u8g_DrawLine(&u8g, 7+a*4, 10, 100, 55); +} + +void u8g_ascii_1(void) { + char s[2] = " "; + uint8_t x, y; + u8g_DrawStr(&u8g, 0, 0, "ASCII page 1"); + for( y = 0; y < 6; y++ ) { + for( x = 0; x < 16; x++ ) { + s[0] = y*16 + x + 32; + u8g_DrawStr(&u8g, x*7, y*10+10, s); + } + } +} + +void u8g_ascii_2(void) { + char s[2] = " "; + uint8_t x, y; + u8g_DrawStr(&u8g, 0, 0, "ASCII page 2"); + for( y = 0; y < 6; y++ ) { + for( x = 0; x < 16; x++ ) { + s[0] = y*16 + x + 160; + u8g_DrawStr(&u8g, x*7, y*10+10, s); + } + } +} + + +uint8_t draw_state = 0; + +void draw(void) { + u8g_prepare(); + switch(draw_state >> 3) { + case 0: u8g_box_frame(draw_state&7); break; + case 1: u8g_string(draw_state&7); break; + case 2: u8g_line(draw_state&7); break; + case 3: u8g_ascii_1(); break; + case 4: u8g_ascii_2(); break; + } +} + + +int main(int argc, const char *argv[]) +{ + u8g_linux_Init(&u8g, argc, argv); + + for(;;) + { + /* picture loop */ + u8g_FirstPage(&u8g); + do + { + draw(); + } while ( u8g_NextPage(&u8g) ); + + draw_state++; + if ( draw_state >= 5*8 ) + draw_state = 0; + + /* refresh screen after some delay */ + u8g_Delay(100); + + } +} + diff --git a/sys/i2cdev/helloworld/Makefile b/sys/i2cdev/helloworld/Makefile new file mode 100644 index 00000000..893cc67d --- /dev/null +++ b/sys/i2cdev/helloworld/Makefile @@ -0,0 +1 @@ +include ../common/linux.mk diff --git a/sys/i2cdev/helloworld/helloworld.c b/sys/i2cdev/helloworld/helloworld.c new file mode 100644 index 00000000..378d78d0 --- /dev/null +++ b/sys/i2cdev/helloworld/helloworld.c @@ -0,0 +1,18 @@ +#include "u8g_linux.h" + +int main(int argc, const char *argv[]) +{ + u8g_t u8g; + + u8g_linux_Init(&u8g, argc, argv); + u8g_FirstPage(&u8g); + + do + { + u8g_SetFont(&u8g, u8g_font_unifont); + u8g_DrawStr(&u8g, 0, 20, argc > 2 ? argv[2] : "Hello World!"); + } while( u8g_NextPage(&u8g) ); + + return 0; +} + diff --git a/sys/i2cdev/menu/Makefile b/sys/i2cdev/menu/Makefile new file mode 100644 index 00000000..893cc67d --- /dev/null +++ b/sys/i2cdev/menu/Makefile @@ -0,0 +1 @@ +include ../common/linux.mk diff --git a/sys/i2cdev/menu/menu.c b/sys/i2cdev/menu/menu.c new file mode 100644 index 00000000..b8495317 --- /dev/null +++ b/sys/i2cdev/menu/menu.c @@ -0,0 +1,85 @@ +#include +#include + +#include "u8g_linux.h" + +u8g_t u8g; + +#define MENU_ITEMS 4 +char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" }; + + +uint8_t menu_current = 0; +uint8_t menu_redraw_required = 0; + + +void draw_menu(void) +{ + uint8_t i, h; + u8g_uint_t w, d; + + u8g_SetFont(&u8g, u8g_font_6x13); + u8g_SetFontRefHeightText(&u8g); + u8g_SetFontPosTop(&u8g); + + h = u8g_GetFontAscent(&u8g)-u8g_GetFontDescent(&u8g); + w = u8g_GetWidth(&u8g); + for( i = 0; i < MENU_ITEMS; i++ ) + { + d = (w-u8g_GetStrWidth(&u8g, menu_strings[i]))/2; + u8g_SetDefaultForegroundColor(&u8g); + if ( i == menu_current ) + { + u8g_DrawBox(&u8g, 0, i*h+1, w, h); + u8g_SetDefaultBackgroundColor(&u8g); + } + u8g_DrawStr(&u8g, d, i*h, menu_strings[i]); + } +} + +void update_menu(void) +{ + switch ( u8g_linux_getch() ) + { + case 'n': + menu_current++; + if ( menu_current >= MENU_ITEMS ) + menu_current = 0; + menu_redraw_required = 1; + break; + case 'p': + if ( menu_current == 0 ) + menu_current = MENU_ITEMS; + menu_current--; + menu_redraw_required = 1; + break; + case 'q': + exit(0); + } +} + + +int main(int argc, const char *argv[]) +{ + u8g_linux_Init(&u8g, argc, argv); + + menu_redraw_required = 1; + + for(;;) + { + + if ( menu_redraw_required != 0 ) + { + u8g_FirstPage(&u8g); + do + { + draw_menu(); + } while( u8g_NextPage(&u8g) ); + menu_redraw_required = 0; + } + + update_menu(); + } + +} + diff --git a/sys/i2cdev/u8g_logo/Makefile b/sys/i2cdev/u8g_logo/Makefile new file mode 100644 index 00000000..893cc67d --- /dev/null +++ b/sys/i2cdev/u8g_logo/Makefile @@ -0,0 +1 @@ +include ../common/linux.mk diff --git a/sys/i2cdev/u8g_logo/u8g_logo.c b/sys/i2cdev/u8g_logo/u8g_logo.c new file mode 100644 index 00000000..c1eda919 --- /dev/null +++ b/sys/i2cdev/u8g_logo/u8g_logo.c @@ -0,0 +1,173 @@ +/* + + u8g_logo.c + + Linux U8glib Example + + Universal 8bit Graphics Library + + Copyright (c) 2013, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "u8g_linux.h" + +u8g_t u8g; + +/* select, which color background to use */ +#define COLOR_BOX draw_color_box2 + +void draw_color_box1(void) +{ + u8g_uint_t w,h; + u8g_uint_t r, g, b; + + w = u8g_GetWidth(&u8g)/64; + h = u8g_GetHeight(&u8g)/32; + for( b = 0; b < 4; b++ ) + for( g = 0; g < 16; g++ ) + for( r = 0; r < 32; r++ ) + { + u8g_SetRGB(&u8g, r<<3, g<<4, b<<6); + u8g_DrawBox(&u8g, g*w + b*w*16, r*h, w, h); + + } +} + +void draw_color_box2(void) +{ + u8g_uint_t w,h; + u8g_uint_t r, g, b; + + b = 1; + + w = u8g_GetWidth(&u8g)/64; + h = u8g_GetHeight(&u8g)/32; + for( g = 0; g < 16; g++ ) + for( r = 0; r < 32; r++ ) + { + u8g_SetRGB(&u8g, r<<3, g<<4, b<<6); + u8g_DrawBox(&u8g, g*w + 0*w*16, r*h, w, h); + u8g_DrawBox(&u8g, (16-1-g)*w + 1*w*16, r*h, w, h); + u8g_DrawBox(&u8g, g*w + 2*w*16, r*h, w, h); + u8g_DrawBox(&u8g, (16-1-g)*w + 3*w*16, r*h, w, h); + + } +} + +void draw_color_box3(void) +{ + u8g_uint_t r, g, b; + /* assumes 128x128 display */ + for( b = 0; b < 4; b++ ) + { + for( g = 0; g < 32; g++ ) + { + for( r = 0; r < 32; r++ ) + { + u8g_SetRGB(&u8g, r<<3, g<<3, b<<4 ); + u8g_DrawPixel(&u8g, g + b*32, r); + u8g_SetRGB(&u8g, r<<3, g<<3, (b<<4)+64 ); + u8g_DrawPixel(&u8g, g + b*32, r+32); + u8g_SetRGB(&u8g, r<<3, g<<3, (b<<4)+128 ); + u8g_DrawPixel(&u8g, g + b*32, r+32+32); + u8g_SetRGB(&u8g, r<<3, g<<3, (b<<4)+128+64 ); + u8g_DrawPixel(&u8g, g + b*32, r+32+32+32); + } + } + } +} + + +void draw_logo(uint8_t d) +{ + u8g_SetFont(&u8g, u8g_font_gdr25r); + u8g_DrawStr(&u8g, 0+d, 30+d, "U"); + u8g_SetFont(&u8g, u8g_font_gdr30n); + u8g_DrawStr90(&u8g, 23+d,10+d,"8"); + u8g_SetFont(&u8g, u8g_font_gdr25r); + u8g_DrawStr(&u8g, 53+d,30+d,"g"); + + u8g_DrawHLine(&u8g, 2+d, 35+d, 47); + u8g_DrawVLine(&u8g, 45+d, 32+d, 12); +} + +void draw_url(void) +{ + u8g_SetFont(&u8g, u8g_font_4x6); + if ( u8g_GetHeight(&u8g) < 59 ) + { + u8g_DrawStr(&u8g, 53,9,"code.google.com"); + u8g_DrawStr(&u8g, 77,18,"/p/u8glib"); + } + else + { + u8g_DrawStr(&u8g, 1,54,"code.google.com/p/u8glib"); + } +} + + +void draw(void) +{ + if ( u8g_GetMode(&u8g) == U8G_MODE_HICOLOR || u8g_GetMode(&u8g) == U8G_MODE_R3G3B2) + { + COLOR_BOX(); + } + if ( u8g_GetMode(&u8g) == U8G_MODE_HICOLOR || u8g_GetMode(&u8g) == U8G_MODE_R3G3B2) + { + u8g_SetRGB(&u8g, 0x080, 0x040, 0); + draw_logo(2); + u8g_SetRGB(&u8g, 0x080, 0x080, 0); + draw_logo(1); + u8g_SetRGB(&u8g, 0x0ff, 0x0ff, 0); + } + else + { + u8g_SetColorIndex(&u8g, 1); + if ( U8G_MODE_GET_BITS_PER_PIXEL(u8g_GetMode(&u8g)) > 1 ) + { + draw_logo(2); + u8g_SetColorIndex(&u8g, 2); + draw_logo(1); + u8g_SetColorIndex(&u8g, 3); + } + } + draw_logo(0); + draw_url(); +} + +int main(int argc, const char *argv[]) +{ + u8g_linux_Init(&u8g, argc, argv); + u8g_FirstPage(&u8g); + do + { + draw(); + } while ( u8g_NextPage(&u8g) ); +} + From 5d94e38a78026e2fbbec6b65903bafbb52c655fe Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Tue, 20 Oct 2015 19:32:24 +0100 Subject: [PATCH 062/109] Fix calls to u8g_DrawStr() (remove fourth argument) Without this change it is not possible to compile the examples. --- sys/stdout/helloworld/main.c | 2 +- sys/stdout/rotation/main.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/stdout/helloworld/main.c b/sys/stdout/helloworld/main.c index 346a353f..6c62c66e 100644 --- a/sys/stdout/helloworld/main.c +++ b/sys/stdout/helloworld/main.c @@ -18,7 +18,7 @@ int main(void) u8g_SetFont(&u8g, u8g_font_10x20); w = u8g_GetFontBBXWidth(&u8g); h = u8g_GetFontBBXHeight(&u8g); - u8g_DrawStr(&u8g, 0, h, 0, "ABCgdef"); + u8g_DrawStr(&u8g, 0, h, "ABCgdef"); //u8g_DrawStr(&u8g, 0, 5, 0, "g"); //u8g_DrawStr(&u8g, 10, 7, 0, "g"); //u8g_DrawStr(&u8g, 20, 9, 0, "g"); diff --git a/sys/stdout/rotation/main.c b/sys/stdout/rotation/main.c index 2899ec17..2aef616f 100644 --- a/sys/stdout/rotation/main.c +++ b/sys/stdout/rotation/main.c @@ -18,8 +18,8 @@ int main(void) u8g_SetFont(&u8g, u8g_font_10x20); w = u8g_GetFontBBXWidth(&u8g); h = u8g_GetFontBBXHeight(&u8g); - u8g_DrawStr(&u8g, 0, h, 0, "A"); - u8g_DrawStr(&u8g, 10, h, 1, "B"); + u8g_DrawStr(&u8g, 0, h, "A"); + u8g_DrawStr(&u8g, 10, h, "B"); u8g_DrawFrame(&u8g, 2, 2, 9, 3); u8g_DrawFrame(&u8g, 0, 0, 13, 7); From a7209c1c66d24bfd347a8577e8bad6a45895216a Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Tue, 20 Oct 2015 19:32:55 +0100 Subject: [PATCH 063/109] Increase the fonts compiled and linked. Without this the example cannot be linked (chess engine has missing dependancies). --- sys/stdout/rotation/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/stdout/rotation/Makefile b/sys/stdout/rotation/Makefile index dd204f5d..387c2b19 100755 --- a/sys/stdout/rotation/Makefile +++ b/sys/stdout/rotation/Makefile @@ -2,7 +2,7 @@ CFLAGS = -g -Wall -I../../../csrc/. -DU8G_16BIT #CFLAGS = -g -Wall -I../../../src/. -SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../../../fntsrc/u8g_font_10x20*.c) $(shell ls ../dev/u8g*.c) main.c +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../../../fntsrc/*.c) $(shell ls ../dev/u8g*.c) main.c OBJ = $(SRC:.c=.o) From 991a8ab13a27f20f7ed244210e356f0e03218f40 Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 20 Oct 2015 23:43:47 +0200 Subject: [PATCH 064/109] l90 --- u8g2/csrc/u8g2_hvline.c | 5 +++++ u8g2/csrc/u8g2_setup.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 017351a3..fa63c333 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -186,3 +186,8 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len } +void u8g2_DrawL90(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + u8g2->cb->draw_l90(u8g2, x, y, len, dir); +} + diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 6cd97406..4b78b6b4 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -43,6 +43,8 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) /*============================================*/ void u8g2_draw_l90_r0(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { + u8g2_DrawHVLine(u8g2, x, y, len, dir); + } From 97ce16410730870c38e2d6490ff951efaf923774 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 21 Oct 2015 21:13:08 +0200 Subject: [PATCH 065/109] include callback to hvline --- u8g2/csrc/u8g2_hvline.c | 20 +++++++++---- u8g2/csrc/u8g2_setup.c | 6 ++-- u8g2/csrc/u8x8.h | 62 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index fa63c333..5e458d5c 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -128,8 +128,10 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin len length of the line in pixel, len must not be 0 dir 0: horizontal line (left to right) 1: vertical line (top to bottom) + This function will clip the line and call u8g2_unsafe_draw_hv_line() + */ -static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +static void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { u8g2_uint_t a; if ( dir == 0 ) @@ -168,8 +170,11 @@ static void u8g2_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_u 1: vertical line (top to bottom) 2: horizontal line (right to left) 3: vertical line (bottom to top) + + This function will remove directions 2 and 3. Instead 0 and 1 are used. + */ -void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { if ( dir == 2 ) { @@ -182,12 +187,17 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len y++; } dir &= 1; - u8g2_draw_hv_line(u8g2, x, y, len, dir); + u8g2_draw_hv_line_2dir(u8g2, x, y, len, dir); } - -void u8g2_DrawL90(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +/* + This is the toplevel function for the hv line draw procedures. + This function should be called by the user. +*/ +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { + /* Make a call the the callback function. The callback may rotate the hv line */ + /* after rotation this will call u8g2_draw_hv_line_4dir() */ u8g2->cb->draw_l90(u8g2, x, y, len, dir); } diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 4b78b6b4..8169d99d 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -41,10 +41,12 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) /*============================================*/ +extern void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); + + void u8g2_draw_l90_r0(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { - u8g2_DrawHVLine(u8g2, x, y, len, dir); - + u8g2_draw_hv_line_4dir(u8g2, x, y, len, dir); } diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index fb988726..258e25e1 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -201,6 +201,59 @@ struct u8x8_struct uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; +/* from ucglib... */ +struct _u8g2_font_info_t +{ + /* offset 0 */ + uint8_t glyph_cnt; + uint8_t bbx_mode; + uint8_t bits_per_0; + uint8_t bits_per_1; + + /* offset 4 */ + uint8_t bits_per_char_width; + uint8_t bits_per_char_height; + uint8_t bits_per_char_x; + uint8_t bits_per_char_y; + uint8_t bits_per_delta_x; + + /* offset 9 */ + int8_t max_char_width; + int8_t max_char_height; /* overall height, NOT ascent. Instead ascent = max_char_height + y_offset */ + int8_t x_offset; + int8_t y_offset; + + /* offset 13 */ + int8_t ascent_A; + int8_t descent_g; + int8_t ascent_para; + int8_t descent_para; + + /* offset 17 */ + uint16_t start_pos_upper_A; + uint16_t start_pos_lower_a; +}; +typedef struct _u8g2_font_info_t u8g2_font_info_t; + +/* from ucglib... */ +struct _u8g2_font_decode_t +{ + const uint8_t *decode_ptr; /* pointer to the compressed data */ + + ucg_int_t target_x; + ucg_int_t target_y; + + int8_t x; /* local coordinates, (0,0) is upper left */ + int8_t y; + int8_t glyph_width; + int8_t glyph_height; + + uint8_t decode_bit_pos; /* bitpos inside a byte of the compressed data */ + uint8_t is_transparent; + uint8_t dir; /* direction */ +}; +typedef struct _u8g2_font_decode_t u8g2_font_decode_t; + struct u8g2_cb_struct { @@ -208,6 +261,8 @@ struct u8g2_cb_struct u8g2_draw_l90_cb draw_l90; }; +typedef u8g2_uint_t (*u8g2_font_calc_vref_fnptr)(u8g2_t *u8g2); + struct u8g2_struct { @@ -224,6 +279,13 @@ struct u8g2_struct u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ u8g2_uint_t buf_y0; u8g2_uint_t buf_y1; + + /* information about the current font */ + const unsigned char *font; /* current font for all text procedures */ + u8g2_font_calc_vref_fnptr font_calc_vref; + u8g2_font_decode_t font_decode; /* new font decode structure */ + u8g2_font_info_t font_info; /* new font info structure */ + uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ }; From 5a2e6d5dede53d4e453a6489a99423bdd8c12215 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 21 Oct 2015 21:15:47 +0200 Subject: [PATCH 066/109] font preparation / cb call --- u8g2/csrc/u8g2_hvline.c | 1 + u8g2/csrc/u8g2_setup.c | 1 + u8g2/csrc/u8x8.h | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 5e458d5c..219d6edd 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -8,6 +8,7 @@ #include + void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { uint8_t *ptr; diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 8169d99d..75932f30 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -3,6 +3,7 @@ u8g2_setup.c */ + #include "u8g2.h" diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 258e25e1..b33bb5e2 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -240,8 +240,8 @@ struct _u8g2_font_decode_t { const uint8_t *decode_ptr; /* pointer to the compressed data */ - ucg_int_t target_x; - ucg_int_t target_y; + u8g2_uint_t target_x; + u8g2_uint_t target_y; int8_t x; /* local coordinates, (0,0) is upper left */ int8_t y; From 5539f03b4c7d81b02dab33e07a39f79ed7615950 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 21 Oct 2015 22:03:02 +0200 Subject: [PATCH 067/109] u8g2 font --- u8g2/csrc/u8g2.h | 10 + u8g2/csrc/u8g2_font.c | 729 ++++++++++++++++++++++++++++++++++++++++++ u8g2/csrc/u8x8.h | 5 +- 3 files changed, 743 insertions(+), 1 deletion(-) create mode 100644 u8g2/csrc/u8g2_font.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index ce55f64f..64b302a0 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -25,6 +25,16 @@ #include "u8x8.h" +#ifdef __GNUC__ +# define U8G2_NOINLINE __attribute__((noinline)) +#else +# define U8G2_NOINLINE +#endif + +#define U8G2_FONT_HEIGHT_MODE_TEXT 0 +#define U8G2_FONT_HEIGHT_MODE_XTEXT 1 +#define U8G2_FONT_HEIGHT_MODE_ALL 2 + diff --git a/u8g2/csrc/u8g2_font.c b/u8g2/csrc/u8g2_font.c new file mode 100644 index 00000000..ce9d9ea3 --- /dev/null +++ b/u8g2/csrc/u8g2_font.c @@ -0,0 +1,729 @@ +/* + + u8g2_font.c + +*/ + +#include "u8g2.h" + +/* size of the font data structure, there is no struct or class... */ +/* this is the size for the new font format */ +#define U8G2_FONT_DATA_STRUCT_SIZE 21 + +/* + font data: + + offset bytes description + 0 1 glyph_cnt number of glyphs + 1 1 bbx_mode 0: proportional, 1: common height, 2: monospace, 3: multiple of 8 + 2 1 bits_per_0 glyph rle parameter + 3 1 bits_per_1 glyph rle parameter + + 4 1 bits_per_char_width glyph rle parameter + 5 1 bits_per_char_height glyph rle parameter + 6 1 bits_per_char_x glyph rle parameter + 7 1 bits_per_char_y glyph rle parameter + 8 1 bits_per_delta_x glyph rle parameter + + 9 1 max_char_width + 10 1 max_char_height + 11 1 x offset + 12 1 y offset (descent) + + 13 1 ascent (capital A) + 14 1 descent (lower g) + 15 1 ascent '(' + 16 1 descent ')' + + 17 1 start pos 'A' high byte + 18 1 start pos 'A' low byte + + 19 1 start pos 'a' high byte + 20 1 start pos 'a' low byte + + Font build mode, 0: proportional, 1: common height, 2: monospace, 3: multiple of 8 + + Font build mode 0: + - "t" + - Ref height mode: U8G2_FONT_HEIGHT_MODE_TEXT, U8G2_FONT_HEIGHT_MODE_XTEXT or U8G2_FONT_HEIGHT_MODE_ALL + - use in transparent mode only (does not look good in solid mode) + - most compact format + - different font heights possible + + Font build mode 1: + - "h" + - Ref height mode: U8G2_FONT_HEIGHT_MODE_ALL + - transparent or solid mode + - The height of the glyphs depend on the largest glyph in the font. This means font height depends on postfix "r", "f" and "n". + +*/ + +/* use case: What is the width and the height of the minimal box into which string s fints? */ +void u8g2_font_GetStrSize(const void *font, const char *s, u8g2_uint_t *width, u8g2_uint_t *height); +void u8g2_font_GetStrSizeP(const void *font, const char *s, u8g2_uint_t *width, u8g2_uint_t *height); + +/* use case: lower left edge of a minimal box is known, what is the correct x, y position for the string draw procedure */ +void u8g2_font_AdjustXYToDraw(const void *font, const char *s, u8g2_uint_t *x, u8g2_uint_t *y); +void u8g2_font_AdjustXYToDrawP(const void *font, const char *s, u8g2_uint_t *x, u8g2_uint_t *y); + +/* use case: Baseline origin known, return minimal box */ +void u8g2_font_GetStrMinBox(u8g2_t *u8g2, const void *font, const char *s, u8g2_uint_t *x, u8g2_uint_t *y, u8g2_uint_t *width, u8g2_uint_t *height); + +/* procedures */ + +/*========================================================================*/ +/* low level byte and word access */ + +/* removed NOINLINE, because it leads to smaller code, might also be faster */ +//static uint8_t u8g2_font_get_byte(const uint8_t *font, uint8_t offset) U8G2_NOINLINE; +static uint8_t u8g2_font_get_byte(const uint8_t *font, uint8_t offset) +{ + font += offset; + return u8x8_pgm_read( (uint8_t *)font ); +} + +static uint16_t u8g2_font_get_word(const uint8_t *font, uint8_t offset) U8G2_NOINLINE; +static uint16_t u8g2_font_get_word(const uint8_t *font, uint8_t offset) +{ + uint16_t pos; + font += offset; + pos = u8x8_pgm_read( (uint8_t *)font ); + font++; + pos <<= 8; + pos += u8x8_pgm_read( (uint8_t *)font); + return pos; +} + +/*========================================================================*/ +/* new font format */ +void u8g2_read_font_info(u8g2_font_info_t *font_info, const uint8_t *font) +{ + /* offset 0 */ + font_info->glyph_cnt = u8g2_font_get_byte(font, 0); + font_info->bbx_mode = u8g2_font_get_byte(font, 1); + font_info->bits_per_0 = u8g2_font_get_byte(font, 2); + font_info->bits_per_1 = u8g2_font_get_byte(font, 3); + + /* offset 4 */ + font_info->bits_per_char_width = u8g2_font_get_byte(font, 4); + font_info->bits_per_char_height = u8g2_font_get_byte(font, 5); + font_info->bits_per_char_x = u8g2_font_get_byte(font, 6); + font_info->bits_per_char_y = u8g2_font_get_byte(font, 7); + font_info->bits_per_delta_x = u8g2_font_get_byte(font, 8); + + /* offset 9 */ + font_info->max_char_width = u8g2_font_get_byte(font, 9); + font_info->max_char_height = u8g2_font_get_byte(font, 10); + font_info->x_offset = u8g2_font_get_byte(font, 11); + font_info->y_offset = u8g2_font_get_byte(font, 12); + + /* offset 13 */ + font_info->ascent_A = u8g2_font_get_byte(font, 13); + font_info->descent_g = u8g2_font_get_byte(font, 14); + font_info->ascent_para = u8g2_font_get_byte(font, 15); + font_info->descent_para = u8g2_font_get_byte(font, 16); + + /* offset 17 */ + font_info->start_pos_upper_A = u8g2_font_get_word(font, 17); + font_info->start_pos_lower_a = u8g2_font_get_word(font, 19); +} + + +/* calculate the overall length of the font, only used to create the picture for the google wiki */ +size_t u8g2_font_GetSize(const void *font_arg) +{ + const uint8_t *font = font_arg; + font += U8G2_FONT_DATA_STRUCT_SIZE; + + for(;;) + { + if ( u8x8_pgm_read( ((uint8_t *)font) + 1 ) == 0 ) + break; + font += u8x8_pgm_read( ((uint8_t *)font) + 1 ); + } + + return (font - (const uint8_t *)font_arg) + 2; + +} + +/*========================================================================*/ +/* u8g2 interface, font access */ + +uint8_t u8g2_GetFontBBXWidth(u8g2_t *u8g2) +{ + return u8g2->font_info.max_char_width; /* new font info structure */ +} + +uint8_t u8g2_GetFontBBXHeight(u8g2_t *u8g2) +{ + return u8g2->font_info.max_char_height; /* new font info structure */ +} + +int8_t u8g_GetFontBBXOffX(u8g2_t *u8g2) U8G2_NOINLINE; +int8_t u8g_GetFontBBXOffX(u8g2_t *u8g2) +{ + return u8g2->font_info.x_offset; /* new font info structure */ +} + +int8_t u8g2_GetFontBBXOffY(u8g2_t *u8g2) U8G2_NOINLINE; +int8_t u8g2_GetFontBBXOffY(u8g2_t *u8g2) +{ + return u8g2->font_info.y_offset; /* new font info structure */ +} + +uint8_t u8g2_GetFontCapitalAHeight(u8g2_t *u8g2) U8G2_NOINLINE; +uint8_t u8g2_GetFontCapitalAHeight(u8g2_t *u8g2) +{ + return u8g2->font_info.ascent_A; /* new font info structure */ +} + +/*========================================================================*/ +/* glyph handling */ + +/* optimized */ +uint8_t u8g2_font_decode_get_unsigned_bits(u8g2_font_decode_t *f, uint8_t cnt) +{ + uint8_t val; + uint8_t bit_pos = f->decode_bit_pos; + uint8_t bit_pos_plus_cnt; + + //val = *(f->decode_ptr); + val = u8x8_pgm_read( (uint8_t *)(f->decode_ptr) ); + + val >>= bit_pos; + bit_pos_plus_cnt = bit_pos; + bit_pos_plus_cnt += cnt; + if ( bit_pos_plus_cnt >= 8 ) + { + uint8_t s = 8; + s -= bit_pos; + f->decode_ptr++; + //val |= *(f->decode_ptr) << (8-bit_pos); + val |= u8x8_pgm_read( (uint8_t *)(f->decode_ptr) ) << (s); + //bit_pos -= 8; + bit_pos_plus_cnt -= 8; + } + val &= (1U<decode_bit_pos = bit_pos_plus_cnt; + return val; +} + + +/* + 2 bit --> cnt = 2 + -2,-1,0. 1 + + 3 bit --> cnt = 3 + -2,-1,0. 1 + -4,-3,-2,-1,0,1,2,3 + + if ( x < 0 ) + r = bits(x-1)+1; + else + r = bits(x)+1; + +*/ +/* optimized */ +int8_t u8g2_font_decode_get_signed_bits(u8g2_font_decode_t *f, uint8_t cnt) +{ + int8_t v, d; + v = (int8_t)u8g2_font_decode_get_unsigned_bits(f, cnt); + d = 1; + cnt--; + d <<= cnt; + v -= d; + return v; + //return (int8_t)u8g2_font_decode_get_unsigned_bits(f, cnt) - ((1<>1); +} + + +static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; +static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) +{ + switch(dir) + { + case 0: + dy += y; + break; + case 1: + dy += x; + break; + case 2: + dy -= y; + break; + default: + dy -= x; + break; + } + return dy; +} + +static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; +static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) +{ + switch(dir) + { + case 0: + dx += x; + break; + case 1: + dx -= y; + break; + case 2: + dx -= x; + break; + default: + dx += y; + break; + } + return dx; +} + + + +/* + Description: + Draw a run-length area of the glyph. "len" can have any size and the line + length has to be wrapped at the glyph border. + Args: + len: Length of the line + is_foreground foreground/background? + u8g2->font_decode.target_x X position + u8g2->font_decode.target_y Y position + u8g2->font_decode.is_transparent Transparent mode + Return: + - + Calls: + u8g2_Draw90Line() + Called by: + u8g2_font_decode_glyph() +*/ +/* optimized */ +void u8g2_font_decode_len(u8g2_t *u8g2, uint8_t len, uint8_t is_foreground) +{ + uint8_t cnt; /* total number of remaining pixels, which have to be drawn */ + uint8_t rem; /* remaining pixel to the right edge of the glyph */ + uint8_t current; /* number of pixels, which need to be drawn for the draw procedure */ + /* current is either equal to cnt or equal to rem */ + + /* local coordinates of the glyph */ + uint8_t lx,ly; + + /* target position on the screen */ + u8g2_uint_t x, y; + + u8g2_font_decode_t *decode = &(u8g2->font_decode); + + cnt = len; + + /* get the local position */ + lx = decode->x; + ly = decode->y; + + for(;;) + { + /* calculate the number of pixel to the right edge of the glyph */ + rem = decode->glyph_width; + rem -= lx; + + /* calculate how many pixel to draw. This is either to the right edge */ + /* or lesser, if not enough pixel are left */ + current = rem; + if ( cnt < rem ) + current = cnt; + + + /* now draw the line, but apply the rotation around the glyph target position */ + //u8g2_font_decode_draw_pixel(u8g2, lx,ly,current, is_foreground); + + /* get target position */ + x = decode->target_x; + y = decode->target_y; + + /* apply rotation */ + x = u8g2_add_vector_x(x, lx, ly, decode->dir); + y = u8g2_add_vector_y(y, lx, ly, decode->dir); + + /* draw foreground and background (if required) */ + if ( is_foreground ) + { + u8g2->draw_color = 1; /* Fix me: Must be the glyph color (additional variable) */ + u8g2_DrawHVLine(u8g2, + x, + y, + current, + /* dir */ decode->dir); + } + else if ( decode->is_transparent == 0 ) + { + u8g2->draw_color = 0; /* Fix me: Must be the complement of the glyph color (additional variable) */ + u8g2_DrawHVLine(u8g2, + x, + y, + current, + /* dir */ decode->dir); + } + + /* check, whether the end of the run length code has been reached */ + if ( cnt < rem ) + break; + cnt -= rem; + lx = 0; + ly++; + } + lx += cnt; + + decode->x = lx; + decode->y = ly; + +} + +static void u8g2_font_setup_decode(u8g2_t *u8g2, const uint8_t *glyph_data) +{ + u8g2_font_decode_t *decode = &(u8g2->font_decode); + decode->decode_ptr = glyph_data; + decode->decode_bit_pos = 0; + + decode->decode_ptr += 1; + decode->decode_ptr += 1; + + decode->glyph_width = u8g2_font_decode_get_unsigned_bits(decode, u8g2->font_info.bits_per_char_width); + decode->glyph_height = u8g2_font_decode_get_unsigned_bits(decode,u8g2->font_info.bits_per_char_height); +} + + +/* + Description: + Decode and draw a glyph. + Args: + glyph_data: Pointer to the compressed glyph data of the font + u8g2->font_decode.target_x X position + u8g2->font_decode.target_y Y position + u8g2->font_decode.is_transparent Transparent mode + Return: + Width (delta x advance) of the glyph. + Calls: + u8g2_font_decode_len() +*/ +/* optimized */ +int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) +{ + uint8_t a, b; + int8_t x, y; + int8_t d; + int8_t h; + u8g2_font_decode_t *decode = &(u8g2->font_decode); + + u8g2_font_setup_decode(u8g2, glyph_data); + h = u8g2->font_decode.glyph_height; + + x = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_char_x); + y = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_char_y); + d = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_delta_x); + + if ( decode->glyph_width > 0 ) + { + decode->target_x = u8g2_add_vector_x(decode->target_x, x, -(h+y), decode->dir); + decode->target_y = u8g2_add_vector_y(decode->target_y, x, -(h+y), decode->dir); + //u8g2_add_vector(&(decode->target_x), &(decode->target_y), x, -(h+y), decode->dir); + + /* reset local x/y position */ + decode->x = 0; + decode->y = 0; + + /* decode glyph */ + for(;;) + { + a = u8g2_font_decode_get_unsigned_bits(decode, u8g2->font_info.bits_per_0); + b = u8g2_font_decode_get_unsigned_bits(decode, u8g2->font_info.bits_per_1); + do + { + u8g2_font_decode_len(u8g2, a, 0); + u8g2_font_decode_len(u8g2, b, 1); + } while( u8g2_font_decode_get_unsigned_bits(decode, 1) != 0 ); + + if ( decode->y >= h ) + break; + } + } + return d; +} + +/* + Description: + Find the starting point of the glyph data. + Args: + encoding: Encoding (ASCII code) of the glyph + Return: + Address of the glyph data or NULL, if the encoding is not avialable in the font. +*/ +const uint8_t *u8g2_font_get_glyph_data(u8g2_t *u8g2, uint8_t encoding) +{ + const uint8_t *font = u8g2->font; + font += U8G2_FONT_DATA_STRUCT_SIZE; + + if ( encoding >= 'a' ) + { + font += u8g2->font_info.start_pos_lower_a; + } + else if ( encoding >= 'A' ) + { + font += u8g2->font_info.start_pos_upper_A; + } + + for(;;) + { + if ( u8x8_pgm_read( ((uint8_t *)font) + 1 ) == 0 ) + break; + if ( u8x8_pgm_read( (uint8_t *)font ) == encoding ) + { + return font; + } + font += u8x8_pgm_read( ((uint8_t *)font) + 1 ); + } + return NULL; +} + +u8g2_uint_t u8g2_font_draw_glyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, uint8_t encoding) +{ + u8g2_uint_t dx = 0; + u8g2->font_decode.target_x = x; + u8g2->font_decode.target_y = y; + //u8g2->font_decode.is_transparent = is_transparent; this is already set + u8g2->font_decode.dir = dir; + const uint8_t *glyph_data = u8g2_font_get_glyph_data(u8g2, encoding); + if ( glyph_data != NULL ) + { + dx = u8g2_font_decode_glyph(u8g2, glyph_data); + } + return dx; +} + + + +uint8_t u8g2_IsGlyph(u8g2_t *u8g2, uint8_t requested_encoding) +{ + /* updated to new code */ + if ( u8g2_font_get_glyph_data(u8g2, requested_encoding) != NULL ) + return 1; + return 0; +} + +int8_t u8g2_GetGlyphWidth(u8g2_t *u8g2, uint8_t requested_encoding) +{ + const uint8_t *glyph_data = u8g2_font_get_glyph_data(u8g2, requested_encoding); + if ( glyph_data == NULL ) + return 0; + + u8g2_font_setup_decode(u8g2, glyph_data); + u8g2_font_decode_get_signed_bits(&(u8g2->font_decode), u8g2->font_info.bits_per_char_x); + u8g2_font_decode_get_signed_bits(&(u8g2->font_decode), u8g2->font_info.bits_per_char_y); + + return u8g2_font_decode_get_signed_bits(&(u8g2->font_decode), u8g2->font_info.bits_per_delta_x); +} + + +/* + set one of: + U8G2_FONT_MODE_TRANSPARENT + U8G2_FONT_MODE_SOLID + U8G2_FONT_MODE_NONE + This has been changed for the new font procedures +*/ +void u8g2_SetFontMode(u8g2_t *u8g2, uint8_t is_transparent) +{ + u8g2->font_decode.is_transparent = is_transparent; // new font procedures +} + +u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, uint8_t encoding) +{ + switch(dir) + { + case 0: + y += u8g2->font_calc_vref(u8g2); + break; + case 1: + x -= u8g2->font_calc_vref(u8g2); + break; + case 2: + y -= u8g2->font_calc_vref(u8g2); + break; + case 3: + x += u8g2->font_calc_vref(u8g2); + break; + } + return u8g2_font_draw_glyph(u8g2, x, y, dir, encoding); +} + +u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, const char *str) +{ + u8g2_uint_t delta, sum; + sum = 0; + while( *str != '\0' ) + { + delta = u8g2_DrawGlyph(u8g2, x, y, dir, (uint8_t)*str); + + switch(dir) + { + case 0: + x += delta; + break; + case 1: + y += delta; + break; + case 2: + x -= delta; + break; + case 3: + y -= delta; + break; + } + + sum += delta; + str++; + } + return sum; +} + + +/*===============================================*/ + +/* set ascent/descent for reference point calculation */ + +void u8g2_UpdateRefHeight(u8g2_t *u8g2) +{ + if ( u8g2->font == NULL ) + return; + u8g2->font_ref_ascent = u8g2->font_info.ascent_A; + u8g2->font_ref_descent = u8g2->font_info.descent_g; + if ( u8g2->font_height_mode == U8G2_FONT_HEIGHT_MODE_TEXT ) + { + } + else if ( u8g2->font_height_mode == U8G2_FONT_HEIGHT_MODE_XTEXT ) + { + if ( u8g2->font_ref_ascent < u8g2->font_info.ascent_para ) + u8g2->font_ref_ascent = u8g2->font_info.ascent_para; + if ( u8g2->font_ref_descent > u8g2->font_info.descent_para ) + u8g2->font_ref_descent = u8g2->font_info.descent_para; + } + else + { + if ( u8g2->font_ref_ascent < u8g2->font_info.max_char_height+u8g2->font_info.y_offset ) + u8g2->font_ref_ascent = u8g2->font_info.max_char_height+u8g2->font_info.y_offset; + if ( u8g2->font_ref_descent > u8g2->font_info.y_offset ) + u8g2->font_ref_descent = u8g2->font_info.y_offset; + } +} + +void u8g2_SetFontRefHeightText(u8g2_t *u8g2) +{ + u8g2->font_height_mode = U8G2_FONT_HEIGHT_MODE_TEXT; + u8g2_UpdateRefHeight(u8g2); +} + +void u8g2_SetFontRefHeightExtendedText(u8g2_t *u8g2) +{ + u8g2->font_height_mode = U8G2_FONT_HEIGHT_MODE_XTEXT; + u8g2_UpdateRefHeight(u8g2); +} + +void u8g2_SetFontRefHeightAll(u8g2_t *u8g2) +{ + u8g2->font_height_mode = U8G2_FONT_HEIGHT_MODE_ALL; + u8g2_UpdateRefHeight(u8g2); +} + +/*===============================================*/ +/* callback procedures to correct the y position */ + +u8g2_uint_t u8g2_font_calc_vref_font(u8g2_t *u8g2) +{ + return 0; +} + +void u8g2_SetFontPosBaseline(u8g2_t *u8g2) +{ + u8g2->font_calc_vref = u8g2_font_calc_vref_font; +} + + +u8g2_uint_t u8g2_font_calc_vref_bottom(u8g2_t *u8g2) +{ + return (u8g2_uint_t)(u8g2->font_ref_descent); +} + +void u8g2_SetFontPosBottom(u8g2_t *u8g2) +{ + u8g2->font_calc_vref = u8g2_font_calc_vref_bottom; +} + +u8g2_uint_t u8g2_font_calc_vref_top(u8g2_t *u8g2) +{ + u8g2_uint_t tmp; + /* reference pos is one pixel above the upper edge of the reference glyph */ + tmp = (u8g2_uint_t)(u8g2->font_ref_ascent); + tmp++; + return tmp; +} + +void u8g2_SetFontPosTop(u8g2_t *u8g2) +{ + u8g2->font_calc_vref = u8g2_font_calc_vref_top; +} + +u8g2_uint_t u8g2_font_calc_vref_center(u8g2_t *u8g2) +{ + int8_t tmp; + tmp = u8g2->font_ref_ascent; + tmp -= u8g2->font_ref_descent; + tmp /= 2; + tmp += u8g2->font_ref_descent; + return tmp; +} + +void u8g2_SetFontPosCenter(u8g2_t *u8g2) +{ + u8g2->font_calc_vref = u8g2_font_calc_vref_center; +} + +/*===============================================*/ + +void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font) +{ + if ( u8g2->font != font ) + { + u8g2->font = font; + u8g2_read_font_info(&(u8g2->font_info), font); + u8g2_UpdateRefHeight(u8g2); + //u8g2_SetFontPosBaseline(u8g2); + } +} + +/*===============================================*/ + +u8g2_uint_t u8g2_GetStrWidth(u8g2_t *u8g2, const char *s) +{ + u8g2_uint_t w; + uint8_t encoding; + + /* reset the total width to zero, this will be expanded during calculation */ + w = 0; + + for(;;) + { + encoding = *s; + if ( encoding == 0 ) + break; + + /* load glyph information */ + + // replaced by this: + w += u8g2_GetGlyphWidth(u8g2, encoding); + + /* goto next char */ + s++; + } + return w; +} diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index b33bb5e2..ec62df41 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -281,11 +281,14 @@ struct u8g2_struct u8g2_uint_t buf_y1; /* information about the current font */ - const unsigned char *font; /* current font for all text procedures */ + const uint8_t *font; /* current font for all text procedures */ u8g2_font_calc_vref_fnptr font_calc_vref; u8g2_font_decode_t font_decode; /* new font decode structure */ u8g2_font_info_t font_info; /* new font info structure */ + uint8_t font_height_mode; + int8_t font_ref_ascent; + int8_t font_ref_descent; uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ }; From 2d1410ef7ddb874fa805765a5d7a261c5f4ae2ff Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 24 Oct 2015 12:12:26 +0200 Subject: [PATCH 068/109] text draw --- u8g2/csrc/u8g2.h | 12 +- u8g2/csrc/u8g2_font.c | 2 +- u8g2/csrc/u8g2_hvline.c | 3 +- u8g2/csrc/u8g2_setup.c | 11 ++ u8g2/sys/sdl/text/Makefile | 12 ++ u8g2/sys/sdl/text/main.c | 254 +++++++++++++++++++++++++++++++++++++ 6 files changed, 291 insertions(+), 3 deletions(-) create mode 100644 u8g2/sys/sdl/text/Makefile create mode 100644 u8g2/sys/sdl/text/main.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 64b302a0..f11fdbf0 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -31,11 +31,21 @@ # define U8G2_NOINLINE #endif +/*==========================================*/ +/* u8g2_setup.c */ +void u8g2_ClearBuffer(u8g2_t *u8g2); + + +/*==========================================*/ +/* u8g2_font.c */ + + #define U8G2_FONT_HEIGHT_MODE_TEXT 0 #define U8G2_FONT_HEIGHT_MODE_XTEXT 1 #define U8G2_FONT_HEIGHT_MODE_ALL 2 - +void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font); +u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, const char *str); #endif diff --git a/u8g2/csrc/u8g2_font.c b/u8g2/csrc/u8g2_font.c index ce9d9ea3..8217c883 100644 --- a/u8g2/csrc/u8g2_font.c +++ b/u8g2/csrc/u8g2_font.c @@ -697,7 +697,7 @@ void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font) u8g2->font = font; u8g2_read_font_info(&(u8g2->font_info), font); u8g2_UpdateRefHeight(u8g2); - //u8g2_SetFontPosBaseline(u8g2); + u8g2_SetFontPosBaseline(u8g2); } } diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 219d6edd..83b7e02f 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -199,6 +199,7 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len { /* Make a call the the callback function. The callback may rotate the hv line */ /* after rotation this will call u8g2_draw_hv_line_4dir() */ - u8g2->cb->draw_l90(u8g2, x, y, len, dir); + if ( len != 0 ) + u8g2->cb->draw_l90(u8g2, x, y, len, dir); } diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 75932f30..54fab19b 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -5,8 +5,19 @@ */ #include "u8g2.h" +#include +/*============================================*/ +void u8g2_ClearBuffer(u8g2_t *u8g2) +{ + size_t cnt; + cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; + cnt *= u8g2->tile_buf_height; + cnt *= 8; + memset(u8g2->tile_buf_ptr, 0, cnt); +} + /*============================================*/ /* update dimension: diff --git a/u8g2/sys/sdl/text/Makefile b/u8g2/sys/sdl/text/Makefile new file mode 100644 index 00000000..9f409a66 --- /dev/null +++ b/u8g2/sys/sdl/text/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +helloworld: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_sdl + +clean: + -rm $(OBJ) u8g2_sdl + diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c new file mode 100644 index 00000000..6f0a3c45 --- /dev/null +++ b/u8g2/sys/sdl/text/main.c @@ -0,0 +1,254 @@ + +#include "u8g2.h" + + +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +const uint8_t u8g2_font_helvB18_tr[2245] U8X8_FONT_SECTION("u8g2_font_helvB18_tr") = { + 95,0,4,3,5,5,3,5,6,23,24,0,251,19,251,19, + 251,2,234,6,37,32,6,0,48,154,0,33,10,99,26,158, + 240,23,234,14,4,34,11,197,184,167,32,193,139,145,8,0, + 35,42,76,22,186,36,34,38,34,38,34,38,34,38,34,115, + 64,113,64,35,34,38,34,38,34,38,34,115,64,113,64,35, + 34,38,34,38,34,38,34,38,34,4,36,39,172,210,181,37, + 119,116,48,65,33,177,68,196,68,228,66,204,174,146,178,206, + 76,226,68,196,68,196,68,228,66,130,226,96,232,78,84,10, + 0,37,49,85,18,218,61,87,54,118,52,54,179,76,74,100, + 78,74,100,110,102,98,242,100,180,100,30,102,30,100,166,116, + 228,112,100,102,110,68,74,108,70,74,108,102,213,212,217,88, + 9,0,38,38,80,22,202,84,122,72,65,55,51,55,51,55, + 51,56,49,218,244,100,134,130,98,102,230,100,170,102,108,104, + 170,134,230,129,200,144,209,0,39,8,194,184,155,112,64,1, + 40,22,6,119,161,36,51,50,51,50,51,35,179,255,72,104, + 102,104,102,104,72,0,41,22,6,119,161,32,180,102,104,102, + 72,104,102,255,70,102,201,204,200,140,16,0,42,16,232,148, + 171,35,38,35,33,113,48,66,35,162,5,0,43,14,140,53, + 190,37,170,171,131,7,83,162,186,2,44,10,195,184,157,112, + 32,33,65,1,45,7,103,208,162,240,1,46,7,99,24,158, + 112,32,47,18,103,22,162,165,145,148,34,41,141,164,20,73, + 41,146,82,5,48,27,76,18,182,99,117,16,67,66,50,52, + 50,52,49,230,159,77,12,141,12,141,176,57,136,178,1,49, + 12,71,26,182,180,230,224,128,104,255,15,50,27,76,18,182, + 83,117,32,51,67,49,53,49,102,54,57,56,72,199,172,140, + 142,225,228,193,131,1,51,31,76,18,182,83,117,32,179,100, + 106,98,106,98,106,114,112,172,238,114,116,210,204,138,98,134, + 228,96,200,6,0,52,27,76,18,182,55,200,174,153,196,212, + 196,148,200,144,204,54,66,35,67,35,7,15,230,38,55,1, + 53,30,76,18,182,113,48,114,48,50,185,229,65,208,129,204, + 12,229,232,228,164,153,213,65,12,201,129,148,13,0,54,32, + 76,18,182,84,117,32,66,51,50,101,102,185,130,232,96,164, + 132,130,104,98,204,217,196,208,8,155,131,40,27,0,55,24, + 76,18,182,240,193,32,225,202,193,201,193,201,193,201,65,194, + 201,65,194,201,57,0,56,35,76,18,182,68,118,16,52,50, + 51,52,50,52,50,52,50,52,51,50,101,117,16,51,52,49, + 230,217,196,208,200,193,144,13,0,57,32,76,18,182,99,116, + 32,67,66,65,52,49,230,217,17,5,73,197,1,77,197,228, + 164,213,4,73,201,129,84,17,0,58,10,195,25,158,112,32, + 15,121,32,59,13,35,186,157,112,32,15,121,32,33,65,1, + 60,14,141,49,190,58,88,214,25,37,109,105,167,3,61,11, + 170,184,186,240,192,244,224,192,0,62,13,141,53,186,48,218, + 91,74,178,30,142,2,63,24,107,26,190,99,115,32,66,114, + 16,100,101,68,55,71,70,183,112,123,4,131,139,0,64,65, + 214,150,225,119,32,123,96,88,86,69,74,67,60,66,84,33, + 50,49,116,32,114,179,198,102,104,198,70,104,200,100,104,102, + 98,100,72,104,98,100,102,201,154,37,51,35,19,52,36,7, + 85,51,21,115,244,64,244,64,85,163,7,197,7,129,0,65, + 37,112,22,202,70,76,107,106,57,34,57,50,56,50,55,52, + 54,52,54,52,53,54,52,54,116,80,115,112,50,56,50,56, + 49,234,116,0,66,37,111,26,202,112,64,116,96,50,70,50, + 56,49,56,49,56,49,56,49,55,114,80,115,96,50,56,49, + 233,195,179,138,3,147,3,34,0,67,29,112,22,202,117,119, + 64,84,83,66,71,49,121,60,189,175,41,39,38,39,232,72, + 106,138,14,232,142,0,68,30,112,26,206,112,64,117,96,51, + 86,50,72,49,57,49,121,234,95,94,78,12,82,140,149,28, + 216,28,80,1,69,22,109,26,194,112,80,113,80,49,186,167, + 7,36,7,36,163,251,244,224,65,1,70,17,108,26,190,240, + 129,229,94,30,80,28,80,76,238,47,1,71,35,113,22,206, + 117,120,64,85,83,67,71,50,57,65,61,190,217,1,217,1, + 173,237,233,196,36,5,93,73,205,131,137,169,147,1,72,14, + 111,26,206,48,233,95,30,252,32,210,127,57,73,8,99,26, + 158,240,63,8,74,17,107,22,186,184,255,161,149,87,19,51, + 20,7,50,39,0,75,39,110,26,202,48,119,70,49,69,50, + 68,51,67,52,66,53,65,118,247,32,140,130,106,102,106,104, + 17,205,212,204,216,200,24,197,220,196,28,1,76,12,108,26, + 190,48,185,255,191,60,120,48,77,50,115,26,222,48,125,123, + 16,123,32,121,48,121,64,119,32,33,39,97,49,53,97,34, + 37,98,50,51,98,50,51,98,163,198,102,98,198,102,98,198, + 168,200,168,200,106,202,106,202,106,1,78,39,111,26,206,48, + 121,248,32,238,32,238,64,204,98,202,98,202,100,200,102,198, + 102,198,104,196,74,196,106,194,236,64,238,32,238,32,240,114, + 0,79,29,113,22,206,117,120,64,85,83,67,71,50,57,65, + 121,235,111,47,41,38,71,232,104,90,29,16,94,1,80,23, + 110,26,198,112,64,115,96,49,55,49,232,187,137,3,139,131, + 146,217,253,45,0,81,35,145,246,205,117,120,64,85,83,67, + 71,50,57,65,121,235,111,207,66,40,166,38,70,168,108,138, + 168,14,234,46,230,1,66,0,82,26,110,26,198,112,64,115, + 96,49,55,49,232,187,137,3,139,131,146,49,138,185,137,65, + 127,56,83,32,110,26,198,100,118,48,67,83,65,54,49,55, + 49,75,91,122,16,121,90,75,107,232,238,64,166,228,128,234, + 8,0,84,13,111,18,190,240,3,177,225,253,255,25,0,85, + 19,111,26,206,48,233,255,151,119,20,115,35,53,53,7,100, + 71,0,86,36,112,22,202,48,106,122,72,49,56,66,70,51, + 54,52,54,196,106,104,108,104,140,132,110,100,112,100,112,100, + 210,212,150,152,25,0,87,62,117,22,222,48,54,102,54,102, + 54,102,182,98,168,104,100,168,104,100,72,66,104,100,102,98, + 102,70,102,98,70,104,100,98,100,104,68,70,100,104,98,102, + 98,74,98,102,66,76,98,102,66,172,170,172,170,110,225,220, + 224,220,16,0,88,37,112,22,202,48,122,72,65,70,51,54, + 53,52,55,50,120,16,105,75,76,107,121,16,56,50,55,52, + 69,68,52,54,51,56,65,120,58,89,30,111,22,198,48,121, + 56,49,55,66,54,51,53,68,52,53,51,54,51,55,49,56, + 49,89,90,59,188,207,0,90,21,110,22,194,240,83,74,78, + 41,153,82,50,165,36,29,165,36,61,248,0,91,13,5,119, + 161,112,96,178,255,255,201,193,0,92,18,103,18,162,32,165, + 76,74,153,148,102,82,202,164,148,73,41,93,13,5,123,161, + 112,48,178,255,255,201,129,1,94,19,43,85,187,52,56,87, + 38,33,53,49,179,100,102,98,202,106,0,95,7,78,112,185, + 240,3,96,8,134,244,163,48,180,1,97,30,204,21,186,99, + 117,16,51,67,50,52,57,102,115,32,82,50,65,52,49,53, + 49,68,65,82,114,64,82,50,98,26,108,26,190,48,185,23, + 53,7,35,37,20,68,19,99,126,118,52,81,66,113,48,50, + 81,3,99,21,203,21,182,99,116,16,194,98,200,112,47,135, + 38,72,72,14,130,76,0,100,25,108,22,190,185,55,21,35, + 7,19,36,21,67,103,126,54,49,68,65,82,114,48,83,49, + 101,27,204,21,186,68,118,16,67,66,50,52,49,102,118,240, + 129,228,232,212,4,13,201,129,84,13,0,102,16,103,22,166, + 67,82,50,180,228,224,100,104,255,19,0,103,31,108,118,189, + 83,49,114,48,65,82,49,116,230,103,19,67,20,36,37,7, + 51,21,147,102,71,35,7,67,54,0,104,17,107,26,190,48, + 184,23,52,7,19,52,19,83,254,175,6,105,10,99,26,158, + 112,32,118,240,7,106,13,5,115,157,178,241,200,254,127,114, + 80,1,107,31,107,26,186,48,184,71,19,51,20,35,36,19, + 52,71,86,71,19,52,35,51,35,36,51,20,67,19,67,87, + 3,108,8,99,26,158,240,63,8,109,36,209,25,214,48,65, + 82,114,112,32,65,82,114,52,100,52,100,52,100,52,100,52, + 100,52,100,52,100,52,100,52,100,52,100,180,0,110,16,203, + 25,190,48,81,114,48,65,51,49,229,255,106,0,111,23,204, + 21,186,68,118,16,67,66,50,52,49,230,103,19,67,35,108, + 14,194,136,0,112,27,108,122,189,48,81,115,48,82,66,65, + 52,49,230,103,71,19,37,20,7,35,19,53,147,187,4,113, + 25,108,118,189,83,49,114,48,65,82,49,116,230,103,19,67, + 20,36,37,7,51,21,147,123,114,13,199,25,170,48,113,240, + 102,104,255,8,0,115,25,203,21,182,98,116,16,194,98,104, + 98,208,236,32,204,240,202,234,134,226,64,230,4,0,116,15, + 71,22,166,50,180,201,193,201,208,254,81,13,1,117,16,203, + 25,190,48,229,255,136,98,164,194,98,102,100,0,118,26,204, + 21,186,48,230,108,98,104,100,104,100,104,102,100,104,100,104, + 100,202,204,142,144,17,0,119,43,211,17,206,48,53,101,181, + 66,106,74,100,166,102,100,166,102,70,133,140,144,200,196,136, + 208,196,86,18,50,18,98,53,101,53,117,83,131,83,131,83, + 67,0,120,26,203,21,182,48,117,67,49,179,98,232,170,110, + 174,172,106,98,134,130,100,102,130,230,106,0,121,32,109,118, + 189,48,103,55,49,54,65,52,51,52,67,66,52,50,53,50, + 102,103,88,72,186,114,116,114,176,144,14,0,122,19,203,21, + 182,240,65,220,58,50,186,57,50,186,117,116,7,15,2,123, + 15,7,119,169,52,179,104,191,89,52,181,104,191,90,124,8, + 2,127,157,240,15,12,125,16,7,123,169,48,181,104,191,90, + 52,179,104,191,89,4,126,13,139,180,186,65,115,48,97,113, + 48,67,1,0,0}; + +u8g2_t u8g2; + +int main(void) +{ + int x, y; + int k; + u8g2_Setup_SDL_128x64(&u8g2, &u8g2_cb_r0); + + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); + + + u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); + + x = 50; + y = 30; + + for(;;) + { + u8g2_ClearBuffer(&u8g2); + + u8g2_DrawString(&u8g2, x, y, 0, "abc"); + u8g2_DrawString(&u8g2, x, y, 1, "abc"); + u8g2_DrawString(&u8g2, x, y, 2, "abc"); + u8g2_DrawString(&u8g2, x, y, 3, "abc"); + + + u8g2_SendBuffer(&u8g2); + do + { + k = u8g_sdl_get_key(); + } while( k < 0 ); + + if ( k == 273 ) y -= 3; + if ( k == 274 ) y += 3; + if ( k == 276 ) x -= 3; + if ( k == 275 ) x += 3; + + if ( k == 'e' ) y -= 3; + if ( k == 'x' ) y += 3; + if ( k == 's' ) x -= 3; + if ( k == 'd' ) x += 3; + if ( k == 'q' ) break; + + } + + //u8x8_Set8x8Font(u8g2_GetU8x8(&u8g2), bdf_font); + //u8x8_Draw8x8String(u8g2_GetU8x8(&u8g2), 0, 0, "Hello World!"); + + + + + + + return 0; +} + From 3cc1e2fab975b99d8792f2b4fc1d1d98eb3e45fa Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 24 Oct 2015 12:52:53 +0200 Subject: [PATCH 069/109] buffer handling --- u8g2/csrc/u8g2.h | 15 +++++++- u8g2/csrc/u8g2_buffer.c | 49 +++++++++++++++++++++++++ u8g2/csrc/u8g2_setup.c | 9 ----- u8g2/csrc/u8x8.h | 9 ----- u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 4 +- u8g2/sys/sdl/text/main.c | 16 ++++---- 6 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 u8g2/csrc/u8g2_buffer.c diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index f11fdbf0..ea63f486 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -31,11 +31,24 @@ # define U8G2_NOINLINE #endif + /*==========================================*/ -/* u8g2_setup.c */ +/* u8g2_buffer.c */ + +void u8g2_SendBuffer(u8g2_t *u8g2); void u8g2_ClearBuffer(u8g2_t *u8g2); +/*==========================================*/ +/* u8g2_hvline.c */ +void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); + +/*==========================================*/ +/* u8g2_setup.c */ + +extern const u8g2_cb_t u8g2_cb_r0; + + /*==========================================*/ /* u8g2_font.c */ diff --git a/u8g2/csrc/u8g2_buffer.c b/u8g2/csrc/u8g2_buffer.c new file mode 100644 index 00000000..03915e7b --- /dev/null +++ b/u8g2/csrc/u8g2_buffer.c @@ -0,0 +1,49 @@ +/* + + u8g2_buffer.c + +*/ + +#include "u8g2.h" +#include + +/*============================================*/ +void u8g2_ClearBuffer(u8g2_t *u8g2) +{ + size_t cnt; + cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; + cnt *= u8g2->tile_buf_height; + cnt *= 8; + memset(u8g2->tile_buf_ptr, 0, cnt); +} + +/*============================================*/ + +static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) +{ + uint8_t *ptr; + uint16_t offset; + uint8_t w; + + w = u8g2_GetU8x8(u8g2)->display_info->tile_width; + offset = tile_row; + ptr = u8g2->tile_buf_ptr; + offset *= w; + offset *= 8; + ptr += offset; + + u8x8_display_DrawTile(u8g2_GetU8x8(u8g2), 0, tile_row, w, ptr); +} + +void u8g2_SendBuffer(u8g2_t *u8g2) +{ + uint8_t cnt = u8g2->tile_buf_height; + uint8_t row = u8g2->tile_curr_row; + do + { + u8g2_send_tile_row(u8g2, row); + cnt--; + row++; + } while( cnt > 0 ); +} + diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 54fab19b..52f53c3d 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -8,15 +8,6 @@ #include -/*============================================*/ -void u8g2_ClearBuffer(u8g2_t *u8g2) -{ - size_t cnt; - cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; - cnt *= u8g2->tile_buf_height; - cnt *= 8; - memset(u8g2->tile_buf_ptr, 0, cnt); -} /*============================================*/ /* diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index ec62df41..17337b2c 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -557,15 +557,6 @@ void u8x8_Set8x8Font(u8x8_t *u8x8, const uint8_t *font_8x8); void u8x8_Draw8x8Glyph(u8x8_t *u8x8, uint8_t x, uint8_t y, uint8_t encoding); void u8x8_Draw8x8String(u8x8_t *u8x8, uint8_t x, uint8_t y, const char *s); -/*==========================================*/ -/* high level interface */ - -void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); -void u8g2_SendBuffer(u8g2_t *u8g2); - - -/* u8g2_setup.c */ -extern const u8g2_cb_t u8g2_cb_r0; #ifdef __cplusplus } diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 00218415..8b180b91 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -287,7 +287,7 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) u8g2->cb->update(u8g2); } - +/* static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) { uint8_t *ptr; @@ -316,6 +316,6 @@ void u8g2_SendBuffer(u8g2_t *u8g2) } while( cnt > 0 ); } - +*/ diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 6f0a3c45..1743ece3 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -228,15 +228,15 @@ int main(void) k = u8g_sdl_get_key(); } while( k < 0 ); - if ( k == 273 ) y -= 3; - if ( k == 274 ) y += 3; - if ( k == 276 ) x -= 3; - if ( k == 275 ) x += 3; + if ( k == 273 ) y -= 7; + if ( k == 274 ) y += 7; + if ( k == 276 ) x -= 7; + if ( k == 275 ) x += 7; - if ( k == 'e' ) y -= 3; - if ( k == 'x' ) y += 3; - if ( k == 's' ) x -= 3; - if ( k == 'd' ) x += 3; + if ( k == 'e' ) y -= 1; + if ( k == 'x' ) y += 1; + if ( k == 's' ) x -= 1; + if ( k == 'd' ) x += 1; if ( k == 'q' ) break; } From aa9662f250321521ede1de7dd822c29238da082d Mon Sep 17 00:00:00 2001 From: olikraus Date: Sat, 24 Oct 2015 20:16:32 +0200 Subject: [PATCH 070/109] added picture loop --- u8g2/csrc/u8g2.h | 4 ++ u8g2/csrc/u8g2_buffer.c | 47 +++++++++++++++++---- u8g2/csrc/u8g2_hvline.c | 3 +- u8g2/csrc/u8g2_setup.c | 56 +++++++++++++++++++++++-- u8g2/csrc/u8x8.h | 12 ++++++ u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 43 ++++++------------- u8g2/sys/sdl/text/main.c | 17 ++++++-- 7 files changed, 134 insertions(+), 48 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index ea63f486..5899e9f4 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -38,6 +38,9 @@ void u8g2_SendBuffer(u8g2_t *u8g2); void u8g2_ClearBuffer(u8g2_t *u8g2); +void u8g2_FirstPage(u8g2_t *u8g2); +uint8_t u8g2_NextPage(u8g2_t *u8g2); + /*==========================================*/ /* u8g2_hvline.c */ @@ -47,6 +50,7 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len /* u8g2_setup.c */ extern const u8g2_cb_t u8g2_cb_r0; +extern const u8g2_cb_t u8g2_cb_r1; /*==========================================*/ diff --git a/u8g2/csrc/u8g2_buffer.c b/u8g2/csrc/u8g2_buffer.c index 03915e7b..b59af500 100644 --- a/u8g2/csrc/u8g2_buffer.c +++ b/u8g2/csrc/u8g2_buffer.c @@ -19,31 +19,60 @@ void u8g2_ClearBuffer(u8g2_t *u8g2) /*============================================*/ -static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) +static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) { uint8_t *ptr; uint16_t offset; uint8_t w; w = u8g2_GetU8x8(u8g2)->display_info->tile_width; - offset = tile_row; + offset = src_tile_row; ptr = u8g2->tile_buf_ptr; offset *= w; offset *= 8; ptr += offset; - u8x8_display_DrawTile(u8g2_GetU8x8(u8g2), 0, tile_row, w, ptr); + u8x8_display_DrawTile(u8g2_GetU8x8(u8g2), 0, dest_tile_row, w, ptr); } void u8g2_SendBuffer(u8g2_t *u8g2) { - uint8_t cnt = u8g2->tile_buf_height; - uint8_t row = u8g2->tile_curr_row; + uint8_t src_row; + uint8_t src_max; + uint8_t dest_row; + uint8_t dest_max; + + src_row = 0; + src_max = u8g2->tile_buf_height; + dest_row = u8g2->tile_curr_row; + dest_max = u8g2_GetU8x8(u8g2)->display_info->tile_height; + do { - u8g2_send_tile_row(u8g2, row); - cnt--; - row++; - } while( cnt > 0 ); + u8g2_send_tile_row(u8g2, src_row, dest_row); + src_row++; + dest_row++; + } while( src_row < src_max && dest_row < dest_max ); +} + +/*============================================*/ +void u8g2_FirstPage(u8g2_t *u8g2) +{ + u8g2_ClearBuffer(u8g2); + u8g2->tile_curr_row = 0; + u8g2->cb->update(u8g2); } +uint8_t u8g2_NextPage(u8g2_t *u8g2) +{ + uint8_t row; + u8g2_SendBuffer(u8g2); + row = u8g2->tile_curr_row; + row += u8g2->tile_buf_height; + if ( row >= u8g2_GetU8x8(u8g2)->display_info->tile_height ) + return 0; + u8g2_ClearBuffer(u8g2); + u8g2->tile_curr_row = row; + u8g2->cb->update(u8g2); + return 1; +} diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 83b7e02f..ce6c5668 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -19,8 +19,9 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) assert(x < u8g2->buf_x1); assert(y >= u8g2->buf_y0); assert(y < u8g2->buf_y1); - + y -= u8g2->tile_curr_row*8; + ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ bit_pos = y; /* overflow truncate is ok here... */ diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 52f53c3d..3ce00b1a 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -19,10 +19,15 @@ u8g2_uint_t buf_y1; */ -void u8g2_update_dimension_r0(u8g2_t *u8g2) +static void u8g2_update_dimension_common(u8g2_t *u8g2) { u8g2_uint_t h, w; h = u8g2->tile_buf_height; + + /* handle the case, where the buffer is larger than the (remaining) part of the display */ + if ( h + u8g2->tile_curr_row > u8g2_GetU8x8(u8g2)->display_info->tile_height ) + h = u8g2_GetU8x8(u8g2)->display_info->tile_height - u8g2->tile_curr_row; + h *= 8; w = u8g2_GetU8x8(u8g2)->display_info->tile_width; w *= 8; @@ -34,12 +39,42 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) u8g2->buf_x1 += w; u8g2->buf_y1 = u8g2->buf_y0; u8g2->buf_y1 += h; + + u8g2->width = w; + u8g2->height = h; +} + +void u8g2_update_dimension_r0(u8g2_t *u8g2) +{ + u8g2_update_dimension_common(u8g2); + + u8g2->user_x0 = u8g2->buf_x0; + u8g2->user_x1 = u8g2->buf_x1; + u8g2->user_y0 = u8g2->buf_y0; + u8g2->user_y1 = u8g2->buf_y1; - /* printf("x0=%d x1=%d y0=%d y1=%d\n", - u8g2->buf_x0, u8g2->buf_x1, u8g2->buf_y0, u8g2->buf_y1); - */ + u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +} + +void u8g2_update_dimension_r1(u8g2_t *u8g2) +{ + u8g2_uint_t t; + u8g2_update_dimension_common(u8g2); + + t = u8g2->width; + u8g2->width = u8g2->height; + u8g2->height = t; + + u8g2->user_x0 = u8g2->buf_y0; + u8g2->user_x1 = u8g2->buf_y1; + + u8g2->user_y0 = u8g2->buf_x0; + u8g2->user_y1 = u8g2->buf_x1; + + printf("x0=%d x1=%d y0=%d y1=%d\n", + u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } @@ -52,11 +87,24 @@ void u8g2_draw_l90_r0(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t le u8g2_draw_hv_line_4dir(u8g2, x, y, len, dir); } +void u8g2_draw_l90_r1(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + u8g2_uint_t xx, yy; + yy = x; + xx = u8g2_GetU8x8(u8g2)->display_info->tile_width; + xx *= 8; + xx -= y; + xx--; + dir ++; + dir &= 3; + u8g2_draw_hv_line_4dir(u8g2, xx, yy, len, dir); +} /*============================================*/ const u8g2_cb_t u8g2_cb_r0 = { u8g2_update_dimension_r0, u8g2_draw_l90_r0 }; +const u8g2_cb_t u8g2_cb_r1 = { u8g2_update_dimension_r1, u8g2_draw_l90_r1 }; diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 17337b2c..6cbe651a 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -275,11 +275,22 @@ struct u8g2_struct uint8_t tile_curr_row; /* current row for picture loop */ /* the following variables are set by the update dimension callback */ + /* this is clipbox after rotation for the hvline procedures */ u8g2_uint_t buf_x0; /* left corner of the buffer */ u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ u8g2_uint_t buf_y0; u8g2_uint_t buf_y1; + /* display dimensions for the user */ + u8g2_uint_t width; + u8g2_uint_t height; + + /* ths is the clip box for the user to check if a specific box has an intersection */ + u8g2_uint_t user_x0; /* left corner of the buffer */ + u8g2_uint_t user_x1; /* right corner of the buffer (excluded) */ + u8g2_uint_t user_y0; + u8g2_uint_t user_y1; + /* information about the current font */ const uint8_t *font; /* current font for all text procedures */ u8g2_font_calc_vref_fnptr font_calc_vref; @@ -539,6 +550,7 @@ void u8x8_SetupStdio(u8x8_t *u8x8); /* u8x8_d_sdl_128x64.c */ void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); int u8g_sdl_get_key(void); diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 8b180b91..e3e9bac8 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -271,11 +271,6 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) { static uint8_t buf[128*8]; - /* - int i; - for( i = 0; i < 128*8; i++ ) - buf[i] = (i>>2); - */ u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2)); u8g2->tile_buf_ptr = buf; @@ -287,35 +282,21 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) u8g2->cb->update(u8g2); } -/* -static void u8g2_send_tile_row(u8g2_t *u8g2, uint8_t tile_row) -{ - uint8_t *ptr; - uint16_t offset; - uint8_t w; - - w = u8g2_GetU8x8(u8g2)->display_info->tile_width; - offset = tile_row; - ptr = u8g2->tile_buf_ptr; - offset *= w; - offset *= 8; - ptr += offset; - - u8x8_display_DrawTile(u8g2_GetU8x8(u8g2), 0, tile_row, w, ptr); -} -void u8g2_SendBuffer(u8g2_t *u8g2) +void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) { - uint8_t cnt = u8g2->tile_buf_height; - uint8_t row = u8g2->tile_curr_row; - do - { - u8g2_send_tile_row(u8g2, row); - cnt--; - row++; - } while( cnt > 0 ); + + static uint8_t buf[128*3]; + + u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2)); + u8g2->tile_buf_ptr = buf; + u8g2->tile_buf_height = 3; + u8g2->tile_curr_row = 0; + u8g2->draw_color = 1; + + u8g2->cb = u8g2_cb; + u8g2->cb->update(u8g2); } -*/ diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 1743ece3..3c08eb66 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -201,7 +201,7 @@ int main(void) { int x, y; int k; - u8g2_Setup_SDL_128x64(&u8g2, &u8g2_cb_r0); + u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r1); u8x8_display_Init(u8g2_GetU8x8(&u8g2)); u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); @@ -214,15 +214,26 @@ int main(void) for(;;) { + /* u8g2_ClearBuffer(&u8g2); - u8g2_DrawString(&u8g2, x, y, 0, "abc"); + u8g2_DrawString(&u8g2, x, y, 0, "ABC"); u8g2_DrawString(&u8g2, x, y, 1, "abc"); u8g2_DrawString(&u8g2, x, y, 2, "abc"); u8g2_DrawString(&u8g2, x, y, 3, "abc"); - u8g2_SendBuffer(&u8g2); + */ + + u8g2_FirstPage(&u8g2); + do + { + u8g2_DrawString(&u8g2, x, y, 0, "ABC"); + u8g2_DrawString(&u8g2, x, y, 1, "abc"); + u8g2_DrawString(&u8g2, x, y, 2, "abc"); + u8g2_DrawString(&u8g2, x, y, 3, "abc"); + } while( u8g2_NextPage(&u8g2) ); + do { k = u8g_sdl_get_key(); From 91b966f9dbf75d86f204ef98e90f83aecb5ba211 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 08:19:50 +0100 Subject: [PATCH 071/109] intersection (part 1) --- csrc/u8g_clip.c | 2 +- u8g2/csrc/u8g2.h | 5 +++ u8g2/csrc/u8g2_intersection.c | 78 +++++++++++++++++++++++++++++++++++ u8g2/sys/sdl/text/main.c | 14 +++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 u8g2/csrc/u8g2_intersection.c diff --git a/csrc/u8g_clip.c b/csrc/u8g_clip.c index 1ca223e4..5f120971 100644 --- a/csrc/u8g_clip.c +++ b/csrc/u8g_clip.c @@ -62,7 +62,7 @@ #define U8G_ALWAYS_INLINE __inline__ __attribute__((always_inline)) #else #define U8G_ALWAYS_INLINE - #endif +#endif /* intersection assumptions: diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 5899e9f4..a0e71865 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -53,6 +53,11 @@ extern const u8g2_cb_t u8g2_cb_r0; extern const u8g2_cb_t u8g2_cb_r1; +/*==========================================*/ +/* u8g2_intersection.c */ +uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1); + + /*==========================================*/ /* u8g2_font.c */ diff --git a/u8g2/csrc/u8g2_intersection.c b/u8g2/csrc/u8g2_intersection.c new file mode 100644 index 00000000..8093653f --- /dev/null +++ b/u8g2/csrc/u8g2_intersection.c @@ -0,0 +1,78 @@ +/* + + u8g2_intersection.c + + code taken from u8g_clip.c + +*/ + +#include "u8g2.h" + +#ifdef __GNUC__ +#define U8G2_ALWAYS_INLINE __inline__ __attribute__((always_inline)) +#else +#define U8G2_ALWAYS_INLINE +#endif + +/* + intersection assumptions: + a1 <= a2 is always true + + minimized version + ---1----0 1 b1 <= a2 && b1 > b2 + -----1--0 1 b2 >= a1 && b1 > b2 + ---1-1--- 1 b1 <= a2 && b2 >= a1 + */ + + +//static uint8_t U8G2_ALWAYS_INLINE u8g2_is_intersection_decision_tree(u8g_uint_t a0, u8g_uint_t a1, u8g_uint_t v0, u8g_uint_t v1) +static uint8_t u8g2_is_intersection_decision_tree(u8g2_uint_t a0, u8g2_uint_t a1, u8g2_uint_t v0, u8g2_uint_t v1) +{ + if ( v0 <= a1 ) + { + if ( v1 >= a0 ) + { + return 1; + } + else + { + if ( v0 > v1 ) + { + return 1; + } + else + { + return 0; + } + } + } + else + { + if ( v1 >= a0 ) + { + if ( v0 > v1 ) + { + return 1; + } + else + { + return 0; + } + } + else + { + return 0; + } + } +} + + +uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1) +{ + if ( u8g2_is_intersection_decision_tree(u8g2->user_y0, u8g2->user_y1, y0, y1) == 0 ) + return 0; + + return u8g2_is_intersection_decision_tree(u8g2->user_x0, u8g2->user_x1, x0, x1); +} + + diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 3c08eb66..cd1a5c36 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -201,6 +201,7 @@ int main(void) { int x, y; int k; + int i; u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r1); u8x8_display_Init(u8g2_GetU8x8(&u8g2)); @@ -226,12 +227,25 @@ int main(void) */ u8g2_FirstPage(&u8g2); + i = 0; do { u8g2_DrawString(&u8g2, x, y, 0, "ABC"); u8g2_DrawString(&u8g2, x, y, 1, "abc"); u8g2_DrawString(&u8g2, x, y, 2, "abc"); u8g2_DrawString(&u8g2, x, y, 3, "abc"); + + if ( i == 1 ) + { + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y0, 1, 0); + + } + + i++; + } while( u8g2_NextPage(&u8g2) ); do From 5ca9e4ca12e54057266d5619870d3d8ad4692b11 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 16:10:43 +0100 Subject: [PATCH 072/109] 180 degree rotation --- u8g2/csrc/u8g2.h | 150 +++++++++++++++++++++++- u8g2/csrc/u8g2_font.c | 33 ++++++ u8g2/csrc/u8g2_hvline.c | 4 + u8g2/csrc/u8g2_intersection.c | 6 + u8g2/csrc/u8g2_setup.c | 41 ++++++- u8g2/csrc/u8x8.h | 114 ------------------ u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 2 +- u8g2/sys/sdl/text/main.c | 10 +- 8 files changed, 239 insertions(+), 121 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index a0e71865..fa9b8750 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -18,19 +18,156 @@ */ - - #ifndef _U8G2_H #define _U8G2_H #include "u8x8.h" + +/* + The following macro activates the early intersection check with the current visible area. + Clipping (and low level intersection calculation) may still happen and is controlled by U8G2_WITH_CLIPPING. + This early intersection check mainly improves speed for the picture loop (u8g2_FirstPage/NextPage). + With a full framebuffer in RAM and if most graphical elements are drawn within the visible area, then this + macro can be commented to reduce code size. +*/ +#define U8G2_WITH_INTERSECTION + +/* + Internal performance test for the effect of enabling U8G2_WITH_INTERSECTION + Should not be defined for production code +*/ +#define U8G2_WITH_HVLINE_COUNT + +/*==========================================*/ + + #ifdef __GNUC__ # define U8G2_NOINLINE __attribute__((noinline)) #else # define U8G2_NOINLINE #endif +/*==========================================*/ + +typedef struct u8g2_struct u8g2_t; +typedef struct u8g2_cb_struct u8g2_cb_t; + +typedef void (*u8g2_update_dimension_cb)(u8g2_t *u8g2); +typedef void (*u8g2_draw_l90_cb)(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); + + + +/* from ucglib... */ +struct _u8g2_font_info_t +{ + /* offset 0 */ + uint8_t glyph_cnt; + uint8_t bbx_mode; + uint8_t bits_per_0; + uint8_t bits_per_1; + + /* offset 4 */ + uint8_t bits_per_char_width; + uint8_t bits_per_char_height; + uint8_t bits_per_char_x; + uint8_t bits_per_char_y; + uint8_t bits_per_delta_x; + + /* offset 9 */ + int8_t max_char_width; + int8_t max_char_height; /* overall height, NOT ascent. Instead ascent = max_char_height + y_offset */ + int8_t x_offset; + int8_t y_offset; + + /* offset 13 */ + int8_t ascent_A; + int8_t descent_g; + int8_t ascent_para; + int8_t descent_para; + + /* offset 17 */ + uint16_t start_pos_upper_A; + uint16_t start_pos_lower_a; +}; +typedef struct _u8g2_font_info_t u8g2_font_info_t; + +/* from ucglib... */ +struct _u8g2_font_decode_t +{ + const uint8_t *decode_ptr; /* pointer to the compressed data */ + + u8g2_uint_t target_x; + u8g2_uint_t target_y; + + int8_t x; /* local coordinates, (0,0) is upper left */ + int8_t y; + int8_t glyph_width; + int8_t glyph_height; + + uint8_t decode_bit_pos; /* bitpos inside a byte of the compressed data */ + uint8_t is_transparent; + uint8_t dir; /* direction */ +}; +typedef struct _u8g2_font_decode_t u8g2_font_decode_t; + + +struct u8g2_cb_struct +{ + u8g2_update_dimension_cb update; + u8g2_draw_l90_cb draw_l90; +}; + +typedef u8g2_uint_t (*u8g2_font_calc_vref_fnptr)(u8g2_t *u8g2); + + +struct u8g2_struct +{ + u8x8_t u8x8; + const u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ + + /* the following variables must be assigned during u8g2 setup */ + uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ + uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ + uint8_t tile_curr_row; /* current row for picture loop */ + + /* the following variables are set by the update dimension callback */ + /* this is clipbox after rotation for the hvline procedures */ + u8g2_uint_t buf_x0; /* left corner of the buffer */ + u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ + u8g2_uint_t buf_y0; + u8g2_uint_t buf_y1; + + /* display dimensions for the user */ + u8g2_uint_t width; + u8g2_uint_t height; + + /* ths is the clip box for the user to check if a specific box has an intersection */ + u8g2_uint_t user_x0; /* left corner of the buffer */ + u8g2_uint_t user_x1; /* right corner of the buffer (excluded) */ + u8g2_uint_t user_y0; + u8g2_uint_t user_y1; + + /* information about the current font */ + const uint8_t *font; /* current font for all text procedures */ + u8g2_font_calc_vref_fnptr font_calc_vref; + u8g2_font_decode_t font_decode; /* new font decode structure */ + u8g2_font_info_t font_info; /* new font info structure */ + + uint8_t font_height_mode; + int8_t font_ref_ascent; + int8_t font_ref_descent; + + uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ + +#ifdef U8G2_WITH_HVLINE_COUNT + unsigned long hv_cnt; +#endif /* U8G2_WITH_HVLINE_COUNT */ +}; + +#define u8g2_GetU8x8(u8g2) ((u8x8_t *)(u8g2)) + + /*==========================================*/ /* u8g2_buffer.c */ @@ -51,11 +188,14 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len extern const u8g2_cb_t u8g2_cb_r0; extern const u8g2_cb_t u8g2_cb_r1; +extern const u8g2_cb_t u8g2_cb_r2; /*==========================================*/ /* u8g2_intersection.c */ +#ifdef U8G2_WITH_INTERSECTION uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t x1, u8g2_uint_t y1); +#endif /* U8G2_WITH_INTERSECTION */ /*==========================================*/ @@ -69,6 +209,12 @@ uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_u void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font); u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, const char *str); +/*==========================================*/ +/* u8x8_d_sdl_128x64.c */ +void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); + + #endif diff --git a/u8g2/csrc/u8g2_font.c b/u8g2/csrc/u8g2_font.c index 8217c883..bc70f9ff 100644 --- a/u8g2/csrc/u8g2_font.c +++ b/u8g2/csrc/u8g2_font.c @@ -428,6 +428,39 @@ int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) decode->target_x = u8g2_add_vector_x(decode->target_x, x, -(h+y), decode->dir); decode->target_y = u8g2_add_vector_y(decode->target_y, x, -(h+y), decode->dir); //u8g2_add_vector(&(decode->target_x), &(decode->target_y), x, -(h+y), decode->dir); + +#ifdef U8G2_WITH_INTERSECTION + { + u8g2_uint_t x0, x1, y0, y1; + x0 = decode->target_x; + y0 = decode->target_y; + x1 = x0; + y1 = y0; + + switch(decode->dir) + { + case 0: + x1 += decode->glyph_width; + y1 += h; + break; + case 1: + x0 -= h; + y1 += decode->glyph_width; + break; + case 2: + x0 -= decode->glyph_width; + y0 -= h; + break; + case 3: + x1 += h; + y0 -= decode->glyph_width; + break; + + } + if ( u8g2_IsIntersection(u8g2, x0, y0, x1, y1) == 0 ) + return d; + } +#endif /* reset local x/y position */ decode->x = 0; diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index ce6c5668..10b04fbe 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -178,6 +178,10 @@ static void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u */ void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { +#ifdef U8G2_WITH_HVLINE_COUNT + u8g2->hv_cnt++; +#endif /* U8G2_WITH_HVLINE_COUNT */ + if ( dir == 2 ) { x -= len; diff --git a/u8g2/csrc/u8g2_intersection.c b/u8g2/csrc/u8g2_intersection.c index 8093653f..db36784e 100644 --- a/u8g2/csrc/u8g2_intersection.c +++ b/u8g2/csrc/u8g2_intersection.c @@ -14,6 +14,10 @@ #define U8G2_ALWAYS_INLINE #endif + +#ifdef U8G2_WITH_INTERSECTION + + /* intersection assumptions: a1 <= a2 is always true @@ -76,3 +80,5 @@ uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_u } +#endif /* U8G2_WITH_INTERSECTION */ + diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 3ce00b1a..c745db01 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -22,6 +22,7 @@ static void u8g2_update_dimension_common(u8g2_t *u8g2) { u8g2_uint_t h, w; + h = u8g2->tile_buf_height; /* handle the case, where the buffer is larger than the (remaining) part of the display */ @@ -41,7 +42,7 @@ static void u8g2_update_dimension_common(u8g2_t *u8g2) u8g2->buf_y1 += h; u8g2->width = w; - u8g2->height = h; + u8g2->height = u8g2_GetU8x8(u8g2)->display_info->tile_height * 8; } void u8g2_update_dimension_r0(u8g2_t *u8g2) @@ -77,6 +78,20 @@ void u8g2_update_dimension_r1(u8g2_t *u8g2) u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } +void u8g2_update_dimension_r2(u8g2_t *u8g2) +{ + u8g2_update_dimension_common(u8g2); + + u8g2->user_x0 = u8g2->buf_x0; + u8g2->user_x1 = u8g2->buf_x1; + + u8g2->user_y0 = u8g2->height - u8g2->buf_y1; + u8g2->user_y1 = u8g2->height - u8g2->buf_y0; + + printf("x0=%d x1=%d y0=%d y1=%d\n", + u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +} + /*============================================*/ extern void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); @@ -90,21 +105,41 @@ void u8g2_draw_l90_r0(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t le void u8g2_draw_l90_r1(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { u8g2_uint_t xx, yy; + yy = x; - xx = u8g2_GetU8x8(u8g2)->display_info->tile_width; - xx *= 8; + + xx = u8g2->height; xx -= y; xx--; + dir ++; dir &= 3; u8g2_draw_hv_line_4dir(u8g2, xx, yy, len, dir); } +void u8g2_draw_l90_r2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + u8g2_uint_t xx, yy; + + yy = u8g2->height; + yy -= y; + yy--; + + xx = u8g2->width; + xx -= x; + xx--; + + dir +=2; + dir &= 3; + u8g2_draw_hv_line_4dir(u8g2, xx, yy, len, dir); +} + /*============================================*/ const u8g2_cb_t u8g2_cb_r0 = { u8g2_update_dimension_r0, u8g2_draw_l90_r0 }; const u8g2_cb_t u8g2_cb_r1 = { u8g2_update_dimension_r1, u8g2_draw_l90_r1 }; +const u8g2_cb_t u8g2_cb_r2 = { u8g2_update_dimension_r2, u8g2_draw_l90_r2 }; diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 6cbe651a..a5c258f6 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -119,14 +119,8 @@ typedef struct u8x8_struct u8x8_t; typedef struct u8x8_display_info_struct u8x8_display_info_t; typedef struct u8x8_tile_struct u8x8_tile_t; -typedef struct u8g2_struct u8g2_t; -typedef struct u8g2_cb_struct u8g2_cb_t; - typedef uint8_t (*u8x8_msg_cb)(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); -typedef void (*u8g2_update_dimension_cb)(u8g2_t *u8g2); -typedef void (*u8g2_draw_l90_cb)(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); - //struct u8x8_mcd_struct //{ @@ -201,111 +195,6 @@ struct u8x8_struct uint8_t x_offset; /* copied from info struct, can be modified in flip mode */ }; -/* from ucglib... */ -struct _u8g2_font_info_t -{ - /* offset 0 */ - uint8_t glyph_cnt; - uint8_t bbx_mode; - uint8_t bits_per_0; - uint8_t bits_per_1; - - /* offset 4 */ - uint8_t bits_per_char_width; - uint8_t bits_per_char_height; - uint8_t bits_per_char_x; - uint8_t bits_per_char_y; - uint8_t bits_per_delta_x; - - /* offset 9 */ - int8_t max_char_width; - int8_t max_char_height; /* overall height, NOT ascent. Instead ascent = max_char_height + y_offset */ - int8_t x_offset; - int8_t y_offset; - - /* offset 13 */ - int8_t ascent_A; - int8_t descent_g; - int8_t ascent_para; - int8_t descent_para; - - /* offset 17 */ - uint16_t start_pos_upper_A; - uint16_t start_pos_lower_a; -}; -typedef struct _u8g2_font_info_t u8g2_font_info_t; - -/* from ucglib... */ -struct _u8g2_font_decode_t -{ - const uint8_t *decode_ptr; /* pointer to the compressed data */ - - u8g2_uint_t target_x; - u8g2_uint_t target_y; - - int8_t x; /* local coordinates, (0,0) is upper left */ - int8_t y; - int8_t glyph_width; - int8_t glyph_height; - - uint8_t decode_bit_pos; /* bitpos inside a byte of the compressed data */ - uint8_t is_transparent; - uint8_t dir; /* direction */ -}; -typedef struct _u8g2_font_decode_t u8g2_font_decode_t; - - -struct u8g2_cb_struct -{ - u8g2_update_dimension_cb update; - u8g2_draw_l90_cb draw_l90; -}; - -typedef u8g2_uint_t (*u8g2_font_calc_vref_fnptr)(u8g2_t *u8g2); - - -struct u8g2_struct -{ - u8x8_t u8x8; - const u8g2_cb_t *cb; /* callback drawprocedures, can be replaced for rotation */ - - /* the following variables must be assigned during u8g2 setup */ - uint8_t *tile_buf_ptr; /* ptr to memory area with u8g2.display_info->tile_width * 8 * tile_buf_height bytes */ - uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ - uint8_t tile_curr_row; /* current row for picture loop */ - - /* the following variables are set by the update dimension callback */ - /* this is clipbox after rotation for the hvline procedures */ - u8g2_uint_t buf_x0; /* left corner of the buffer */ - u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ - u8g2_uint_t buf_y0; - u8g2_uint_t buf_y1; - - /* display dimensions for the user */ - u8g2_uint_t width; - u8g2_uint_t height; - - /* ths is the clip box for the user to check if a specific box has an intersection */ - u8g2_uint_t user_x0; /* left corner of the buffer */ - u8g2_uint_t user_x1; /* right corner of the buffer (excluded) */ - u8g2_uint_t user_y0; - u8g2_uint_t user_y1; - - /* information about the current font */ - const uint8_t *font; /* current font for all text procedures */ - u8g2_font_calc_vref_fnptr font_calc_vref; - u8g2_font_decode_t font_decode; /* new font decode structure */ - u8g2_font_info_t font_info; /* new font info structure */ - - uint8_t font_height_mode; - int8_t font_ref_ascent; - int8_t font_ref_descent; - - uint8_t draw_color; /* 0: clear pixel, 1: set pixel */ -}; - -#define u8g2_GetU8x8(u8g2) ((u8x8_t *)(u8g2)) - /*==========================================*/ @@ -549,12 +438,9 @@ void u8x8_SetupStdio(u8x8_t *u8x8); /*==========================================*/ /* u8x8_d_sdl_128x64.c */ void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); -void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); -void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); int u8g_sdl_get_key(void); - /*==========================================*/ /* u8x8_d_uc1701_dogs102.c */ uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index e3e9bac8..266c098e 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -2,7 +2,7 @@ u8x8_d_sdl_128x64.c */ -#include "u8x8.h" +#include "u8g2.h" #include "SDL.h" #include "SDL_video.h" #include diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index cd1a5c36..93bfce87 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -1,6 +1,6 @@ #include "u8g2.h" - +#include const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, @@ -212,6 +212,7 @@ int main(void) x = 50; y = 30; + for(;;) { @@ -225,6 +226,9 @@ int main(void) u8g2_SendBuffer(&u8g2); */ +#ifdef U8G2_WITH_HVLINE_COUNT + u8g2.hv_cnt = 0UL; +#endif /* U8G2_WITH_HVLINE_COUNT */ u8g2_FirstPage(&u8g2); i = 0; @@ -246,7 +250,11 @@ int main(void) i++; + } while( u8g2_NextPage(&u8g2) ); +#ifdef U8G2_WITH_HVLINE_COUNT + printf("hv cnt: %ld\n", u8g2.hv_cnt); +#endif /* U8G2_WITH_HVLINE_COUNT */ do { From e924452be2450912b5824c954c068f91d794d6ef Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 18:54:27 +0100 Subject: [PATCH 073/109] optimized clipping --- u8g2/csrc/u8g2.h | 1 + u8g2/csrc/u8g2_hvline.c | 53 ++++++++++++++++++++++++++++------------ u8g2/csrc/u8g2_setup.c | 34 ++++++++++++++++++++++++++ u8g2/csrc/u8x8.h | 1 + u8g2/sys/sdl/text/main.c | 13 +++++----- 5 files changed, 80 insertions(+), 22 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index fa9b8750..a2d31afd 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -189,6 +189,7 @@ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len extern const u8g2_cb_t u8g2_cb_r0; extern const u8g2_cb_t u8g2_cb_r1; extern const u8g2_cb_t u8g2_cb_r2; +extern const u8g2_cb_t u8g2_cb_r3; /*==========================================*/ diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 10b04fbe..5bb790d5 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -2,6 +2,15 @@ u8g2_hvline.c + + Calltree + void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) + u8g2->cb->draw_l90 + void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) + void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) + void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) + void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) + */ #include "u8g2.h" @@ -9,18 +18,21 @@ +/* + x,y position within the buffer +*/ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { uint8_t *ptr; uint8_t bit_pos, mask; uint16_t offset; - assert(x >= u8g2->buf_x0); - assert(x < u8g2->buf_x1); - assert(y >= u8g2->buf_y0); - assert(y < u8g2->buf_y1); + //assert(x >= u8g2->buf_x0); + assert(x < u8g2_GetU8x8(u8g2)->display_info->tile_width*8); + //assert(y >= u8g2->buf_y0); + assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); - y -= u8g2->tile_curr_row*8; + // y -= u8g2->tile_curr_row*8; ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ @@ -45,7 +57,7 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) } /* - x,y Upper left position of the line + x,y Upper left position of the line within the local buffer (not the display!) len length of the line in pixel, len must not be 0 dir 0: horizontal line (left to right) 1: vertical line (top to bottom) @@ -130,38 +142,49 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin len length of the line in pixel, len must not be 0 dir 0: horizontal line (left to right) 1: vertical line (top to bottom) - This function will clip the line and call u8g2_unsafe_draw_hv_line() + This function first adjusts the y position to the local buffer. Then it + will clip the line and call u8g2_unsafe_draw_hv_line() */ static void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { u8g2_uint_t a; + u8g2_uint_t w, h; + + y -= u8g2->tile_curr_row*8; + + h = u8g2->tile_buf_height; + h *= 8; + w = u8g2_GetU8x8(u8g2)->display_info->tile_width; + w *= 8; + if ( dir == 0 ) { - if ( y < u8g2->buf_y0 ) - return; - if ( y >= u8g2->buf_y1 ) + //if ( y < u8g2->buf_y0 ) + // return; + if ( y >= h ) return; a = x; a += len; - if ( u8g2_clip_intersection(&x, &a, u8g2->buf_x0, u8g2->buf_x1) == 0 ) + if ( u8g2_clip_intersection(&x, &a, 0, w) == 0 ) return; len = a; len -= x; } else { - if ( x < u8g2->buf_x0 ) - return; - if ( x >= u8g2->buf_x1 ) + //if ( x < u8g2->buf_x0 ) + // return; + if ( x >= w ) return; a = y; a += len; - if ( u8g2_clip_intersection(&y, &a, u8g2->buf_y0, u8g2->buf_y1) == 0 ) + if ( u8g2_clip_intersection(&y, &a, 0, h) == 0 ) return; len = a; len -= y; } + u8g2_unsafe_draw_hv_line(u8g2, x, y, len, dir); } diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index c745db01..ec780757 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -92,6 +92,24 @@ void u8g2_update_dimension_r2(u8g2_t *u8g2) u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } +void u8g2_update_dimension_r3(u8g2_t *u8g2) +{ + u8g2_uint_t t; + u8g2_update_dimension_common(u8g2); + + t = u8g2->width; + u8g2->width = u8g2->height; + u8g2->height = t; + + u8g2->user_x0 = u8g2->height - u8g2->buf_y1; + u8g2->user_x1 = u8g2->height - u8g2->buf_y0; + + u8g2->user_y0 = u8g2->buf_x0; + u8g2->user_y1 = u8g2->buf_x1; + + printf("x0=%d x1=%d y0=%d y1=%d\n", + u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +} /*============================================*/ extern void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); @@ -134,12 +152,28 @@ void u8g2_draw_l90_r2(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t le u8g2_draw_hv_line_4dir(u8g2, xx, yy, len, dir); } +void u8g2_draw_l90_r3(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + u8g2_uint_t xx, yy; + + xx = y; + + yy = u8g2->height; + yy -= x; + yy--; + + dir +=3; + dir &= 3; + u8g2_draw_hv_line_4dir(u8g2, xx, yy, len, dir); +} + /*============================================*/ const u8g2_cb_t u8g2_cb_r0 = { u8g2_update_dimension_r0, u8g2_draw_l90_r0 }; const u8g2_cb_t u8g2_cb_r1 = { u8g2_update_dimension_r1, u8g2_draw_l90_r1 }; const u8g2_cb_t u8g2_cb_r2 = { u8g2_update_dimension_r2, u8g2_draw_l90_r2 }; +const u8g2_cb_t u8g2_cb_r3 = { u8g2_update_dimension_r3, u8g2_draw_l90_r3 }; diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index a5c258f6..d462769c 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -66,6 +66,7 @@ #define U8X8_WITH_SET_FLIP_MODE /* Select 0 or 1 for the default flip mode. This is not affected by U8X8_WITH_FLIP_MODE */ +/* Note: Not all display types support a mirror functon for the frame buffer */ #define U8X8_DEFAULT_FLIP_MODE 0 /*==========================================*/ diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 93bfce87..257a668e 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -202,12 +202,10 @@ int main(void) int x, y; int k; int i; - u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r1); + u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r0); u8x8_display_Init(u8g2_GetU8x8(&u8g2)); - u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); - - + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); x = 50; @@ -216,6 +214,10 @@ int main(void) for(;;) { +#ifdef U8G2_WITH_HVLINE_COUNT + u8g2.hv_cnt = 0UL; +#endif /* U8G2_WITH_HVLINE_COUNT */ + /* u8g2_ClearBuffer(&u8g2); @@ -226,9 +228,6 @@ int main(void) u8g2_SendBuffer(&u8g2); */ -#ifdef U8G2_WITH_HVLINE_COUNT - u8g2.hv_cnt = 0UL; -#endif /* U8G2_WITH_HVLINE_COUNT */ u8g2_FirstPage(&u8g2); i = 0; From 7a04c77edbac576b3ae09ea7ae85a06a9517f9a2 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 20:38:15 +0100 Subject: [PATCH 074/109] clip optimization --- u8g2/csrc/u8g2.h | 7 ++++++- u8g2/csrc/u8g2_hvline.c | 27 ++++++++++++--------------- u8g2/csrc/u8g2_setup.c | 19 ++++++++++++++----- u8g2/sys/sdl/text/main.c | 2 +- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index a2d31afd..7e10f196 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -131,6 +131,11 @@ struct u8g2_struct uint8_t tile_buf_height; /* height of the tile memory area in tile rows */ uint8_t tile_curr_row; /* current row for picture loop */ + /* dimension of the buffer in pixel */ + u8g2_uint_t pixel_buf_width; /* equal to tile_buf_height*8 */ + u8g2_uint_t pixel_buf_height; /* u8g2.display_info->tile_width*8 */ + u8g2_uint_t pixel_curr_row; /* u8g2.tile_curr_row*8 */ + /* the following variables are set by the update dimension callback */ /* this is clipbox after rotation for the hvline procedures */ u8g2_uint_t buf_x0; /* left corner of the buffer */ @@ -138,7 +143,7 @@ struct u8g2_struct u8g2_uint_t buf_y0; u8g2_uint_t buf_y1; - /* display dimensions for the user */ + /* display dimensions in pixel for the user, calculated inu8g2_update_dimension_common(), used in u8g2_draw_hv_line_2dir() */ u8g2_uint_t width; u8g2_uint_t height; diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 5bb790d5..dd384323 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -93,8 +93,11 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, a <= b (this is checked and handled correctly) c <= d (this is not checked) will return 0 if there is no intersection and if a > b + + optimized clipping: c is set to 0 */ -static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uint_t c, u8g2_uint_t d) +//static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uint_t c, u8g2_uint_t d) +static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uint_t d) { u8g2_uint_t a = *ap; u8g2_uint_t b = *bp; @@ -125,10 +128,10 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin if ( a >= d ) return 0; - if ( b <= c ) + if ( b <= 0 ) // was b <= c, could be replaced with b == 0 return 0; - if ( a < c ) - *ap = c; + //if ( a < c ) // never true with c == 0 + // *ap = c; if ( b > d ) *bp = d; @@ -149,37 +152,31 @@ static uint8_t u8g2_clip_intersection(u8g2_uint_t *ap, u8g2_uint_t *bp, u8g2_uin static void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) { u8g2_uint_t a; - u8g2_uint_t w, h; + register u8g2_uint_t w, h; y -= u8g2->tile_curr_row*8; - h = u8g2->tile_buf_height; - h *= 8; - w = u8g2_GetU8x8(u8g2)->display_info->tile_width; - w *= 8; + h = u8g2->pixel_buf_height; + w = u8g2->pixel_buf_width; if ( dir == 0 ) { - //if ( y < u8g2->buf_y0 ) - // return; if ( y >= h ) return; a = x; a += len; - if ( u8g2_clip_intersection(&x, &a, 0, w) == 0 ) + if ( u8g2_clip_intersection(&x, &a, w) == 0 ) return; len = a; len -= x; } else { - //if ( x < u8g2->buf_x0 ) - // return; if ( x >= w ) return; a = y; a += len; - if ( u8g2_clip_intersection(&y, &a, 0, h) == 0 ) + if ( u8g2_clip_intersection(&y, &a, h) == 0 ) return; len = a; len -= y; diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index ec780757..59d5508b 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -24,24 +24,33 @@ static void u8g2_update_dimension_common(u8g2_t *u8g2) u8g2_uint_t h, w; h = u8g2->tile_buf_height; + h *= 8; + u8g2->pixel_buf_height = h; + + w = u8g2_GetU8x8(u8g2)->display_info->tile_width; + w *= 8; + u8g2->pixel_buf_width = w; + + h = u8g2->tile_curr_row; + h *= 8; + u8g2->pixel_curr_row = h; + h = u8g2->tile_buf_height; /* handle the case, where the buffer is larger than the (remaining) part of the display */ if ( h + u8g2->tile_curr_row > u8g2_GetU8x8(u8g2)->display_info->tile_height ) h = u8g2_GetU8x8(u8g2)->display_info->tile_height - u8g2->tile_curr_row; - h *= 8; - w = u8g2_GetU8x8(u8g2)->display_info->tile_width; - w *= 8; + u8g2->buf_x0 = 0; u8g2->buf_y0 = u8g2->tile_curr_row; u8g2->buf_y0 *= 8; u8g2->buf_x1 = u8g2->buf_x0; - u8g2->buf_x1 += w; + u8g2->buf_x1 += u8g2->pixel_buf_width; u8g2->buf_y1 = u8g2->buf_y0; u8g2->buf_y1 += h; - u8g2->width = w; + u8g2->width = u8g2->pixel_buf_width; u8g2->height = u8g2_GetU8x8(u8g2)->display_info->tile_height * 8; } diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 257a668e..d0ee0d2f 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -203,7 +203,7 @@ int main(void) int k; int i; - u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r0); + u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r2); u8x8_display_Init(u8g2_GetU8x8(&u8g2)); u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); From 0f75d5fba355fa9afc22bfdada1152c13f7984b8 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 21:06:18 +0100 Subject: [PATCH 075/109] font roation makro, code size optimization --- u8g2/csrc/u8g2.h | 9 ++++-- u8g2/csrc/u8g2_font.c | 44 ++++++++++++++++++++++----- u8g2/csrc/u8g2_setup.c | 65 ++++++++++++++++++---------------------- u8g2/sys/sdl/text/main.c | 2 +- 4 files changed, 74 insertions(+), 46 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 7e10f196..4b0a0a3b 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -23,6 +23,11 @@ #include "u8x8.h" +/* + The following macro enables all four drawing directions for glyphs and strings. + If this macro is not defined, than a string can be drawn only in horizontal direction. +*/ +#define U8G2_WITH_FONT_ROTATION /* The following macro activates the early intersection check with the current visible area. @@ -138,8 +143,8 @@ struct u8g2_struct /* the following variables are set by the update dimension callback */ /* this is clipbox after rotation for the hvline procedures */ - u8g2_uint_t buf_x0; /* left corner of the buffer */ - u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ + //u8g2_uint_t buf_x0; /* left corner of the buffer */ + //u8g2_uint_t buf_x1; /* right corner of the buffer (excluded) */ u8g2_uint_t buf_y0; u8g2_uint_t buf_y1; diff --git a/u8g2/csrc/u8g2_font.c b/u8g2/csrc/u8g2_font.c index bc70f9ff..331e1934 100644 --- a/u8g2/csrc/u8g2_font.c +++ b/u8g2/csrc/u8g2_font.c @@ -242,6 +242,7 @@ int8_t u8g2_font_decode_get_signed_bits(u8g2_font_decode_t *f, uint8_t cnt) static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) { +#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -258,11 +259,15 @@ static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t break; } return dy; +#else + return dy+y; +#endif } static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) { +#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -279,6 +284,9 @@ static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t break; } return dx; +#else + return dx+x; +#endif } @@ -354,7 +362,12 @@ void u8g2_font_decode_len(u8g2_t *u8g2, uint8_t len, uint8_t is_foreground) x, y, current, - /* dir */ decode->dir); +#ifdef U8G2_WITH_FONT_ROTATION + /* dir */ decode->dir +#else + 0 +#endif + ); } else if ( decode->is_transparent == 0 ) { @@ -363,7 +376,12 @@ void u8g2_font_decode_len(u8g2_t *u8g2, uint8_t len, uint8_t is_foreground) x, y, current, - /* dir */ decode->dir); +#ifdef U8G2_WITH_FONT_ROTATION + /* dir */ decode->dir +#else + 0 +#endif + ); } /* check, whether the end of the run length code has been reached */ @@ -429,7 +447,7 @@ int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) decode->target_y = u8g2_add_vector_y(decode->target_y, x, -(h+y), decode->dir); //u8g2_add_vector(&(decode->target_x), &(decode->target_y), x, -(h+y), decode->dir); -#ifdef U8G2_WITH_INTERSECTION +#ifdef U8G2_WITH_INTERSECTION { u8g2_uint_t x0, x1, y0, y1; x0 = decode->target_x; @@ -437,6 +455,7 @@ int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) x1 = x0; y1 = y0; +#ifdef U8G2_WITH_FONT_ROTATION switch(decode->dir) { case 0: @@ -454,13 +473,17 @@ int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) case 3: x1 += h; y0 -= decode->glyph_width; - break; - + break; } +#else /* U8G2_WITH_FONT_ROTATION */ + x1 += decode->glyph_width; + y1 += h; +#endif + if ( u8g2_IsIntersection(u8g2, x0, y0, x1, y1) == 0 ) return d; } -#endif +#endif /* U8G2_WITH_INTERSECTION */ /* reset local x/y position */ decode->x = 0; @@ -572,6 +595,7 @@ void u8g2_SetFontMode(u8g2_t *u8g2, uint8_t is_transparent) u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, uint8_t encoding) { +#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -587,6 +611,9 @@ u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t d x += u8g2->font_calc_vref(u8g2); break; } +#else + y += u8g2->font_calc_vref(u8g2); +#endif return u8g2_font_draw_glyph(u8g2, x, y, dir, encoding); } @@ -598,6 +625,7 @@ u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t { delta = u8g2_DrawGlyph(u8g2, x, y, dir, (uint8_t)*str); +#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -613,7 +641,9 @@ u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t y -= delta; break; } - +#else + x += delta; +#endif sum += delta; str++; } diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 59d5508b..931ef51d 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -21,45 +21,42 @@ static void u8g2_update_dimension_common(u8g2_t *u8g2) { - u8g2_uint_t h, w; + u8g2_uint_t t; - h = u8g2->tile_buf_height; - h *= 8; - u8g2->pixel_buf_height = h; + t = u8g2->tile_buf_height; + t *= 8; + u8g2->pixel_buf_height = t; - w = u8g2_GetU8x8(u8g2)->display_info->tile_width; - w *= 8; - u8g2->pixel_buf_width = w; + t = u8g2_GetU8x8(u8g2)->display_info->tile_width; + t *= 8; + u8g2->pixel_buf_width = t; - h = u8g2->tile_curr_row; - h *= 8; - u8g2->pixel_curr_row = h; + t = u8g2->tile_curr_row; + t *= 8; + u8g2->pixel_curr_row = t; - h = u8g2->tile_buf_height; + t = u8g2->tile_buf_height; /* handle the case, where the buffer is larger than the (remaining) part of the display */ - if ( h + u8g2->tile_curr_row > u8g2_GetU8x8(u8g2)->display_info->tile_height ) - h = u8g2_GetU8x8(u8g2)->display_info->tile_height - u8g2->tile_curr_row; - h *= 8; - - u8g2->buf_x0 = 0; - u8g2->buf_y0 = u8g2->tile_curr_row; - u8g2->buf_y0 *= 8; + if ( t + u8g2->tile_curr_row > u8g2_GetU8x8(u8g2)->display_info->tile_height ) + t = u8g2_GetU8x8(u8g2)->display_info->tile_height - u8g2->tile_curr_row; + t *= 8; - u8g2->buf_x1 = u8g2->buf_x0; - u8g2->buf_x1 += u8g2->pixel_buf_width; + u8g2->buf_y0 = u8g2->pixel_curr_row; u8g2->buf_y1 = u8g2->buf_y0; - u8g2->buf_y1 += h; + u8g2->buf_y1 += t; u8g2->width = u8g2->pixel_buf_width; - u8g2->height = u8g2_GetU8x8(u8g2)->display_info->tile_height * 8; + t = u8g2_GetU8x8(u8g2)->display_info->tile_height; + t *= 8; + u8g2->height = t; } void u8g2_update_dimension_r0(u8g2_t *u8g2) { u8g2_update_dimension_common(u8g2); - u8g2->user_x0 = u8g2->buf_x0; - u8g2->user_x1 = u8g2->buf_x1; + u8g2->user_x0 = 0; + u8g2->user_x1 = u8g2->pixel_buf_width; u8g2->user_y0 = u8g2->buf_y0; u8g2->user_y1 = u8g2->buf_y1; @@ -70,18 +67,16 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) void u8g2_update_dimension_r1(u8g2_t *u8g2) { - u8g2_uint_t t; u8g2_update_dimension_common(u8g2); - t = u8g2->width; u8g2->width = u8g2->height; - u8g2->height = t; + u8g2->height = u8g2->pixel_buf_width; u8g2->user_x0 = u8g2->buf_y0; u8g2->user_x1 = u8g2->buf_y1; - u8g2->user_y0 = u8g2->buf_x0; - u8g2->user_y1 = u8g2->buf_x1; + u8g2->user_y0 = 0; + u8g2->user_y1 = u8g2->pixel_buf_width; printf("x0=%d x1=%d y0=%d y1=%d\n", u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); @@ -91,8 +86,8 @@ void u8g2_update_dimension_r2(u8g2_t *u8g2) { u8g2_update_dimension_common(u8g2); - u8g2->user_x0 = u8g2->buf_x0; - u8g2->user_x1 = u8g2->buf_x1; + u8g2->user_x0 = 0; + u8g2->user_x1 = u8g2->pixel_buf_width; u8g2->user_y0 = u8g2->height - u8g2->buf_y1; u8g2->user_y1 = u8g2->height - u8g2->buf_y0; @@ -103,18 +98,16 @@ void u8g2_update_dimension_r2(u8g2_t *u8g2) void u8g2_update_dimension_r3(u8g2_t *u8g2) { - u8g2_uint_t t; u8g2_update_dimension_common(u8g2); - t = u8g2->width; u8g2->width = u8g2->height; - u8g2->height = t; + u8g2->height = u8g2->pixel_buf_width; u8g2->user_x0 = u8g2->height - u8g2->buf_y1; u8g2->user_x1 = u8g2->height - u8g2->buf_y0; - u8g2->user_y0 = u8g2->buf_x0; - u8g2->user_y1 = u8g2->buf_x1; + u8g2->user_y0 = 0; + u8g2->user_y1 = u8g2->pixel_buf_width; printf("x0=%d x1=%d y0=%d y1=%d\n", u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index d0ee0d2f..257a668e 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -203,7 +203,7 @@ int main(void) int k; int i; - u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r2); + u8g2_Setup_SDL_128x64_4(&u8g2, &u8g2_cb_r0); u8x8_display_Init(u8g2_GetU8x8(&u8g2)); u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); From df04a5106daaba16ccfa9a52162aa5478c4bd736 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 25 Oct 2015 23:35:40 +0100 Subject: [PATCH 076/109] FONT_ROTATION macro --- u8g2/csrc/u8g2.h | 24 ++++++++------ u8g2/csrc/u8g2_font.c | 43 ++++++++++++++++--------- u8g2/csrc/u8g2_setup.c | 17 ++++++++++ u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c | 16 ++------- u8g2/sys/sdl/text/main.c | 25 ++++++++------ 5 files changed, 77 insertions(+), 48 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 4b0a0a3b..be5333b7 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -112,7 +112,9 @@ struct _u8g2_font_decode_t uint8_t decode_bit_pos; /* bitpos inside a byte of the compressed data */ uint8_t is_transparent; +#ifdef U8G2_WITH_FONT_ROTATION uint8_t dir; /* direction */ +#endif }; typedef struct _u8g2_font_decode_t u8g2_font_decode_t; @@ -163,7 +165,7 @@ struct u8g2_struct u8g2_font_calc_vref_fnptr font_calc_vref; u8g2_font_decode_t font_decode; /* new font decode structure */ u8g2_font_info_t font_info; /* new font info structure */ - + uint8_t font_height_mode; int8_t font_ref_ascent; int8_t font_ref_descent; @@ -177,6 +179,16 @@ struct u8g2_struct #define u8g2_GetU8x8(u8g2) ((u8x8_t *)(u8g2)) +/*==========================================*/ +/* u8g2_setup.c */ + +extern const u8g2_cb_t u8g2_cb_r0; +extern const u8g2_cb_t u8g2_cb_r1; +extern const u8g2_cb_t u8g2_cb_r2; +extern const u8g2_cb_t u8g2_cb_r3; + +void u8g2_Setup(u8g2_t *u8g2, uint8_t *buf, uint8_t tile_buf_height, const u8g2_cb_t *u8g2_cb); + /*==========================================*/ @@ -193,13 +205,6 @@ uint8_t u8g2_NextPage(u8g2_t *u8g2); /* u8g2_hvline.c */ void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir); -/*==========================================*/ -/* u8g2_setup.c */ - -extern const u8g2_cb_t u8g2_cb_r0; -extern const u8g2_cb_t u8g2_cb_r1; -extern const u8g2_cb_t u8g2_cb_r2; -extern const u8g2_cb_t u8g2_cb_r3; /*==========================================*/ @@ -218,7 +223,8 @@ uint8_t u8g2_IsIntersection(u8g2_t *u8g2, u8g2_uint_t x0, u8g2_uint_t y0, u8g2_u #define U8G2_FONT_HEIGHT_MODE_ALL 2 void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font); -u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, const char *str); +void u8g2_SetFontDirection(u8g2_t *u8g2, uint8_t dir); +u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *str); /*==========================================*/ /* u8x8_d_sdl_128x64.c */ diff --git a/u8g2/csrc/u8g2_font.c b/u8g2/csrc/u8g2_font.c index 331e1934..c4a17c7a 100644 --- a/u8g2/csrc/u8g2_font.c +++ b/u8g2/csrc/u8g2_font.c @@ -239,10 +239,10 @@ int8_t u8g2_font_decode_get_signed_bits(u8g2_font_decode_t *f, uint8_t cnt) } +#ifdef U8G2_WITH_FONT_ROTATION static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t dir) { -#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -259,15 +259,11 @@ static u8g2_uint_t u8g2_add_vector_y(u8g2_uint_t dy, int8_t x, int8_t y, uint8_t break; } return dy; -#else - return dy+y; -#endif } static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) U8G2_NOINLINE; static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t dir) { -#ifdef U8G2_WITH_FONT_ROTATION switch(dir) { case 0: @@ -284,10 +280,8 @@ static u8g2_uint_t u8g2_add_vector_x(u8g2_uint_t dx, int8_t x, int8_t y, uint8_t break; } return dx; -#else - return dx+x; -#endif } +#endif @@ -351,8 +345,13 @@ void u8g2_font_decode_len(u8g2_t *u8g2, uint8_t len, uint8_t is_foreground) y = decode->target_y; /* apply rotation */ +#ifdef U8G2_WITH_FONT_ROTATION x = u8g2_add_vector_x(x, lx, ly, decode->dir); y = u8g2_add_vector_y(y, lx, ly, decode->dir); +#else + x += lx; + y += ly; +#endif /* draw foreground and background (if required) */ if ( is_foreground ) @@ -443,8 +442,13 @@ int8_t u8g2_font_decode_glyph(u8g2_t *u8g2, const uint8_t *glyph_data) if ( decode->glyph_width > 0 ) { +#ifdef U8G2_WITH_FONT_ROTATION decode->target_x = u8g2_add_vector_x(decode->target_x, x, -(h+y), decode->dir); decode->target_y = u8g2_add_vector_y(decode->target_y, x, -(h+y), decode->dir); +#else + decode->target_x += x; + decode->target_y -= h+y; +#endif //u8g2_add_vector(&(decode->target_x), &(decode->target_y), x, -(h+y), decode->dir); #ifdef U8G2_WITH_INTERSECTION @@ -542,13 +546,13 @@ const uint8_t *u8g2_font_get_glyph_data(u8g2_t *u8g2, uint8_t encoding) return NULL; } -u8g2_uint_t u8g2_font_draw_glyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, uint8_t encoding) +static u8g2_uint_t u8g2_font_draw_glyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t encoding) { u8g2_uint_t dx = 0; u8g2->font_decode.target_x = x; u8g2->font_decode.target_y = y; //u8g2->font_decode.is_transparent = is_transparent; this is already set - u8g2->font_decode.dir = dir; + //u8g2->font_decode.dir = dir; const uint8_t *glyph_data = u8g2_font_get_glyph_data(u8g2, encoding); if ( glyph_data != NULL ) { @@ -593,10 +597,10 @@ void u8g2_SetFontMode(u8g2_t *u8g2, uint8_t is_transparent) u8g2->font_decode.is_transparent = is_transparent; // new font procedures } -u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, uint8_t encoding) +u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t encoding) { #ifdef U8G2_WITH_FONT_ROTATION - switch(dir) + switch(u8g2->font_decode.dir) { case 0: y += u8g2->font_calc_vref(u8g2); @@ -614,19 +618,19 @@ u8g2_uint_t u8g2_DrawGlyph(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t d #else y += u8g2->font_calc_vref(u8g2); #endif - return u8g2_font_draw_glyph(u8g2, x, y, dir, encoding); + return u8g2_font_draw_glyph(u8g2, x, y, encoding); } -u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t dir, const char *str) +u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *str) { u8g2_uint_t delta, sum; sum = 0; while( *str != '\0' ) { - delta = u8g2_DrawGlyph(u8g2, x, y, dir, (uint8_t)*str); + delta = u8g2_DrawGlyph(u8g2, x, y, (uint8_t)*str); #ifdef U8G2_WITH_FONT_ROTATION - switch(dir) + switch(u8g2->font_decode.dir) { case 0: x += delta; @@ -790,3 +794,10 @@ u8g2_uint_t u8g2_GetStrWidth(u8g2_t *u8g2, const char *s) } return w; } + +void u8g2_SetFontDirection(u8g2_t *u8g2, uint8_t dir) +{ +#ifdef U8G2_WITH_FONT_ROTATION + u8g2->font_decode.dir = dir; +#endif +} \ No newline at end of file diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 931ef51d..799922eb 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -7,6 +7,23 @@ #include "u8g2.h" #include +/*============================================*/ + +void u8g2_Setup(u8g2_t *u8g2, uint8_t *buf, uint8_t tile_buf_height, const u8g2_cb_t *u8g2_cb) +{ + u8g2->tile_buf_ptr = buf; + u8g2->tile_buf_height = tile_buf_height; + + u8g2->tile_curr_row = 0; + u8g2->draw_color = 1; + + u8g2->cb = u8g2_cb; + u8g2->cb->update(u8g2); + +#ifdef U8G2_WITH_FONT_ROTATION + u8g2->font_decode.dir = 0; +#endif +} /*============================================*/ diff --git a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c index 266c098e..40f700b6 100644 --- a/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c +++ b/u8g2/sys/sdl/common/u8x8_d_sdl_128x64.c @@ -273,13 +273,7 @@ void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) static uint8_t buf[128*8]; u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2)); - u8g2->tile_buf_ptr = buf; - u8g2->tile_buf_height = 8; - u8g2->tile_curr_row = 0; - u8g2->draw_color = 1; - - u8g2->cb = u8g2_cb; - u8g2->cb->update(u8g2); + u8g2_Setup(u8g2, buf, 8, u8g2_cb); } @@ -289,13 +283,7 @@ void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) static uint8_t buf[128*3]; u8x8_Setup_SDL_128x64(u8g2_GetU8x8(u8g2)); - u8g2->tile_buf_ptr = buf; - u8g2->tile_buf_height = 3; - u8g2->tile_curr_row = 0; - u8g2->draw_color = 1; - - u8g2->cb = u8g2_cb; - u8g2->cb->update(u8g2); + u8g2_Setup(u8g2, buf, 3, u8g2_cb); } diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text/main.c index 257a668e..b54411ef 100644 --- a/u8g2/sys/sdl/text/main.c +++ b/u8g2/sys/sdl/text/main.c @@ -221,10 +221,14 @@ int main(void) /* u8g2_ClearBuffer(&u8g2); - u8g2_DrawString(&u8g2, x, y, 0, "ABC"); - u8g2_DrawString(&u8g2, x, y, 1, "abc"); - u8g2_DrawString(&u8g2, x, y, 2, "abc"); - u8g2_DrawString(&u8g2, x, y, 3, "abc"); + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); u8g2_SendBuffer(&u8g2); */ @@ -233,11 +237,14 @@ int main(void) i = 0; do { - u8g2_DrawString(&u8g2, x, y, 0, "ABC"); - u8g2_DrawString(&u8g2, x, y, 1, "abc"); - u8g2_DrawString(&u8g2, x, y, 2, "abc"); - u8g2_DrawString(&u8g2, x, y, 3, "abc"); - + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); if ( i == 1 ) { u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); From 128705041adbb25659bfe24e177476779a97fe77 Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 26 Oct 2015 06:30:20 +0100 Subject: [PATCH 077/109] comments --- u8g2/csrc/u8x8.h | 1 - 1 file changed, 1 deletion(-) diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index d462769c..6a7cdf33 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -186,7 +186,6 @@ struct u8x8_display_info_struct struct u8x8_struct { - //u8x8_t *u8x8_root; /* root of the message call chain */ const u8x8_display_info_t *display_info; u8x8_msg_cb display_cb; u8x8_msg_cb cad_cb; From 26cfebd5f70f2bc33e0e57a0534ace1bd3ecf10d Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 26 Oct 2015 21:22:13 +0100 Subject: [PATCH 078/109] fixed ssd1306 tile writing --- u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c | 3 +++ u8g2/csrc/u8x8_d_uc1701_dogs102.c | 11 +---------- u8g2/sys/arduino/test/test.ino | 10 +++++----- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c index 35e47073..90d70b39 100644 --- a/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c +++ b/u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c @@ -138,12 +138,15 @@ uint8_t u8x8_d_ssd1306_128x64_noname(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, { c = ((u8x8_tile_t *)arg_ptr)->cnt; ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + u8x8_cad_SendData(u8x8, c*8, ptr); /* note: SendData can not handle more than 255 bytes */ + /* do { u8x8_cad_SendData(u8x8, 8, ptr); ptr += 8; c--; } while( c > 0 ); + */ arg_int--; } while( arg_int > 0 ); diff --git a/u8g2/csrc/u8x8_d_uc1701_dogs102.c b/u8g2/csrc/u8x8_d_uc1701_dogs102.c index 90154866..524c70e3 100644 --- a/u8g2/csrc/u8x8_d_uc1701_dogs102.c +++ b/u8g2/csrc/u8x8_d_uc1701_dogs102.c @@ -145,16 +145,7 @@ uint8_t u8x8_d_uc1701_dogs102(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void * { c = ((u8x8_tile_t *)arg_ptr)->cnt; ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; - - u8x8_cad_SendData(u8x8, c*8, ptr); - /* - do - { - u8x8_cad_SendData(u8x8, 8, ptr); - ptr += 8; - c--; - } while( c > 0 ); - */ + u8x8_cad_SendData(u8x8, c*8, ptr); /* note: SendData can not handle more than 255 bytes */ arg_int--; } while( arg_int > 0 ); diff --git a/u8g2/sys/arduino/test/test.ino b/u8g2/sys/arduino/test/test.ino index 9eb86152..b7b3878c 100644 --- a/u8g2/sys/arduino/test/test.ino +++ b/u8g2/sys/arduino/test/test.ino @@ -183,8 +183,8 @@ void u8x8_Setup_SSD1306_128x64_NONAME(u8x8_t *u8x8) /* setup specific callbacks */ u8x8->display_cb = u8x8_d_ssd1306_128x64_noname; u8x8->cad_cb = u8x8_cad_001; - //u8x8->byte_cb = u8x8_byte_arduino_hw_spi; - u8x8->byte_cb = u8x8_byte_8bit_sw_spi; + u8x8->byte_cb = u8x8_byte_arduino_hw_spi; + //u8x8->byte_cb = u8x8_byte_8bit_sw_spi; u8x8->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; /* setup display info */ @@ -197,14 +197,14 @@ uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; void setup(void) { - u8x8_Setup_UC1701_DOGS102(&u8g2); - //u8x8_Setup_SSD1306_128x64_NONAME(&u8g2); + //u8x8_Setup_UC1701_DOGS102(&u8g2); + u8x8_Setup_SSD1306_128x64_NONAME(&u8g2); } void loop(void) { u8x8_display_Init(&u8g2); - u8x8_display_SetFlipMode(&u8g2, 1); + //u8x8_display_SetFlipMode(&u8g2, 1); for(;;) From 3aee37d6401a8f9120f8f2209c369f5e89eb111d Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 27 Oct 2015 06:19:33 +0100 Subject: [PATCH 079/109] Arduino u8g2 Example --- u8g2/csrc/u8g2.h | 23 +- u8g2/csrc/u8g2_setup.c | 16 +- u8g2/sys/arduino/text/Makefile.165.uno | 285 +++++++++++++++++ u8g2/sys/arduino/text/text.ino | 408 +++++++++++++++++++++++++ 4 files changed, 722 insertions(+), 10 deletions(-) create mode 100644 u8g2/sys/arduino/text/Makefile.165.uno create mode 100644 u8g2/sys/arduino/text/text.ino diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index be5333b7..cfb84fad 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -12,7 +12,13 @@ setup tile buffer - + Arduino Uno Text Example +> FONT_ROTATION INTERSECTION text data bss dec hex +> x x 7450 104 1116 8670 21de +> - x 7132 104 1115 8351 209f +> x - 7230 104 1116 8450 2102 +> - - 7010 104 1115 8229 2025 + */ @@ -42,7 +48,7 @@ Internal performance test for the effect of enabling U8G2_WITH_INTERSECTION Should not be defined for production code */ -#define U8G2_WITH_HVLINE_COUNT +//#define U8G2_WITH_HVLINE_COUNT /*==========================================*/ @@ -53,6 +59,13 @@ # define U8G2_NOINLINE #endif +/*==========================================*/ +/* C++ compatible */ + +#ifdef __cplusplus +extern "C" { +#endif + /*==========================================*/ typedef struct u8g2_struct u8g2_t; @@ -231,6 +244,12 @@ u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const ch void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +/*==========================================*/ +/* C++ compatible */ + +#ifdef __cplusplus +} +#endif #endif diff --git a/u8g2/csrc/u8g2_setup.c b/u8g2/csrc/u8g2_setup.c index 799922eb..34b0600c 100644 --- a/u8g2/csrc/u8g2_setup.c +++ b/u8g2/csrc/u8g2_setup.c @@ -78,8 +78,8 @@ void u8g2_update_dimension_r0(u8g2_t *u8g2) u8g2->user_y0 = u8g2->buf_y0; u8g2->user_y1 = u8g2->buf_y1; - printf("x0=%d x1=%d y0=%d y1=%d\n", - u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +// printf("x0=%d x1=%d y0=%d y1=%d\n", +// u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } void u8g2_update_dimension_r1(u8g2_t *u8g2) @@ -95,8 +95,8 @@ void u8g2_update_dimension_r1(u8g2_t *u8g2) u8g2->user_y0 = 0; u8g2->user_y1 = u8g2->pixel_buf_width; - printf("x0=%d x1=%d y0=%d y1=%d\n", - u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +// printf("x0=%d x1=%d y0=%d y1=%d\n", +// u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } void u8g2_update_dimension_r2(u8g2_t *u8g2) @@ -109,8 +109,8 @@ void u8g2_update_dimension_r2(u8g2_t *u8g2) u8g2->user_y0 = u8g2->height - u8g2->buf_y1; u8g2->user_y1 = u8g2->height - u8g2->buf_y0; - printf("x0=%d x1=%d y0=%d y1=%d\n", - u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +// printf("x0=%d x1=%d y0=%d y1=%d\n", +// u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } void u8g2_update_dimension_r3(u8g2_t *u8g2) @@ -126,8 +126,8 @@ void u8g2_update_dimension_r3(u8g2_t *u8g2) u8g2->user_y0 = 0; u8g2->user_y1 = u8g2->pixel_buf_width; - printf("x0=%d x1=%d y0=%d y1=%d\n", - u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); +// printf("x0=%d x1=%d y0=%d y1=%d\n", +// u8g2->user_x0, u8g2->user_x1, u8g2->user_y0, u8g2->user_y1); } /*============================================*/ diff --git a/u8g2/sys/arduino/text/Makefile.165.uno b/u8g2/sys/arduino/text/Makefile.165.uno new file mode 100644 index 00000000..ff49fd87 --- /dev/null +++ b/u8g2/sys/arduino/text/Makefile.165.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .ino file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +#U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +#U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +INOSRC:=$(shell ls *.ino) +TARGETNAME=$(basename $(INOSRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(INOSRC:.ino=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .ino + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.ino + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/u8g2/sys/arduino/text/text.ino b/u8g2/sys/arduino/text/text.ino new file mode 100644 index 00000000..171d7945 --- /dev/null +++ b/u8g2/sys/arduino/text/text.ino @@ -0,0 +1,408 @@ + + + +#include +#include +#include "u8g2.h" + +/* + Fontname: FreeType-Amstrad CPC extended-Medium-R-Normal--8-80-72-72-P-64-ISO10646-1 + Copyright: Copyright ruboku 2008 + Glyphs: 95/196 + BBX Build Mode: 3 +*/ +//#include "u8x2.h" + +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +const uint8_t u8g2_font_helvB18_tr[2245] U8X8_FONT_SECTION("u8g2_font_helvB18_tr") = { + 95,0,4,3,5,5,3,5,6,23,24,0,251,19,251,19, + 251,2,234,6,37,32,6,0,48,154,0,33,10,99,26,158, + 240,23,234,14,4,34,11,197,184,167,32,193,139,145,8,0, + 35,42,76,22,186,36,34,38,34,38,34,38,34,38,34,115, + 64,113,64,35,34,38,34,38,34,38,34,115,64,113,64,35, + 34,38,34,38,34,38,34,38,34,4,36,39,172,210,181,37, + 119,116,48,65,33,177,68,196,68,228,66,204,174,146,178,206, + 76,226,68,196,68,196,68,228,66,130,226,96,232,78,84,10, + 0,37,49,85,18,218,61,87,54,118,52,54,179,76,74,100, + 78,74,100,110,102,98,242,100,180,100,30,102,30,100,166,116, + 228,112,100,102,110,68,74,108,70,74,108,102,213,212,217,88, + 9,0,38,38,80,22,202,84,122,72,65,55,51,55,51,55, + 51,56,49,218,244,100,134,130,98,102,230,100,170,102,108,104, + 170,134,230,129,200,144,209,0,39,8,194,184,155,112,64,1, + 40,22,6,119,161,36,51,50,51,50,51,35,179,255,72,104, + 102,104,102,104,72,0,41,22,6,119,161,32,180,102,104,102, + 72,104,102,255,70,102,201,204,200,140,16,0,42,16,232,148, + 171,35,38,35,33,113,48,66,35,162,5,0,43,14,140,53, + 190,37,170,171,131,7,83,162,186,2,44,10,195,184,157,112, + 32,33,65,1,45,7,103,208,162,240,1,46,7,99,24,158, + 112,32,47,18,103,22,162,165,145,148,34,41,141,164,20,73, + 41,146,82,5,48,27,76,18,182,99,117,16,67,66,50,52, + 50,52,49,230,159,77,12,141,12,141,176,57,136,178,1,49, + 12,71,26,182,180,230,224,128,104,255,15,50,27,76,18,182, + 83,117,32,51,67,49,53,49,102,54,57,56,72,199,172,140, + 142,225,228,193,131,1,51,31,76,18,182,83,117,32,179,100, + 106,98,106,98,106,114,112,172,238,114,116,210,204,138,98,134, + 228,96,200,6,0,52,27,76,18,182,55,200,174,153,196,212, + 196,148,200,144,204,54,66,35,67,35,7,15,230,38,55,1, + 53,30,76,18,182,113,48,114,48,50,185,229,65,208,129,204, + 12,229,232,228,164,153,213,65,12,201,129,148,13,0,54,32, + 76,18,182,84,117,32,66,51,50,101,102,185,130,232,96,164, + 132,130,104,98,204,217,196,208,8,155,131,40,27,0,55,24, + 76,18,182,240,193,32,225,202,193,201,193,201,193,201,65,194, + 201,65,194,201,57,0,56,35,76,18,182,68,118,16,52,50, + 51,52,50,52,50,52,50,52,51,50,101,117,16,51,52,49, + 230,217,196,208,200,193,144,13,0,57,32,76,18,182,99,116, + 32,67,66,65,52,49,230,217,17,5,73,197,1,77,197,228, + 164,213,4,73,201,129,84,17,0,58,10,195,25,158,112,32, + 15,121,32,59,13,35,186,157,112,32,15,121,32,33,65,1, + 60,14,141,49,190,58,88,214,25,37,109,105,167,3,61,11, + 170,184,186,240,192,244,224,192,0,62,13,141,53,186,48,218, + 91,74,178,30,142,2,63,24,107,26,190,99,115,32,66,114, + 16,100,101,68,55,71,70,183,112,123,4,131,139,0,64,65, + 214,150,225,119,32,123,96,88,86,69,74,67,60,66,84,33, + 50,49,116,32,114,179,198,102,104,198,70,104,200,100,104,102, + 98,100,72,104,98,100,102,201,154,37,51,35,19,52,36,7, + 85,51,21,115,244,64,244,64,85,163,7,197,7,129,0,65, + 37,112,22,202,70,76,107,106,57,34,57,50,56,50,55,52, + 54,52,54,52,53,54,52,54,116,80,115,112,50,56,50,56, + 49,234,116,0,66,37,111,26,202,112,64,116,96,50,70,50, + 56,49,56,49,56,49,56,49,55,114,80,115,96,50,56,49, + 233,195,179,138,3,147,3,34,0,67,29,112,22,202,117,119, + 64,84,83,66,71,49,121,60,189,175,41,39,38,39,232,72, + 106,138,14,232,142,0,68,30,112,26,206,112,64,117,96,51, + 86,50,72,49,57,49,121,234,95,94,78,12,82,140,149,28, + 216,28,80,1,69,22,109,26,194,112,80,113,80,49,186,167, + 7,36,7,36,163,251,244,224,65,1,70,17,108,26,190,240, + 129,229,94,30,80,28,80,76,238,47,1,71,35,113,22,206, + 117,120,64,85,83,67,71,50,57,65,61,190,217,1,217,1, + 173,237,233,196,36,5,93,73,205,131,137,169,147,1,72,14, + 111,26,206,48,233,95,30,252,32,210,127,57,73,8,99,26, + 158,240,63,8,74,17,107,22,186,184,255,161,149,87,19,51, + 20,7,50,39,0,75,39,110,26,202,48,119,70,49,69,50, + 68,51,67,52,66,53,65,118,247,32,140,130,106,102,106,104, + 17,205,212,204,216,200,24,197,220,196,28,1,76,12,108,26, + 190,48,185,255,191,60,120,48,77,50,115,26,222,48,125,123, + 16,123,32,121,48,121,64,119,32,33,39,97,49,53,97,34, + 37,98,50,51,98,50,51,98,163,198,102,98,198,102,98,198, + 168,200,168,200,106,202,106,202,106,1,78,39,111,26,206,48, + 121,248,32,238,32,238,64,204,98,202,98,202,100,200,102,198, + 102,198,104,196,74,196,106,194,236,64,238,32,238,32,240,114, + 0,79,29,113,22,206,117,120,64,85,83,67,71,50,57,65, + 121,235,111,47,41,38,71,232,104,90,29,16,94,1,80,23, + 110,26,198,112,64,115,96,49,55,49,232,187,137,3,139,131, + 146,217,253,45,0,81,35,145,246,205,117,120,64,85,83,67, + 71,50,57,65,121,235,111,207,66,40,166,38,70,168,108,138, + 168,14,234,46,230,1,66,0,82,26,110,26,198,112,64,115, + 96,49,55,49,232,187,137,3,139,131,146,49,138,185,137,65, + 127,56,83,32,110,26,198,100,118,48,67,83,65,54,49,55, + 49,75,91,122,16,121,90,75,107,232,238,64,166,228,128,234, + 8,0,84,13,111,18,190,240,3,177,225,253,255,25,0,85, + 19,111,26,206,48,233,255,151,119,20,115,35,53,53,7,100, + 71,0,86,36,112,22,202,48,106,122,72,49,56,66,70,51, + 54,52,54,196,106,104,108,104,140,132,110,100,112,100,112,100, + 210,212,150,152,25,0,87,62,117,22,222,48,54,102,54,102, + 54,102,182,98,168,104,100,168,104,100,72,66,104,100,102,98, + 102,70,102,98,70,104,100,98,100,104,68,70,100,104,98,102, + 98,74,98,102,66,76,98,102,66,172,170,172,170,110,225,220, + 224,220,16,0,88,37,112,22,202,48,122,72,65,70,51,54, + 53,52,55,50,120,16,105,75,76,107,121,16,56,50,55,52, + 69,68,52,54,51,56,65,120,58,89,30,111,22,198,48,121, + 56,49,55,66,54,51,53,68,52,53,51,54,51,55,49,56, + 49,89,90,59,188,207,0,90,21,110,22,194,240,83,74,78, + 41,153,82,50,165,36,29,165,36,61,248,0,91,13,5,119, + 161,112,96,178,255,255,201,193,0,92,18,103,18,162,32,165, + 76,74,153,148,102,82,202,164,148,73,41,93,13,5,123,161, + 112,48,178,255,255,201,129,1,94,19,43,85,187,52,56,87, + 38,33,53,49,179,100,102,98,202,106,0,95,7,78,112,185, + 240,3,96,8,134,244,163,48,180,1,97,30,204,21,186,99, + 117,16,51,67,50,52,57,102,115,32,82,50,65,52,49,53, + 49,68,65,82,114,64,82,50,98,26,108,26,190,48,185,23, + 53,7,35,37,20,68,19,99,126,118,52,81,66,113,48,50, + 81,3,99,21,203,21,182,99,116,16,194,98,200,112,47,135, + 38,72,72,14,130,76,0,100,25,108,22,190,185,55,21,35, + 7,19,36,21,67,103,126,54,49,68,65,82,114,48,83,49, + 101,27,204,21,186,68,118,16,67,66,50,52,49,102,118,240, + 129,228,232,212,4,13,201,129,84,13,0,102,16,103,22,166, + 67,82,50,180,228,224,100,104,255,19,0,103,31,108,118,189, + 83,49,114,48,65,82,49,116,230,103,19,67,20,36,37,7, + 51,21,147,102,71,35,7,67,54,0,104,17,107,26,190,48, + 184,23,52,7,19,52,19,83,254,175,6,105,10,99,26,158, + 112,32,118,240,7,106,13,5,115,157,178,241,200,254,127,114, + 80,1,107,31,107,26,186,48,184,71,19,51,20,35,36,19, + 52,71,86,71,19,52,35,51,35,36,51,20,67,19,67,87, + 3,108,8,99,26,158,240,63,8,109,36,209,25,214,48,65, + 82,114,112,32,65,82,114,52,100,52,100,52,100,52,100,52, + 100,52,100,52,100,52,100,52,100,52,100,180,0,110,16,203, + 25,190,48,81,114,48,65,51,49,229,255,106,0,111,23,204, + 21,186,68,118,16,67,66,50,52,49,230,103,19,67,35,108, + 14,194,136,0,112,27,108,122,189,48,81,115,48,82,66,65, + 52,49,230,103,71,19,37,20,7,35,19,53,147,187,4,113, + 25,108,118,189,83,49,114,48,65,82,49,116,230,103,19,67, + 20,36,37,7,51,21,147,123,114,13,199,25,170,48,113,240, + 102,104,255,8,0,115,25,203,21,182,98,116,16,194,98,104, + 98,208,236,32,204,240,202,234,134,226,64,230,4,0,116,15, + 71,22,166,50,180,201,193,201,208,254,81,13,1,117,16,203, + 25,190,48,229,255,136,98,164,194,98,102,100,0,118,26,204, + 21,186,48,230,108,98,104,100,104,100,104,102,100,104,100,104, + 100,202,204,142,144,17,0,119,43,211,17,206,48,53,101,181, + 66,106,74,100,166,102,100,166,102,70,133,140,144,200,196,136, + 208,196,86,18,50,18,98,53,101,53,117,83,131,83,131,83, + 67,0,120,26,203,21,182,48,117,67,49,179,98,232,170,110, + 174,172,106,98,134,130,100,102,130,230,106,0,121,32,109,118, + 189,48,103,55,49,54,65,52,51,52,67,66,52,50,53,50, + 102,103,88,72,186,114,116,114,176,144,14,0,122,19,203,21, + 182,240,65,220,58,50,186,57,50,186,117,116,7,15,2,123, + 15,7,119,169,52,179,104,191,89,52,181,104,191,90,124,8, + 2,127,157,240,15,12,125,16,7,123,169,48,181,104,191,90, + 52,179,104,191,89,4,126,13,139,180,186,65,115,48,97,113, + 48,67,1,0,0}; + + +uint8_t u8x8_gpio_and_delay_arduino(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + switch(msg) + { + case U8X8_MSG_GPIO_AND_DELAY_INIT: + pinMode(8, OUTPUT); + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + pinMode(11, OUTPUT); + pinMode(13, OUTPUT); + break; + + case U8X8_MSG_DELAY_MILLI: + delay(arg_int); + break; + + case U8X8_MSG_GPIO_DC: + digitalWrite(9, arg_int); + break; + + case U8X8_MSG_GPIO_CS: + digitalWrite(10, arg_int); + break; + + case U8X8_MSG_GPIO_RESET: + digitalWrite(8, arg_int); + break; + + case U8X8_MSG_GPIO_CLOCK: + digitalWrite(13, arg_int); + break; + + case U8X8_MSG_GPIO_DATA: + digitalWrite(11, arg_int); + break; + + default: + return 0; + } + return 1; +} + + + +uint8_t u8x8_byte_arduino_hw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t *data; + + switch(msg) + { + case U8X8_MSG_BYTE_SEND: + + data = (uint8_t *)arg_ptr; + while( arg_int > 0 ) + { + SPI.transfer((uint8_t)*data); + data++; + arg_int--; + } + break; + case U8X8_MSG_BYTE_INIT: + /* disable chipselect */ + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + /* no wait required here */ + + /* for SPI: setup correct level of the clock signal */ + digitalWrite(13, u8g2->display_info->sck_takeover_edge); + break; + case U8X8_MSG_BYTE_SET_DC: + u8x8_gpio_SetDC(u8g2, arg_int); + break; + case U8X8_MSG_BYTE_START_TRANSFER: + SPI.begin(); + SPI.setClockDivider( SPI_CLOCK_DIV2 ); + SPI.setDataMode(SPI_MODE0); + SPI.setBitOrder(MSBFIRST); + + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level); + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL); + break; + case U8X8_MSG_BYTE_END_TRANSFER: + u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL); + u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level); + SPI.end(); + break; + case U8X8_MSG_BYTE_SET_I2C_ADR: + break; + case U8X8_MSG_BYTE_SET_DEVICE: + break; + default: + return 0; + } + return 1; +} + +void u8x8_Setup_UC1701_DOGS102(u8x8_t *u8x8) +{ + /* setup defaults */ + u8x8_SetupDefaults(u8x8); + + /* setup specific callbacks */ + u8x8->display_cb = u8x8_d_uc1701_dogs102; + u8x8->cad_cb = u8x8_cad_001; + u8x8->byte_cb = u8x8_byte_8bit_sw_spi; + u8x8->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; + + /* setup display info */ + u8x8_display_Setup(u8x8); +} + +void u8x8_Setup_SSD1306_128x64_NONAME(u8x8_t *u8x8) +{ + /* setup defaults */ + u8x8_SetupDefaults(u8x8); + + /* setup specific callbacks */ + u8x8->display_cb = u8x8_d_ssd1306_128x64_noname; + u8x8->cad_cb = u8x8_cad_001; + u8x8->byte_cb = u8x8_byte_arduino_hw_spi; + //u8x8->byte_cb = u8x8_byte_8bit_sw_spi; + u8x8->gpio_and_delay_cb = u8x8_gpio_and_delay_arduino; + + /* setup display info */ + u8x8_display_Setup(u8x8); +} + +void u8g2_Setup_SSD1306_128x64_NONAME_1(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) +{ + + static uint8_t buf[128*8]; + + u8x8_Setup_SSD1306_128x64_NONAME(u8g2_GetU8x8(u8g2)); + u8g2_Setup(u8g2, buf, 1, u8g2_cb); +} + + + +u8g2_t u8g2; +uint8_t tile[8] = { 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0 }; + +void setup(void) +{ + //u8x8_Setup_UC1701_DOGS102(&u8g2); + u8g2_Setup_SSD1306_128x64_NONAME_1(&u8g2, &u8g2_cb_r0); + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); + u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); +} + +void loop(void) +{ + static u8g2_uint_t x = 50; + static u8g2_uint_t y = 30; + uint8_t i; + + //u8x8_display_Init(&u8g2); + //u8x8_display_SetFlipMode(&u8g2, 1); + + + for(;;) + { + //u8x8_display_ClearScreen(&u8g2); + //u8x8_display_SetPowerSave(&u8g2, 0); + //u8x8_display_SetContrast(&u8g2, 10); + + delay(500); + + //u8x8_Set8x8Font(&u8g2, bdf_font); + //u8x8_Draw8x8String(&u8g2, 0, 0, "Hello gAjByCD"); + u8g2_FirstPage(&u8g2); + i = 0; + do + { + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); + if ( i == 1 ) + { + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y0, 1, 0); + + } + + i++; + + + } while( u8g2_NextPage(&u8g2) ); + + delay(2000); + } +} + From a6d9027670241064e8e111c90b473580202a0d5f Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 27 Oct 2015 20:31:35 +0100 Subject: [PATCH 080/109] hvline optimization --- u8g2/csrc/u8g2.h | 30 +- u8g2/csrc/u8g2_hvline.c | 203 +++++++++++- .../sdl/{text => text_full_buffer}/Makefile | 0 u8g2/sys/sdl/text_full_buffer/main.c | 296 ++++++++++++++++++ u8g2/sys/sdl/text_picture_loop/Makefile | 12 + .../sdl/{text => text_picture_loop}/main.c | 0 6 files changed, 532 insertions(+), 9 deletions(-) rename u8g2/sys/sdl/{text => text_full_buffer}/Makefile (100%) create mode 100644 u8g2/sys/sdl/text_full_buffer/main.c create mode 100644 u8g2/sys/sdl/text_picture_loop/Makefile rename u8g2/sys/sdl/{text => text_picture_loop}/main.c (100%) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index cfb84fad..e5311322 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -13,12 +13,13 @@ Arduino Uno Text Example -> FONT_ROTATION INTERSECTION text data bss dec hex -> x x 7450 104 1116 8670 21de -> - x 7132 104 1115 8351 209f -> x - 7230 104 1116 8450 2102 -> - - 7010 104 1115 8229 2025 - +> FONT_ROTATION INTERSECTION CLIPPING text data bss dec hex +> 8944 +> x x x 7450 104 1116 8670 21de +> - x x 7132 104 1115 8351 209f +> x - x 7230 104 1116 8450 2102 +> - - x 7010 104 1115 8229 2025 +> - - - 6880 104 1115 8099 1fa3 */ @@ -29,6 +30,12 @@ #include "u8x8.h" +/* + The following macro enames the HVLine speed optimization. + It will consume about 300 bytes more in flash memory of the AVR. +*/ +#define U8G2_HVLINE_SPEED_OPTIMIZATION + /* The following macro enables all four drawing directions for glyphs and strings. If this macro is not defined, than a string can be drawn only in horizontal direction. @@ -50,6 +57,17 @@ */ //#define U8G2_WITH_HVLINE_COUNT +/* + Defining the following variable adds the clipping and check procedures agains the display boundaries. + Clipping procedures are mandatory for the picture loop (u8g2_FirstPage/NextPage). + Clipping procedures will also allow strings to exceed the display boundaries. + On the other side, without clipping, all the setting of pixels must happen within the display boundaries. + + WARNING: Adding a comment in front of the following macro or removing the following line + may lead to memory faults if you write any pixel outside the display boundary. +*/ +#define U8G2_WITH_CLIPPING + /*==========================================*/ diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index dd384323..974a936e 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -16,12 +16,198 @@ #include "u8g2.h" #include +#ifdef U8G2_HVLINE_SPEED_OPTIMIZATION +static uint8_t *u8g2_get_buffer_ptr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) U8G2_NOINLINE; +static uint8_t *u8g2_get_buffer_ptr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) +{ + uint8_t *ptr; + uint16_t offset; + + y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ + offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ + offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; + ptr = u8g2->tile_buf_ptr; + ptr += offset; + ptr += x; + + return ptr; +} + +static void u8g2_draw_hline(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len) +{ + uint8_t *ptr; + uint8_t bit_pos, mask; + + //assert(x >= u8g2->buf_x0); + assert(x < u8g2_GetU8x8(u8g2)->display_info->tile_width*8); + //assert(y >= u8g2->buf_y0); + assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); + + /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ + bit_pos = y; /* overflow truncate is ok here... */ + bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ + + ptr = u8g2_get_buffer_ptr(u8g2, x, y); + + mask = 1; + mask <<= bit_pos; + if ( u8g2->draw_color != 0 ) + { + do + { + *ptr |= mask; + len--; + ptr++; + } while( len > 0 ); + } + else + { + mask ^= 255; + do + { + *ptr &= mask; + len--; + ptr++; + } while( len > 0 ); + } +} + +/* + bitpos0 = y & 7 + remaining len = len - (8 - bitpos0) + (len)/8 --> count intermediate bytes + if ( bitpos2 != 0 ) + +*/ + +static void u8g2_draw_vline(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len) +{ + uint8_t *ptr; + uint16_t offset; + uint8_t bit_pos0, bit_pos2; + uint8_t mask0, mask1, mask2; + u8g2_uint_t cnt; + + //assert(x >= u8g2->buf_x0); + assert(x < u8g2_GetU8x8(u8g2)->display_info->tile_width*8); + //assert(y >= u8g2->buf_y0); + assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); + + /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ + bit_pos0 = y; /* overflow truncate is ok here... */ + bit_pos2 = y; /* overflow truncate is ok here... */ + bit_pos2 += (uint8_t)len; /* overflow truncate is also ok here... */ + bit_pos0 &= 7; /* ... because only the lowest 3 bits are needed */ + bit_pos2 &= 7; /* ... because only the lowest 3 bits are needed */ + + ptr = u8g2_get_buffer_ptr(u8g2, x, y); + + mask0 = 255; + mask0 <<= bit_pos0; + + mask2 = 255; + mask2 <<= bit_pos2; + + cnt = (len - (8 - bit_pos0)); + cnt >>= 3; + + if ( u8g2->draw_color != 0 ) + { + mask1 = 255; + mask2 ^= 255; + if ( (len <= 7) && (bit_pos0 < bit_pos2 ) ) + { + mask0 &= mask2; + *ptr |= mask0; + } + else + { + *ptr |= mask0; + while( cnt > 0 ) + { + ptr+=u8g2->width; + *ptr = mask1; + cnt--; + } + if ( bit_pos2 != 0 ) + { + ptr+=u8g2->width; + *ptr |= mask2; + } + } + } + else + { + mask0 ^= 255; + mask1 = 0; + if ( (len <= 7) && (bit_pos0 < bit_pos2 ) ) + { + mask0 |= mask2; + *ptr &= mask0; + } + else + { + *ptr &= mask0; + while( cnt > 0 ) + { + ptr+=u8g2->width; + *ptr = mask1; + cnt--; + } + if ( bit_pos2 != 0 ) + { + ptr+=u8g2->width; + *ptr &= mask2; + } + } + + } +} + +/* + x,y Upper left position of the line within the local buffer (not the display!) + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) + asumption: + all clipping done +*/ +static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + if ( dir == 0 ) + { + u8g2_draw_hline(u8g2, x, y, len); + /* + do + { + u8g2_draw_pixel(u8g2, x, y); + x++; + len--; + } while( len != 0 ); + */ + } + else + { + u8g2_draw_vline(u8g2, x, y, len); + /* + do + { + u8g2_draw_pixel(u8g2, x, y); + y++; + len--; + } while( len != 0 ); + */ + } +} + +#else /* U8G2_HVLINE_SPEED_OPTIMIZATION */ + /* x,y position within the buffer */ -void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) +static void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { uint8_t *ptr; uint8_t bit_pos, mask; @@ -32,8 +218,6 @@ void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) //assert(y >= u8g2->buf_y0); assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); - // y -= u8g2->tile_curr_row*8; - ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ bit_pos = y; /* overflow truncate is ok here... */ @@ -86,6 +270,13 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, } } + +#endif /* U8G2_HVLINE_SPEED_OPTIMIZATION */ + + + +#ifdef U8G2_WITH_CLIPPING + /* Description: clip range from a (included) to b (excluded) agains c (included) to d (excluded) @@ -185,6 +376,8 @@ static void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u u8g2_unsafe_draw_hv_line(u8g2, x, y, len, dir); } +#endif + /* x,y Upper left position of the line len length of the line in pixel, len must not be 0 @@ -213,7 +406,11 @@ void u8g2_draw_hv_line_4dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uin y++; } dir &= 1; +#ifdef U8G2_WITH_CLIPPING u8g2_draw_hv_line_2dir(u8g2, x, y, len, dir); +#else + u8g2_unsafe_draw_hv_line(u8g2, x, y, len, dir); +#endif } /* diff --git a/u8g2/sys/sdl/text/Makefile b/u8g2/sys/sdl/text_full_buffer/Makefile similarity index 100% rename from u8g2/sys/sdl/text/Makefile rename to u8g2/sys/sdl/text_full_buffer/Makefile diff --git a/u8g2/sys/sdl/text_full_buffer/main.c b/u8g2/sys/sdl/text_full_buffer/main.c new file mode 100644 index 00000000..6a2054c5 --- /dev/null +++ b/u8g2/sys/sdl/text_full_buffer/main.c @@ -0,0 +1,296 @@ + +#include "u8g2.h" +#include + +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +const uint8_t u8g2_font_helvB18_tr[2245] U8X8_FONT_SECTION("u8g2_font_helvB18_tr") = { + 95,0,4,3,5,5,3,5,6,23,24,0,251,19,251,19, + 251,2,234,6,37,32,6,0,48,154,0,33,10,99,26,158, + 240,23,234,14,4,34,11,197,184,167,32,193,139,145,8,0, + 35,42,76,22,186,36,34,38,34,38,34,38,34,38,34,115, + 64,113,64,35,34,38,34,38,34,38,34,115,64,113,64,35, + 34,38,34,38,34,38,34,38,34,4,36,39,172,210,181,37, + 119,116,48,65,33,177,68,196,68,228,66,204,174,146,178,206, + 76,226,68,196,68,196,68,228,66,130,226,96,232,78,84,10, + 0,37,49,85,18,218,61,87,54,118,52,54,179,76,74,100, + 78,74,100,110,102,98,242,100,180,100,30,102,30,100,166,116, + 228,112,100,102,110,68,74,108,70,74,108,102,213,212,217,88, + 9,0,38,38,80,22,202,84,122,72,65,55,51,55,51,55, + 51,56,49,218,244,100,134,130,98,102,230,100,170,102,108,104, + 170,134,230,129,200,144,209,0,39,8,194,184,155,112,64,1, + 40,22,6,119,161,36,51,50,51,50,51,35,179,255,72,104, + 102,104,102,104,72,0,41,22,6,119,161,32,180,102,104,102, + 72,104,102,255,70,102,201,204,200,140,16,0,42,16,232,148, + 171,35,38,35,33,113,48,66,35,162,5,0,43,14,140,53, + 190,37,170,171,131,7,83,162,186,2,44,10,195,184,157,112, + 32,33,65,1,45,7,103,208,162,240,1,46,7,99,24,158, + 112,32,47,18,103,22,162,165,145,148,34,41,141,164,20,73, + 41,146,82,5,48,27,76,18,182,99,117,16,67,66,50,52, + 50,52,49,230,159,77,12,141,12,141,176,57,136,178,1,49, + 12,71,26,182,180,230,224,128,104,255,15,50,27,76,18,182, + 83,117,32,51,67,49,53,49,102,54,57,56,72,199,172,140, + 142,225,228,193,131,1,51,31,76,18,182,83,117,32,179,100, + 106,98,106,98,106,114,112,172,238,114,116,210,204,138,98,134, + 228,96,200,6,0,52,27,76,18,182,55,200,174,153,196,212, + 196,148,200,144,204,54,66,35,67,35,7,15,230,38,55,1, + 53,30,76,18,182,113,48,114,48,50,185,229,65,208,129,204, + 12,229,232,228,164,153,213,65,12,201,129,148,13,0,54,32, + 76,18,182,84,117,32,66,51,50,101,102,185,130,232,96,164, + 132,130,104,98,204,217,196,208,8,155,131,40,27,0,55,24, + 76,18,182,240,193,32,225,202,193,201,193,201,193,201,65,194, + 201,65,194,201,57,0,56,35,76,18,182,68,118,16,52,50, + 51,52,50,52,50,52,50,52,51,50,101,117,16,51,52,49, + 230,217,196,208,200,193,144,13,0,57,32,76,18,182,99,116, + 32,67,66,65,52,49,230,217,17,5,73,197,1,77,197,228, + 164,213,4,73,201,129,84,17,0,58,10,195,25,158,112,32, + 15,121,32,59,13,35,186,157,112,32,15,121,32,33,65,1, + 60,14,141,49,190,58,88,214,25,37,109,105,167,3,61,11, + 170,184,186,240,192,244,224,192,0,62,13,141,53,186,48,218, + 91,74,178,30,142,2,63,24,107,26,190,99,115,32,66,114, + 16,100,101,68,55,71,70,183,112,123,4,131,139,0,64,65, + 214,150,225,119,32,123,96,88,86,69,74,67,60,66,84,33, + 50,49,116,32,114,179,198,102,104,198,70,104,200,100,104,102, + 98,100,72,104,98,100,102,201,154,37,51,35,19,52,36,7, + 85,51,21,115,244,64,244,64,85,163,7,197,7,129,0,65, + 37,112,22,202,70,76,107,106,57,34,57,50,56,50,55,52, + 54,52,54,52,53,54,52,54,116,80,115,112,50,56,50,56, + 49,234,116,0,66,37,111,26,202,112,64,116,96,50,70,50, + 56,49,56,49,56,49,56,49,55,114,80,115,96,50,56,49, + 233,195,179,138,3,147,3,34,0,67,29,112,22,202,117,119, + 64,84,83,66,71,49,121,60,189,175,41,39,38,39,232,72, + 106,138,14,232,142,0,68,30,112,26,206,112,64,117,96,51, + 86,50,72,49,57,49,121,234,95,94,78,12,82,140,149,28, + 216,28,80,1,69,22,109,26,194,112,80,113,80,49,186,167, + 7,36,7,36,163,251,244,224,65,1,70,17,108,26,190,240, + 129,229,94,30,80,28,80,76,238,47,1,71,35,113,22,206, + 117,120,64,85,83,67,71,50,57,65,61,190,217,1,217,1, + 173,237,233,196,36,5,93,73,205,131,137,169,147,1,72,14, + 111,26,206,48,233,95,30,252,32,210,127,57,73,8,99,26, + 158,240,63,8,74,17,107,22,186,184,255,161,149,87,19,51, + 20,7,50,39,0,75,39,110,26,202,48,119,70,49,69,50, + 68,51,67,52,66,53,65,118,247,32,140,130,106,102,106,104, + 17,205,212,204,216,200,24,197,220,196,28,1,76,12,108,26, + 190,48,185,255,191,60,120,48,77,50,115,26,222,48,125,123, + 16,123,32,121,48,121,64,119,32,33,39,97,49,53,97,34, + 37,98,50,51,98,50,51,98,163,198,102,98,198,102,98,198, + 168,200,168,200,106,202,106,202,106,1,78,39,111,26,206,48, + 121,248,32,238,32,238,64,204,98,202,98,202,100,200,102,198, + 102,198,104,196,74,196,106,194,236,64,238,32,238,32,240,114, + 0,79,29,113,22,206,117,120,64,85,83,67,71,50,57,65, + 121,235,111,47,41,38,71,232,104,90,29,16,94,1,80,23, + 110,26,198,112,64,115,96,49,55,49,232,187,137,3,139,131, + 146,217,253,45,0,81,35,145,246,205,117,120,64,85,83,67, + 71,50,57,65,121,235,111,207,66,40,166,38,70,168,108,138, + 168,14,234,46,230,1,66,0,82,26,110,26,198,112,64,115, + 96,49,55,49,232,187,137,3,139,131,146,49,138,185,137,65, + 127,56,83,32,110,26,198,100,118,48,67,83,65,54,49,55, + 49,75,91,122,16,121,90,75,107,232,238,64,166,228,128,234, + 8,0,84,13,111,18,190,240,3,177,225,253,255,25,0,85, + 19,111,26,206,48,233,255,151,119,20,115,35,53,53,7,100, + 71,0,86,36,112,22,202,48,106,122,72,49,56,66,70,51, + 54,52,54,196,106,104,108,104,140,132,110,100,112,100,112,100, + 210,212,150,152,25,0,87,62,117,22,222,48,54,102,54,102, + 54,102,182,98,168,104,100,168,104,100,72,66,104,100,102,98, + 102,70,102,98,70,104,100,98,100,104,68,70,100,104,98,102, + 98,74,98,102,66,76,98,102,66,172,170,172,170,110,225,220, + 224,220,16,0,88,37,112,22,202,48,122,72,65,70,51,54, + 53,52,55,50,120,16,105,75,76,107,121,16,56,50,55,52, + 69,68,52,54,51,56,65,120,58,89,30,111,22,198,48,121, + 56,49,55,66,54,51,53,68,52,53,51,54,51,55,49,56, + 49,89,90,59,188,207,0,90,21,110,22,194,240,83,74,78, + 41,153,82,50,165,36,29,165,36,61,248,0,91,13,5,119, + 161,112,96,178,255,255,201,193,0,92,18,103,18,162,32,165, + 76,74,153,148,102,82,202,164,148,73,41,93,13,5,123,161, + 112,48,178,255,255,201,129,1,94,19,43,85,187,52,56,87, + 38,33,53,49,179,100,102,98,202,106,0,95,7,78,112,185, + 240,3,96,8,134,244,163,48,180,1,97,30,204,21,186,99, + 117,16,51,67,50,52,57,102,115,32,82,50,65,52,49,53, + 49,68,65,82,114,64,82,50,98,26,108,26,190,48,185,23, + 53,7,35,37,20,68,19,99,126,118,52,81,66,113,48,50, + 81,3,99,21,203,21,182,99,116,16,194,98,200,112,47,135, + 38,72,72,14,130,76,0,100,25,108,22,190,185,55,21,35, + 7,19,36,21,67,103,126,54,49,68,65,82,114,48,83,49, + 101,27,204,21,186,68,118,16,67,66,50,52,49,102,118,240, + 129,228,232,212,4,13,201,129,84,13,0,102,16,103,22,166, + 67,82,50,180,228,224,100,104,255,19,0,103,31,108,118,189, + 83,49,114,48,65,82,49,116,230,103,19,67,20,36,37,7, + 51,21,147,102,71,35,7,67,54,0,104,17,107,26,190,48, + 184,23,52,7,19,52,19,83,254,175,6,105,10,99,26,158, + 112,32,118,240,7,106,13,5,115,157,178,241,200,254,127,114, + 80,1,107,31,107,26,186,48,184,71,19,51,20,35,36,19, + 52,71,86,71,19,52,35,51,35,36,51,20,67,19,67,87, + 3,108,8,99,26,158,240,63,8,109,36,209,25,214,48,65, + 82,114,112,32,65,82,114,52,100,52,100,52,100,52,100,52, + 100,52,100,52,100,52,100,52,100,52,100,180,0,110,16,203, + 25,190,48,81,114,48,65,51,49,229,255,106,0,111,23,204, + 21,186,68,118,16,67,66,50,52,49,230,103,19,67,35,108, + 14,194,136,0,112,27,108,122,189,48,81,115,48,82,66,65, + 52,49,230,103,71,19,37,20,7,35,19,53,147,187,4,113, + 25,108,118,189,83,49,114,48,65,82,49,116,230,103,19,67, + 20,36,37,7,51,21,147,123,114,13,199,25,170,48,113,240, + 102,104,255,8,0,115,25,203,21,182,98,116,16,194,98,104, + 98,208,236,32,204,240,202,234,134,226,64,230,4,0,116,15, + 71,22,166,50,180,201,193,201,208,254,81,13,1,117,16,203, + 25,190,48,229,255,136,98,164,194,98,102,100,0,118,26,204, + 21,186,48,230,108,98,104,100,104,100,104,102,100,104,100,104, + 100,202,204,142,144,17,0,119,43,211,17,206,48,53,101,181, + 66,106,74,100,166,102,100,166,102,70,133,140,144,200,196,136, + 208,196,86,18,50,18,98,53,101,53,117,83,131,83,131,83, + 67,0,120,26,203,21,182,48,117,67,49,179,98,232,170,110, + 174,172,106,98,134,130,100,102,130,230,106,0,121,32,109,118, + 189,48,103,55,49,54,65,52,51,52,67,66,52,50,53,50, + 102,103,88,72,186,114,116,114,176,144,14,0,122,19,203,21, + 182,240,65,220,58,50,186,57,50,186,117,116,7,15,2,123, + 15,7,119,169,52,179,104,191,89,52,181,104,191,90,124,8, + 2,127,157,240,15,12,125,16,7,123,169,48,181,104,191,90, + 52,179,104,191,89,4,126,13,139,180,186,65,115,48,97,113, + 48,67,1,0,0}; + +u8g2_t u8g2; + +int main(void) +{ + int x, y; + int k; + + u8g2_Setup_SDL_128x64(&u8g2, &u8g2_cb_r0); + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); + u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); + + x = 50; + y = 30; + + + for(;;) + { +#ifdef U8G2_WITH_HVLINE_COUNT + u8g2.hv_cnt = 0UL; +#endif /* U8G2_WITH_HVLINE_COUNT */ + + u8g2_ClearBuffer(&u8g2); + + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "A"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "a"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "a"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "a"); + + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y0, 1, 0); + + u8g2_SendBuffer(&u8g2); +/* + u8g2_FirstPage(&u8g2); + i = 0; + do + { + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); + if ( i == 1 ) + { + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y0, 1, 0); + + } + + i++; + + + } while( u8g2_NextPage(&u8g2) ); +*/ +#ifdef U8G2_WITH_HVLINE_COUNT + printf("hv cnt: %ld\n", u8g2.hv_cnt); +#endif /* U8G2_WITH_HVLINE_COUNT */ + + do + { + k = u8g_sdl_get_key(); + } while( k < 0 ); + + if ( k == 273 ) y -= 7; + if ( k == 274 ) y += 7; + if ( k == 276 ) x -= 7; + if ( k == 275 ) x += 7; + + if ( k == 'e' ) y -= 1; + if ( k == 'x' ) y += 1; + if ( k == 's' ) x -= 1; + if ( k == 'd' ) x += 1; + if ( k == 'q' ) break; + + } + + //u8x8_Set8x8Font(u8g2_GetU8x8(&u8g2), bdf_font); + //u8x8_Draw8x8String(u8g2_GetU8x8(&u8g2), 0, 0, "Hello World!"); + + + + + + + return 0; +} + diff --git a/u8g2/sys/sdl/text_picture_loop/Makefile b/u8g2/sys/sdl/text_picture_loop/Makefile new file mode 100644 index 00000000..9f409a66 --- /dev/null +++ b/u8g2/sys/sdl/text_picture_loop/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +helloworld: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_sdl + +clean: + -rm $(OBJ) u8g2_sdl + diff --git a/u8g2/sys/sdl/text/main.c b/u8g2/sys/sdl/text_picture_loop/main.c similarity index 100% rename from u8g2/sys/sdl/text/main.c rename to u8g2/sys/sdl/text_picture_loop/main.c From 6191ca9d5882f2937c1e1bec8d7f4628394b1238 Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 27 Oct 2015 21:45:14 +0100 Subject: [PATCH 081/109] hvline optimization --- u8g2/csrc/u8g2.h | 2 +- u8g2/csrc/u8g2_hvline.c | 103 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 95 insertions(+), 10 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index e5311322..5217be55 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -32,7 +32,7 @@ /* The following macro enames the HVLine speed optimization. - It will consume about 300 bytes more in flash memory of the AVR. + It will consume about 30 bytes more in flash memory of the AVR. */ #define U8G2_HVLINE_SPEED_OPTIMIZATION diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index 974a936e..ab22f1b1 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -16,9 +16,7 @@ #include "u8g2.h" #include -#ifdef U8G2_HVLINE_SPEED_OPTIMIZATION - - +#ifdef _REALY_FAST_VERSION static uint8_t *u8g2_get_buffer_ptr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) U8G2_NOINLINE; static uint8_t *u8g2_get_buffer_ptr(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { @@ -202,6 +200,89 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, } } +#endif /* really fast version */ + +#ifdef U8G2_HVLINE_SPEED_OPTIMIZATION + +/* + x,y Upper left position of the line within the local buffer (not the display!) + len length of the line in pixel, len must not be 0 + dir 0: horizontal line (left to right) + 1: vertical line (top to bottom) + asumption: + all clipping done +*/ +static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) +{ + uint16_t offset; + uint8_t *ptr; + uint8_t bit_pos, mask; + + //assert(x >= u8g2->buf_x0); + assert(x < u8g2_GetU8x8(u8g2)->display_info->tile_width*8); + //assert(y >= u8g2->buf_y0); + assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); + + /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ + bit_pos = y; /* overflow truncate is ok here... */ + bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ + mask = 1; + mask <<= bit_pos; + + offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ + offset &= ~7; + offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; + ptr = u8g2->tile_buf_ptr; + ptr += offset; + ptr += x; + + if ( dir == 0 ) + { + do + { + if ( u8g2->draw_color != 0 ) + { + *ptr |= mask; + } + else + { + *ptr &= ~mask; + } + ptr++; + len--; + } while( len != 0 ); + } + else + { + do + { + if ( u8g2->draw_color != 0 ) + { + *ptr |= mask; + } + else + { + *ptr &= ~mask; + } + + bit_pos++; + bit_pos &= 7; + if ( bit_pos == 0 ) + { + ptr+=u8g2->width; + mask = 1; + } + else + { + mask <<= 1; + } + len--; + } while( len != 0 ); + } +} + + + #else /* U8G2_HVLINE_SPEED_OPTIMIZATION */ /* @@ -209,26 +290,29 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, */ static void u8g2_draw_pixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y) { + uint16_t offset; uint8_t *ptr; uint8_t bit_pos, mask; - uint16_t offset; - + //assert(x >= u8g2->buf_x0); assert(x < u8g2_GetU8x8(u8g2)->display_info->tile_width*8); //assert(y >= u8g2->buf_y0); assert(y < u8g2_GetU8x8(u8g2)->display_info->tile_height*8); - ptr = u8g2->tile_buf_ptr; /* bytes are vertical, lsb on top (y=0), msb at bottom (y=7) */ bit_pos = y; /* overflow truncate is ok here... */ bit_pos &= 7; /* ... because only the lowest 3 bits are needed */ - y &= ~7; /* zero the lowest 3 bits, y is tile-row * 8 from now on */ + mask = 1; + mask <<= bit_pos; + offset = y; /* y might be 8 or 16 bit, but we need 16 bit, so use a 16 bit variable */ + offset &= ~7; offset *= u8g2_GetU8x8(u8g2)->display_info->tile_width; + ptr = u8g2->tile_buf_ptr; ptr += offset; ptr += x; - mask = 1; - mask <<= bit_pos; + + if ( u8g2->draw_color != 0 ) { *ptr |= mask; @@ -271,6 +355,7 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, } + #endif /* U8G2_HVLINE_SPEED_OPTIMIZATION */ From 3b53f4b72d303943167c4d71b46391b83dc310ae Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 28 Oct 2015 00:11:56 +0100 Subject: [PATCH 082/109] hv line optimization --- u8g2/csrc/u8g2.h | 6 ++-- u8g2/csrc/u8g2_hvline.c | 62 ++++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 5217be55..6145ef27 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -14,7 +14,7 @@ Arduino Uno Text Example > FONT_ROTATION INTERSECTION CLIPPING text data bss dec hex -> 8944 +> 8700 > x x x 7450 104 1116 8670 21de > - x x 7132 104 1115 8351 209f > x - x 7230 104 1116 8450 2102 @@ -31,8 +31,8 @@ #include "u8x8.h" /* - The following macro enames the HVLine speed optimization. - It will consume about 30 bytes more in flash memory of the AVR. + The following macro enables the HVLine speed optimization. + It will consume about 40 bytes more in flash memory of the AVR. */ #define U8G2_HVLINE_SPEED_OPTIMIZATION diff --git a/u8g2/csrc/u8g2_hvline.c b/u8g2/csrc/u8g2_hvline.c index ab22f1b1..be75d71b 100644 --- a/u8g2/csrc/u8g2_hvline.c +++ b/u8g2/csrc/u8g2_hvline.c @@ -177,26 +177,10 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, if ( dir == 0 ) { u8g2_draw_hline(u8g2, x, y, len); - /* - do - { - u8g2_draw_pixel(u8g2, x, y); - x++; - len--; - } while( len != 0 ); - */ } else { u8g2_draw_vline(u8g2, x, y, len); - /* - do - { - u8g2_draw_pixel(u8g2, x, y); - y++; - len--; - } while( len != 0 ); - */ } } @@ -238,19 +222,25 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, if ( dir == 0 ) { - do + if ( u8g2->draw_color != 0 ) { - if ( u8g2->draw_color != 0 ) + do { *ptr |= mask; - } - else + ptr++; + len--; + } while( len != 0 ); + } + else + { + mask = ~mask; + do { - *ptr &= ~mask; - } - ptr++; - len--; - } while( len != 0 ); + *ptr &= mask; + ptr++; + len--; + } while( len != 0 ); + } } else { @@ -267,16 +257,36 @@ static void u8g2_unsafe_draw_hv_line(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, bit_pos++; bit_pos &= 7; + + len--; + if ( bit_pos == 0 ) { ptr+=u8g2->width; + + /* another speed optimization, but requires about 60 bytes on AVR */ + /* + while( len >= 8 ) + { + if ( u8g2->draw_color != 0 ) + { + *ptr = 255; + } + else + { + *ptr = 0; + } + len -= 8; + ptr+=u8g2->width; + } + */ + mask = 1; } else { mask <<= 1; } - len--; } while( len != 0 ); } } From 1cffc7d798e6d4953425c1db0e30c17d4779c8d5 Mon Sep 17 00:00:00 2001 From: olikraus Date: Fri, 6 Nov 2015 08:26:44 +0100 Subject: [PATCH 083/109] tga --- sys/sdl/circle/main.c | 5 + u8g2/csrc/u8g2.h | 5 + u8g2/csrc/u8x8.h | 4 + u8g2/sys/tga/common/u8x8_d_tga.c | 217 ++++++++++++++++++++++++++ u8g2/sys/tga/hello_world_8x8/Makefile | 12 ++ u8g2/sys/tga/hello_world_8x8/main.c | 69 ++++++++ 6 files changed, 312 insertions(+) create mode 100644 u8g2/sys/tga/common/u8x8_d_tga.c create mode 100644 u8g2/sys/tga/hello_world_8x8/Makefile create mode 100644 u8g2/sys/tga/hello_world_8x8/main.c diff --git a/sys/sdl/circle/main.c b/sys/sdl/circle/main.c index 22d0c1c1..20ea68cc 100644 --- a/sys/sdl/circle/main.c +++ b/sys/sdl/circle/main.c @@ -31,6 +31,11 @@ int main(void) u8g_DrawFilledEllipse(&u8g, 48, 35, 20, rad, U8G_DRAW_UPPER_LEFT); u8g_DrawFilledEllipse(&u8g, 48, 37, 20, rad, U8G_DRAW_LOWER_LEFT); + /* + u8g_DrawRFrame(&u8g, 5,0,25,5,2); + u8g_DrawRFrame(&u8g, 35,0,25,6,2); + */ + } while( u8g_NextPage(&u8g) ); while( u8g_sdl_get_key() < 0 ) diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 6145ef27..1d0934ac 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -262,6 +262,11 @@ u8g2_uint_t u8g2_DrawString(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const ch void u8g2_Setup_SDL_128x64(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +/*==========================================*/ +/* u8x8_d_tga.c */ +void u8g2_Setup_TGA(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); + + /*==========================================*/ /* C++ compatible */ diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index 6a7cdf33..fb03b5f3 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -440,6 +440,10 @@ void u8x8_SetupStdio(u8x8_t *u8x8); void u8x8_Setup_SDL_128x64(u8x8_t *u8x8); int u8g_sdl_get_key(void); +/*==========================================*/ +/* u8x8_d_tga.c */ +void u8x8_Setup_TGA(u8x8_t *u8x8); +void tga_save(const char *name); /*==========================================*/ /* u8x8_d_uc1701_dogs102.c */ diff --git a/u8g2/sys/tga/common/u8x8_d_tga.c b/u8g2/sys/tga/common/u8x8_d_tga.c new file mode 100644 index 00000000..3482963b --- /dev/null +++ b/u8g2/sys/tga/common/u8x8_d_tga.c @@ -0,0 +1,217 @@ + +#include "u8g2.h" +#include +#include +#include + +#define FACTOR 3 +#define DEFAULT_WIDTH (FACTOR*128) +#define DEFAULT_HEIGHT (FACTOR*64) + + +static uint16_t tga_width; +static uint16_t tga_height; +static uint8_t *tga_data = NULL; +uint8_t tga_r = 0; +uint8_t tga_g = 0; +uint8_t tga_b = 0; + +int tga_init(uint16_t w, uint16_t h) +{ + tga_width = 0; + tga_height = 0; + if ( tga_data != NULL ) + free(tga_data); + tga_data = (uint8_t *)malloc(w*h*3); + if ( tga_data == NULL ) + return 0; + tga_width = w; + tga_height = h; + memset(tga_data, 255, tga_width*tga_height*3); + return 1; +} + +void tga_set_pixel(uint16_t x, uint16_t y) +{ + uint8_t *p; + p = tga_data + (tga_height-y-1)*tga_width*3 + x*3; + *p++ = tga_b; + *p++ = tga_g; + *p++ = tga_r; +} + +void tga_clr_pixel(uint16_t x, uint16_t y) +{ + uint8_t *p; + p = tga_data + (tga_height-y-1)*tga_width*3 + x*3; + *p++ = 255; + *p++ = 255; + *p++ = 255; +} + +void tga_set_8pixel(int x, int y, uint8_t pixel) +{ + int cnt = 8; + while( cnt > 0 ) + { + if ( (pixel & 1) != 0 ) + { + tga_set_pixel(x,y); + } + else + { + tga_clr_pixel(x,y); + } + pixel >>= 1; + y++; + cnt--; + } +} + +void tga_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel) +{ + uint8_t b; + while( cnt > 0 ) + { + b = *pixel; + tga_set_8pixel(x, y, b); + x++; + pixel++; + cnt--; + } +} + + + +void tga_write_byte(FILE *fp, uint8_t byte) +{ + fputc(byte, fp); +} + +void tga_write_word(FILE *fp, uint16_t word) +{ + tga_write_byte(fp, word&255); + tga_write_byte(fp, word>>8); +} + +void tga_save(const char *name) +{ + FILE *fp; + if ( tga_data == NULL ) + return; + + fp = fopen(name, "wb"); + if ( fp != NULL ) + { + tga_write_byte(fp, 0); /* no ID */ + tga_write_byte(fp, 0); /* no color map */ + tga_write_byte(fp, 2); /* uncompressed true color */ + tga_write_word(fp, 0); + tga_write_word(fp, 0); + tga_write_byte(fp, 0); + tga_write_word(fp, 0); /* x origin */ + tga_write_word(fp, 0); /* y origin */ + tga_write_word(fp, tga_width); /* width */ + tga_write_word(fp, tga_height); /* height */ + tga_write_byte(fp, 24); /* color depth */ + tga_write_byte(fp, 0); + fwrite(tga_data, tga_width*tga_height*3, 1, fp); + tga_write_word(fp, 0); + tga_write_word(fp, 0); + tga_write_word(fp, 0); + tga_write_word(fp, 0); + fwrite("TRUEVISION-XFILE.", 18, 1, fp); + fclose(fp); + } +} + + +static const u8x8_display_info_t u8x8_tga_128x64_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, + + /* post_chip_enable_wait_ns = */ 0, + /* pre_chip_disable_wait_ns = */ 0, + /* reset_pulse_width_ms = */ 0, + /* post_reset_wait_ms = */ 0, + /* sda_setup_time_ns = */ 0, + /* sck_pulse_width_ns = */ 0, + /* sck_takeover_edge = */ 1, + /* i2c_bus_clock_100kHz = */ 0, + /* data_setup_time_ns = */ 0, + /* write_pulse_width_ns = */ 0, + /* tile_width = */ 16, + /* tile_hight = */ 8, +#if U8X8_DEFAULT_FLIP_MODE == 0 + /* default_x_offset = */ 0, +#else + /* default_x_offset = */ 0, +#endif +}; + + +uint8_t u8x8_d_tga(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + uint8_t x, y, c; + uint8_t *ptr; + switch(msg) + { + case U8X8_MSG_DISPLAY_SETUP: + u8x8_d_helper_display_setup(u8g2, &u8x8_tga_128x64_info); + break; + case U8X8_MSG_DISPLAY_INIT: + u8x8_d_helper_display_init(u8g2); + if ( tga_data == NULL ) + tga_init(DEFAULT_WIDTH, DEFAULT_HEIGHT); + break; + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: + break; + case U8X8_MSG_DISPLAY_SET_FLIP_MODE: + break; + case U8X8_MSG_DISPLAY_SET_CONTRAST: + break; + case U8X8_MSG_DISPLAY_DRAW_TILE: + x = ((u8x8_tile_t *)arg_ptr)->x_pos; + x *= 8; + x += u8g2->x_offset; + + y = ((u8x8_tile_t *)arg_ptr)->y_pos; + y *= 8; + + do + { + c = ((u8x8_tile_t *)arg_ptr)->cnt; + ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + tga_set_multiple_8pixel(x, y, c*8, ptr); + arg_int--; + } while( arg_int > 0 ); + + break; + default: + return 0; + } + return 1; +} + + +void u8x8_Setup_TGA(u8x8_t *u8x8) +{ + /* setup defaults */ + u8x8_SetupDefaults(u8x8); + + /* setup specific callbacks */ + u8x8->display_cb = u8x8_d_tga; + + /* setup display info */ + u8x8_display_Setup(u8x8); +} + +void u8g2_Setup_TGA(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) +{ + + static uint8_t buf[128*8]; + + u8x8_Setup_TGA(u8g2_GetU8x8(u8g2)); + u8g2_Setup(u8g2, buf, 8, u8g2_cb); +} diff --git a/u8g2/sys/tga/hello_world_8x8/Makefile b/u8g2/sys/tga/hello_world_8x8/Makefile new file mode 100644 index 00000000..92cd9e27 --- /dev/null +++ b/u8g2/sys/tga/hello_world_8x8/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +u8g2_tga: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_tga + +clean: + -rm $(OBJ) u8g2_tga + diff --git a/u8g2/sys/tga/hello_world_8x8/main.c b/u8g2/sys/tga/hello_world_8x8/main.c new file mode 100644 index 00000000..d4e5f6ff --- /dev/null +++ b/u8g2/sys/tga/hello_world_8x8/main.c @@ -0,0 +1,69 @@ + +#include "u8x8.h" + +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +u8x8_t u8x8; + + +int main(void) +{ + u8x8_Setup_TGA(&u8x8); + u8x8_display_Init(&u8x8); + u8x8_display_SetPowerSave(&u8x8, 0); + + u8x8_Set8x8Font(&u8x8, bdf_font); + u8x8_Draw8x8String(&u8x8, 0, 0, "Hello World!"); + + tga_save("u8x8.tga"); + return 0; +} + From e740446b8700a0d024d628c6e4b30b9c32008aeb Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 3 Jan 2016 01:18:09 +0100 Subject: [PATCH 084/109] h&v line --- csrc/u8g_dev_ssd1306_128x64.c | 9 + sys/arduino/GraphicsTest/GraphicsTest.pde | 2 +- u8g2/csrc/u8g2.h | 5 +- u8g2/csrc/u8x8.h | 7 +- u8g2/sys/tga/common/u8x8_d_tga.c | 205 ++++++++++++++--- u8g2/sys/tga/hello_world_8x8/main.c | 2 +- u8g2/sys/tga/text_picture_loop/Makefile | 12 + u8g2/sys/tga/text_picture_loop/main.c | 267 ++++++++++++++++++++++ 8 files changed, 471 insertions(+), 38 deletions(-) create mode 100644 u8g2/sys/tga/text_picture_loop/Makefile create mode 100644 u8g2/sys/tga/text_picture_loop/main.c diff --git a/csrc/u8g_dev_ssd1306_128x64.c b/csrc/u8g_dev_ssd1306_128x64.c index bd55e90e..bd627796 100644 --- a/csrc/u8g_dev_ssd1306_128x64.c +++ b/csrc/u8g_dev_ssd1306_128x64.c @@ -302,6 +302,15 @@ uint8_t u8g_dev_sh1106_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * case U8G_DEV_MSG_SLEEP_OFF: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); return 1; + case U8G_DEV_MSG_CONTRAST: + { + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, *(uint8_t *) arg); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 456f631a..c25763b6 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -83,7 +83,7 @@ //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16 //U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16 -//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED) //U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI diff --git a/u8g2/csrc/u8g2.h b/u8g2/csrc/u8g2.h index 1d0934ac..44e4e5a3 100644 --- a/u8g2/csrc/u8g2.h +++ b/u8g2/csrc/u8g2.h @@ -86,6 +86,8 @@ extern "C" { /*==========================================*/ +typedef uint16_t u8g2_uint_t; /* for pixel position only */ + typedef struct u8g2_struct u8g2_t; typedef struct u8g2_cb_struct u8g2_cb_t; @@ -264,7 +266,8 @@ void u8g2_Setup_SDL_128x64_4(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); /*==========================================*/ /* u8x8_d_tga.c */ -void u8g2_Setup_TGA(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +void u8g2_Setup_TGA_DESC(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); +void u8g2_Setup_TGA_LCD(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb); /*==========================================*/ diff --git a/u8g2/csrc/u8x8.h b/u8g2/csrc/u8x8.h index fb03b5f3..415691d3 100644 --- a/u8g2/csrc/u8x8.h +++ b/u8g2/csrc/u8x8.h @@ -111,9 +111,7 @@ extern "C" { #endif /*==========================================*/ -/* U8G2 typedefs and data structures */ - -typedef uint16_t u8g2_uint_t; /* for pixel position only */ +/* U8X8 typedefs and data structures */ typedef struct u8x8_struct u8x8_t; @@ -442,7 +440,8 @@ int u8g_sdl_get_key(void); /*==========================================*/ /* u8x8_d_tga.c */ -void u8x8_Setup_TGA(u8x8_t *u8x8); +void u8x8_Setup_TGA_DESC(u8x8_t *u8x8); +void u8x8_Setup_TGA_LCD(u8x8_t *u8x8); void tga_save(const char *name); /*==========================================*/ diff --git a/u8g2/sys/tga/common/u8x8_d_tga.c b/u8g2/sys/tga/common/u8x8_d_tga.c index 3482963b..caa9ebe6 100644 --- a/u8g2/sys/tga/common/u8x8_d_tga.c +++ b/u8g2/sys/tga/common/u8x8_d_tga.c @@ -5,6 +5,8 @@ #include #define FACTOR 3 +#define XOFFSET (FACTOR*32) +#define YOFFSET (FACTOR*32) #define DEFAULT_WIDTH (FACTOR*128) #define DEFAULT_HEIGHT (FACTOR*64) @@ -16,6 +18,10 @@ uint8_t tga_r = 0; uint8_t tga_g = 0; uint8_t tga_b = 0; +uint8_t tga_desc_r = 0; +uint8_t tga_desc_g = 0; +uint8_t tga_desc_b = 255; + int tga_init(uint16_t w, uint16_t h) { tga_width = 0; @@ -31,51 +37,70 @@ int tga_init(uint16_t w, uint16_t h) return 1; } -void tga_set_pixel(uint16_t x, uint16_t y) +void tga_set_pixel(uint16_t x, uint16_t y, uint16_t f) { uint8_t *p; - p = tga_data + (tga_height-y-1)*tga_width*3 + x*3; - *p++ = tga_b; - *p++ = tga_g; - *p++ = tga_r; + uint16_t xx,yy; + for( yy = y; yy < y+f; yy++ ) + { + for( xx = x; xx < x+f; xx++ ) + { + if ( yy < tga_height && xx < tga_width ) + { + //printf ("(%d %d) ", xx, yy); + p = tga_data + (tga_height-yy-1)*tga_width*3 + xx*3; + *p++ = tga_b; + *p++ = tga_g; + *p++ = tga_r; + } + } + } } -void tga_clr_pixel(uint16_t x, uint16_t y) +void tga_clr_pixel(uint16_t x, uint16_t y, uint16_t f) { uint8_t *p; - p = tga_data + (tga_height-y-1)*tga_width*3 + x*3; - *p++ = 255; - *p++ = 255; - *p++ = 255; + uint16_t xx,yy; + for( yy = y; yy < y+f; yy++ ) + { + for( xx = x; xx < x+f; xx++ ) + { + + p = tga_data + (tga_height-yy-1)*tga_width*3 + xx*3; + *p++ = 255; + *p++ = 255; + *p++ = 255; + } + } } -void tga_set_8pixel(int x, int y, uint8_t pixel) +void tga_set_8pixel(int x, int y, uint8_t pixel, uint16_t f) { int cnt = 8; while( cnt > 0 ) { if ( (pixel & 1) != 0 ) { - tga_set_pixel(x,y); + tga_set_pixel(x,y, f); } else { - tga_clr_pixel(x,y); + tga_clr_pixel(x,y, f); } pixel >>= 1; - y++; + y+=f; cnt--; } } -void tga_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel) +void tga_set_multiple_8pixel(int x, int y, int cnt, uint8_t *pixel, uint16_t f) { uint8_t b; while( cnt > 0 ) { b = *pixel; - tga_set_8pixel(x, y, b); - x++; + tga_set_8pixel(x, y, b, f); + x+=f; pixel++; cnt--; } @@ -100,6 +125,8 @@ void tga_save(const char *name) if ( tga_data == NULL ) return; + printf("tga_save: File %s with %dx%d pixel\n", name, tga_width, tga_height); + fp = fopen(name, "wb"); if ( fp != NULL ) { @@ -125,8 +152,11 @@ void tga_save(const char *name) } } +/*==========================================*/ +/* tga description procedures */ + -static const u8x8_display_info_t u8x8_tga_128x64_info = +static const u8x8_display_info_t u8x8_tga_desc_info = { /* chip_enable_level = */ 0, /* chip_disable_level = */ 1, @@ -141,8 +171,8 @@ static const u8x8_display_info_t u8x8_tga_128x64_info = /* i2c_bus_clock_100kHz = */ 0, /* data_setup_time_ns = */ 0, /* write_pulse_width_ns = */ 0, - /* tile_width = */ 16, - /* tile_hight = */ 8, + /* tile_width = */ (2*XOFFSET+DEFAULT_WIDTH)/8, + /* tile_hight = */ (2*YOFFSET+DEFAULT_HEIGHT)/8, #if U8X8_DEFAULT_FLIP_MODE == 0 /* default_x_offset = */ 0, #else @@ -151,19 +181,19 @@ static const u8x8_display_info_t u8x8_tga_128x64_info = }; -uint8_t u8x8_d_tga(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +uint8_t u8x8_d_tga_desc(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) { - uint8_t x, y, c; + u8g2_uint_t x, y, c; uint8_t *ptr; switch(msg) { case U8X8_MSG_DISPLAY_SETUP: - u8x8_d_helper_display_setup(u8g2, &u8x8_tga_128x64_info); + u8x8_d_helper_display_setup(u8g2, &u8x8_tga_desc_info); break; case U8X8_MSG_DISPLAY_INIT: u8x8_d_helper_display_init(u8g2); if ( tga_data == NULL ) - tga_init(DEFAULT_WIDTH, DEFAULT_HEIGHT); + tga_init(2*XOFFSET+DEFAULT_WIDTH, 2*YOFFSET+DEFAULT_HEIGHT); break; case U8X8_MSG_DISPLAY_SET_POWER_SAVE: break; @@ -172,18 +202,25 @@ uint8_t u8x8_d_tga(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) case U8X8_MSG_DISPLAY_SET_CONTRAST: break; case U8X8_MSG_DISPLAY_DRAW_TILE: + + tga_r = tga_desc_r; + tga_g = tga_desc_g; + tga_b = tga_desc_b; + x = ((u8x8_tile_t *)arg_ptr)->x_pos; + //printf("U8X8_MSG_DISPLAY_DRAW_TILE x=%d, ", x); x *= 8; x += u8g2->x_offset; y = ((u8x8_tile_t *)arg_ptr)->y_pos; + //printf("y=%d, c=%d\n", y, ((u8x8_tile_t *)arg_ptr)->cnt); y *= 8; do { c = ((u8x8_tile_t *)arg_ptr)->cnt; ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; - tga_set_multiple_8pixel(x, y, c*8, ptr); + tga_set_multiple_8pixel(x, y, c*8, ptr, 1); arg_int--; } while( arg_int > 0 ); @@ -195,23 +232,129 @@ uint8_t u8x8_d_tga(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) } -void u8x8_Setup_TGA(u8x8_t *u8x8) +void u8x8_Setup_TGA_DESC(u8x8_t *u8x8) { /* setup defaults */ u8x8_SetupDefaults(u8x8); /* setup specific callbacks */ - u8x8->display_cb = u8x8_d_tga; + u8x8->display_cb = u8x8_d_tga_desc; /* setup display info */ u8x8_display_Setup(u8x8); } -void u8g2_Setup_TGA(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) +void u8g2_Setup_TGA_DESC(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) { + static uint8_t buf[(XOFFSET+DEFAULT_WIDTH)*8]; - static uint8_t buf[128*8]; + u8x8_Setup_TGA_DESC(u8g2_GetU8x8(u8g2)); + u8g2_Setup(u8g2, buf, 1, u8g2_cb); +} + +/*==========================================*/ +/* tga LCD procedures */ + + +static const u8x8_display_info_t u8x8_tga_lcd_info = +{ + /* chip_enable_level = */ 0, + /* chip_disable_level = */ 1, - u8x8_Setup_TGA(u8g2_GetU8x8(u8g2)); - u8g2_Setup(u8g2, buf, 8, u8g2_cb); + /* post_chip_enable_wait_ns = */ 0, + /* pre_chip_disable_wait_ns = */ 0, + /* reset_pulse_width_ms = */ 0, + /* post_reset_wait_ms = */ 0, + /* sda_setup_time_ns = */ 0, + /* sck_pulse_width_ns = */ 0, + /* sck_takeover_edge = */ 1, + /* i2c_bus_clock_100kHz = */ 0, + /* data_setup_time_ns = */ 0, + /* write_pulse_width_ns = */ 0, + /* tile_width = */ (DEFAULT_WIDTH)/FACTOR/8, + /* tile_hight = */ (DEFAULT_HEIGHT)/FACTOR/8, +#if U8X8_DEFAULT_FLIP_MODE == 0 + /* default_x_offset = */ 0, +#else + /* default_x_offset = */ 0, +#endif +}; + + +uint8_t u8x8_d_tga_lcd(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr) +{ + u8g2_uint_t x, y, c; + uint8_t *ptr; + switch(msg) + { + case U8X8_MSG_DISPLAY_SETUP: + u8x8_d_helper_display_setup(u8g2, &u8x8_tga_lcd_info); + break; + case U8X8_MSG_DISPLAY_INIT: + u8x8_d_helper_display_init(u8g2); + if ( tga_data == NULL ) + tga_init(2*XOFFSET+DEFAULT_WIDTH, 2*YOFFSET+DEFAULT_HEIGHT); + break; + case U8X8_MSG_DISPLAY_SET_POWER_SAVE: + break; + case U8X8_MSG_DISPLAY_SET_FLIP_MODE: + break; + case U8X8_MSG_DISPLAY_SET_CONTRAST: + break; + case U8X8_MSG_DISPLAY_DRAW_TILE: + + tga_r = 0; + tga_g = 0; + tga_b = 0; + + x = ((u8x8_tile_t *)arg_ptr)->x_pos; + //printf("U8X8_MSG_DISPLAY_DRAW_TILE x=%d, ", x); + x *= 8; + x += u8g2->x_offset; + x *= FACTOR; + x += XOFFSET; + + y = ((u8x8_tile_t *)arg_ptr)->y_pos; + //printf("y=%d, c=%d\n", y, ((u8x8_tile_t *)arg_ptr)->cnt); + y *= 8; + y *= FACTOR; + y += YOFFSET; + + do + { + c = ((u8x8_tile_t *)arg_ptr)->cnt; + ptr = ((u8x8_tile_t *)arg_ptr)->tile_ptr; + tga_set_multiple_8pixel(x, y, c*8, ptr, FACTOR); + arg_int--; + } while( arg_int > 0 ); + + break; + default: + return 0; + } + return 1; } + + +void u8x8_Setup_TGA_LCD(u8x8_t *u8x8) +{ + /* setup defaults */ + u8x8_SetupDefaults(u8x8); + + /* setup specific callbacks */ + u8x8->display_cb = u8x8_d_tga_lcd; + + /* setup display info */ + u8x8_display_Setup(u8x8); +} + +void u8g2_Setup_TGA_LCD(u8g2_t *u8g2, const u8g2_cb_t *u8g2_cb) +{ + static uint8_t buf[(DEFAULT_WIDTH/FACTOR)*8]; + + u8x8_Setup_TGA_LCD(u8g2_GetU8x8(u8g2)); + u8g2_Setup(u8g2, buf, 1, u8g2_cb); +} + + + diff --git a/u8g2/sys/tga/hello_world_8x8/main.c b/u8g2/sys/tga/hello_world_8x8/main.c index d4e5f6ff..9490a578 100644 --- a/u8g2/sys/tga/hello_world_8x8/main.c +++ b/u8g2/sys/tga/hello_world_8x8/main.c @@ -56,7 +56,7 @@ u8x8_t u8x8; int main(void) { - u8x8_Setup_TGA(&u8x8); + u8x8_Setup_TGA_DESC(&u8x8); u8x8_display_Init(&u8x8); u8x8_display_SetPowerSave(&u8x8, 0); diff --git a/u8g2/sys/tga/text_picture_loop/Makefile b/u8g2/sys/tga/text_picture_loop/Makefile new file mode 100644 index 00000000..92cd9e27 --- /dev/null +++ b/u8g2/sys/tga/text_picture_loop/Makefile @@ -0,0 +1,12 @@ +CFLAGS = -g -Wall -I../../../csrc/. `sdl-config --cflags` + +SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c + +OBJ = $(SRC:.c=.o) + +u8g2_tga: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl-config --libs` -o u8g2_tga + +clean: + -rm $(OBJ) u8g2_tga + diff --git a/u8g2/sys/tga/text_picture_loop/main.c b/u8g2/sys/tga/text_picture_loop/main.c new file mode 100644 index 00000000..c8a31de4 --- /dev/null +++ b/u8g2/sys/tga/text_picture_loop/main.c @@ -0,0 +1,267 @@ + +#include "u8g2.h" +#include + +const uint8_t bdf_font[762] U8X8_FONT_SECTION("bdf_font") = { + 32,126,0,0,0,0,0,0,0,0,0,0,0,95,95,0, + 0,0,0,7,7,0,7,7,0,0,20,127,127,28,127,127, + 20,0,0,36,42,127,127,42,18,0,70,102,48,24,12,102, + 98,0,48,122,79,93,55,122,72,0,0,0,0,7,7,0, + 0,0,0,0,28,62,99,65,0,0,0,0,65,99,62,28, + 0,0,0,0,0,0,0,0,0,0,0,8,8,62,62,8, + 8,0,0,0,128,224,96,0,0,0,0,8,8,8,8,8, + 8,0,0,0,0,96,96,0,0,0,96,48,24,12,6,3, + 1,0,62,127,81,73,69,127,62,0,0,64,66,127,127,64, + 64,0,0,114,123,73,73,111,102,0,0,34,97,73,73,127, + 54,0,24,20,82,127,127,80,16,0,0,39,111,73,73,121, + 51,0,0,62,127,73,73,123,50,0,0,3,1,113,125,15, + 7,0,0,54,127,73,73,127,54,0,0,38,111,73,73,127, + 62,0,0,0,0,108,108,0,0,0,0,0,128,236,108,0, + 0,0,0,8,28,54,99,65,0,0,0,36,36,36,36,36, + 36,0,0,65,99,54,28,8,0,0,0,2,3,81,89,15, + 6,0,62,127,65,93,93,95,30,0,0,124,126,19,19,126, + 124,0,65,127,127,73,73,127,54,0,28,62,99,65,65,99, + 34,0,65,127,127,65,99,62,28,0,65,127,127,73,93,65, + 99,0,65,127,127,73,29,1,3,0,60,126,67,65,81,115, + 114,0,0,127,127,8,8,127,127,0,0,65,65,127,127,65, + 65,0,48,112,64,65,127,63,1,0,65,127,127,8,28,119, + 99,0,65,127,127,65,64,96,112,0,127,127,14,28,14,127, + 127,0,127,127,6,12,24,127,127,0,28,62,99,65,99,62, + 28,0,65,127,127,73,9,7,6,0,60,126,67,81,51,110, + 92,0,65,127,127,9,25,63,102,0,0,38,111,73,73,123, + 50,0,0,3,65,127,127,65,3,0,0,63,127,64,64,127, + 63,0,0,31,63,96,96,63,31,0,127,127,48,24,48,127, + 127,0,97,115,30,12,30,115,97,0,0,7,79,120,120,79, + 7,0,71,99,113,89,77,103,115,0,0,0,127,127,65,65, + 0,0,1,3,6,12,24,48,96,0,0,0,65,65,127,127, + 0,0,8,12,6,3,6,12,8,0,0,0,0,0,0,0, + 0,0,0,0,2,6,12,8,0,0,32,116,84,84,60,120, + 64,0,67,63,127,68,68,124,56,0,0,56,124,68,68,108, + 40,0,56,124,68,69,63,127,64,0,0,56,124,84,84,92, + 24,0,0,72,126,127,73,3,2,0,0,152,188,164,164,252, + 124,0,65,127,127,8,4,124,120,0,0,0,68,125,125,64, + 0,0,0,96,224,128,132,252,125,0,65,127,127,16,56,108, + 68,0,0,0,65,127,127,64,0,0,120,124,12,56,12,124, + 120,0,4,124,120,4,4,120,120,0,0,56,124,68,68,124, + 56,0,132,252,248,164,36,60,24,0,24,60,36,164,248,252, + 132,0,68,124,120,68,12,8,0,0,0,72,92,84,84,116, + 32,0,0,4,63,127,68,100,32,0,0,60,124,64,64,124, + 124,0,0,28,60,96,96,60,28,0,60,124,96,56,96,124, + 60,0,68,108,56,16,56,108,68,0,0,156,188,160,160,252, + 124,0,0,76,100,116,92,76,68,0,0,65,65,119,62,8, + 8,0,0,0,0,127,127,0,0,0,0,8,8,62,119,65, + 65,0,2,3,1,3,2,1,1,0}; + +const uint8_t u8g2_font_helvB18_tr[2245] U8X8_FONT_SECTION("u8g2_font_helvB18_tr") = { + 95,0,4,3,5,5,3,5,6,23,24,0,251,19,251,19, + 251,2,234,6,37,32,6,0,48,154,0,33,10,99,26,158, + 240,23,234,14,4,34,11,197,184,167,32,193,139,145,8,0, + 35,42,76,22,186,36,34,38,34,38,34,38,34,38,34,115, + 64,113,64,35,34,38,34,38,34,38,34,115,64,113,64,35, + 34,38,34,38,34,38,34,38,34,4,36,39,172,210,181,37, + 119,116,48,65,33,177,68,196,68,228,66,204,174,146,178,206, + 76,226,68,196,68,196,68,228,66,130,226,96,232,78,84,10, + 0,37,49,85,18,218,61,87,54,118,52,54,179,76,74,100, + 78,74,100,110,102,98,242,100,180,100,30,102,30,100,166,116, + 228,112,100,102,110,68,74,108,70,74,108,102,213,212,217,88, + 9,0,38,38,80,22,202,84,122,72,65,55,51,55,51,55, + 51,56,49,218,244,100,134,130,98,102,230,100,170,102,108,104, + 170,134,230,129,200,144,209,0,39,8,194,184,155,112,64,1, + 40,22,6,119,161,36,51,50,51,50,51,35,179,255,72,104, + 102,104,102,104,72,0,41,22,6,119,161,32,180,102,104,102, + 72,104,102,255,70,102,201,204,200,140,16,0,42,16,232,148, + 171,35,38,35,33,113,48,66,35,162,5,0,43,14,140,53, + 190,37,170,171,131,7,83,162,186,2,44,10,195,184,157,112, + 32,33,65,1,45,7,103,208,162,240,1,46,7,99,24,158, + 112,32,47,18,103,22,162,165,145,148,34,41,141,164,20,73, + 41,146,82,5,48,27,76,18,182,99,117,16,67,66,50,52, + 50,52,49,230,159,77,12,141,12,141,176,57,136,178,1,49, + 12,71,26,182,180,230,224,128,104,255,15,50,27,76,18,182, + 83,117,32,51,67,49,53,49,102,54,57,56,72,199,172,140, + 142,225,228,193,131,1,51,31,76,18,182,83,117,32,179,100, + 106,98,106,98,106,114,112,172,238,114,116,210,204,138,98,134, + 228,96,200,6,0,52,27,76,18,182,55,200,174,153,196,212, + 196,148,200,144,204,54,66,35,67,35,7,15,230,38,55,1, + 53,30,76,18,182,113,48,114,48,50,185,229,65,208,129,204, + 12,229,232,228,164,153,213,65,12,201,129,148,13,0,54,32, + 76,18,182,84,117,32,66,51,50,101,102,185,130,232,96,164, + 132,130,104,98,204,217,196,208,8,155,131,40,27,0,55,24, + 76,18,182,240,193,32,225,202,193,201,193,201,193,201,65,194, + 201,65,194,201,57,0,56,35,76,18,182,68,118,16,52,50, + 51,52,50,52,50,52,50,52,51,50,101,117,16,51,52,49, + 230,217,196,208,200,193,144,13,0,57,32,76,18,182,99,116, + 32,67,66,65,52,49,230,217,17,5,73,197,1,77,197,228, + 164,213,4,73,201,129,84,17,0,58,10,195,25,158,112,32, + 15,121,32,59,13,35,186,157,112,32,15,121,32,33,65,1, + 60,14,141,49,190,58,88,214,25,37,109,105,167,3,61,11, + 170,184,186,240,192,244,224,192,0,62,13,141,53,186,48,218, + 91,74,178,30,142,2,63,24,107,26,190,99,115,32,66,114, + 16,100,101,68,55,71,70,183,112,123,4,131,139,0,64,65, + 214,150,225,119,32,123,96,88,86,69,74,67,60,66,84,33, + 50,49,116,32,114,179,198,102,104,198,70,104,200,100,104,102, + 98,100,72,104,98,100,102,201,154,37,51,35,19,52,36,7, + 85,51,21,115,244,64,244,64,85,163,7,197,7,129,0,65, + 37,112,22,202,70,76,107,106,57,34,57,50,56,50,55,52, + 54,52,54,52,53,54,52,54,116,80,115,112,50,56,50,56, + 49,234,116,0,66,37,111,26,202,112,64,116,96,50,70,50, + 56,49,56,49,56,49,56,49,55,114,80,115,96,50,56,49, + 233,195,179,138,3,147,3,34,0,67,29,112,22,202,117,119, + 64,84,83,66,71,49,121,60,189,175,41,39,38,39,232,72, + 106,138,14,232,142,0,68,30,112,26,206,112,64,117,96,51, + 86,50,72,49,57,49,121,234,95,94,78,12,82,140,149,28, + 216,28,80,1,69,22,109,26,194,112,80,113,80,49,186,167, + 7,36,7,36,163,251,244,224,65,1,70,17,108,26,190,240, + 129,229,94,30,80,28,80,76,238,47,1,71,35,113,22,206, + 117,120,64,85,83,67,71,50,57,65,61,190,217,1,217,1, + 173,237,233,196,36,5,93,73,205,131,137,169,147,1,72,14, + 111,26,206,48,233,95,30,252,32,210,127,57,73,8,99,26, + 158,240,63,8,74,17,107,22,186,184,255,161,149,87,19,51, + 20,7,50,39,0,75,39,110,26,202,48,119,70,49,69,50, + 68,51,67,52,66,53,65,118,247,32,140,130,106,102,106,104, + 17,205,212,204,216,200,24,197,220,196,28,1,76,12,108,26, + 190,48,185,255,191,60,120,48,77,50,115,26,222,48,125,123, + 16,123,32,121,48,121,64,119,32,33,39,97,49,53,97,34, + 37,98,50,51,98,50,51,98,163,198,102,98,198,102,98,198, + 168,200,168,200,106,202,106,202,106,1,78,39,111,26,206,48, + 121,248,32,238,32,238,64,204,98,202,98,202,100,200,102,198, + 102,198,104,196,74,196,106,194,236,64,238,32,238,32,240,114, + 0,79,29,113,22,206,117,120,64,85,83,67,71,50,57,65, + 121,235,111,47,41,38,71,232,104,90,29,16,94,1,80,23, + 110,26,198,112,64,115,96,49,55,49,232,187,137,3,139,131, + 146,217,253,45,0,81,35,145,246,205,117,120,64,85,83,67, + 71,50,57,65,121,235,111,207,66,40,166,38,70,168,108,138, + 168,14,234,46,230,1,66,0,82,26,110,26,198,112,64,115, + 96,49,55,49,232,187,137,3,139,131,146,49,138,185,137,65, + 127,56,83,32,110,26,198,100,118,48,67,83,65,54,49,55, + 49,75,91,122,16,121,90,75,107,232,238,64,166,228,128,234, + 8,0,84,13,111,18,190,240,3,177,225,253,255,25,0,85, + 19,111,26,206,48,233,255,151,119,20,115,35,53,53,7,100, + 71,0,86,36,112,22,202,48,106,122,72,49,56,66,70,51, + 54,52,54,196,106,104,108,104,140,132,110,100,112,100,112,100, + 210,212,150,152,25,0,87,62,117,22,222,48,54,102,54,102, + 54,102,182,98,168,104,100,168,104,100,72,66,104,100,102,98, + 102,70,102,98,70,104,100,98,100,104,68,70,100,104,98,102, + 98,74,98,102,66,76,98,102,66,172,170,172,170,110,225,220, + 224,220,16,0,88,37,112,22,202,48,122,72,65,70,51,54, + 53,52,55,50,120,16,105,75,76,107,121,16,56,50,55,52, + 69,68,52,54,51,56,65,120,58,89,30,111,22,198,48,121, + 56,49,55,66,54,51,53,68,52,53,51,54,51,55,49,56, + 49,89,90,59,188,207,0,90,21,110,22,194,240,83,74,78, + 41,153,82,50,165,36,29,165,36,61,248,0,91,13,5,119, + 161,112,96,178,255,255,201,193,0,92,18,103,18,162,32,165, + 76,74,153,148,102,82,202,164,148,73,41,93,13,5,123,161, + 112,48,178,255,255,201,129,1,94,19,43,85,187,52,56,87, + 38,33,53,49,179,100,102,98,202,106,0,95,7,78,112,185, + 240,3,96,8,134,244,163,48,180,1,97,30,204,21,186,99, + 117,16,51,67,50,52,57,102,115,32,82,50,65,52,49,53, + 49,68,65,82,114,64,82,50,98,26,108,26,190,48,185,23, + 53,7,35,37,20,68,19,99,126,118,52,81,66,113,48,50, + 81,3,99,21,203,21,182,99,116,16,194,98,200,112,47,135, + 38,72,72,14,130,76,0,100,25,108,22,190,185,55,21,35, + 7,19,36,21,67,103,126,54,49,68,65,82,114,48,83,49, + 101,27,204,21,186,68,118,16,67,66,50,52,49,102,118,240, + 129,228,232,212,4,13,201,129,84,13,0,102,16,103,22,166, + 67,82,50,180,228,224,100,104,255,19,0,103,31,108,118,189, + 83,49,114,48,65,82,49,116,230,103,19,67,20,36,37,7, + 51,21,147,102,71,35,7,67,54,0,104,17,107,26,190,48, + 184,23,52,7,19,52,19,83,254,175,6,105,10,99,26,158, + 112,32,118,240,7,106,13,5,115,157,178,241,200,254,127,114, + 80,1,107,31,107,26,186,48,184,71,19,51,20,35,36,19, + 52,71,86,71,19,52,35,51,35,36,51,20,67,19,67,87, + 3,108,8,99,26,158,240,63,8,109,36,209,25,214,48,65, + 82,114,112,32,65,82,114,52,100,52,100,52,100,52,100,52, + 100,52,100,52,100,52,100,52,100,52,100,180,0,110,16,203, + 25,190,48,81,114,48,65,51,49,229,255,106,0,111,23,204, + 21,186,68,118,16,67,66,50,52,49,230,103,19,67,35,108, + 14,194,136,0,112,27,108,122,189,48,81,115,48,82,66,65, + 52,49,230,103,71,19,37,20,7,35,19,53,147,187,4,113, + 25,108,118,189,83,49,114,48,65,82,49,116,230,103,19,67, + 20,36,37,7,51,21,147,123,114,13,199,25,170,48,113,240, + 102,104,255,8,0,115,25,203,21,182,98,116,16,194,98,104, + 98,208,236,32,204,240,202,234,134,226,64,230,4,0,116,15, + 71,22,166,50,180,201,193,201,208,254,81,13,1,117,16,203, + 25,190,48,229,255,136,98,164,194,98,102,100,0,118,26,204, + 21,186,48,230,108,98,104,100,104,100,104,102,100,104,100,104, + 100,202,204,142,144,17,0,119,43,211,17,206,48,53,101,181, + 66,106,74,100,166,102,100,166,102,70,133,140,144,200,196,136, + 208,196,86,18,50,18,98,53,101,53,117,83,131,83,131,83, + 67,0,120,26,203,21,182,48,117,67,49,179,98,232,170,110, + 174,172,106,98,134,130,100,102,130,230,106,0,121,32,109,118, + 189,48,103,55,49,54,65,52,51,52,67,66,52,50,53,50, + 102,103,88,72,186,114,116,114,176,144,14,0,122,19,203,21, + 182,240,65,220,58,50,186,57,50,186,117,116,7,15,2,123, + 15,7,119,169,52,179,104,191,89,52,181,104,191,90,124,8, + 2,127,157,240,15,12,125,16,7,123,169,48,181,104,191,90, + 52,179,104,191,89,4,126,13,139,180,186,65,115,48,97,113, + 48,67,1,0,0}; + +u8g2_t u8g2; + +int main(void) +{ + int x, y; + int k; + int i; + + u8g2_Setup_TGA_DESC(&u8g2, &u8g2_cb_r0); + u8x8_display_Init(u8g2_GetU8x8(&u8g2)); + u8x8_display_SetPowerSave(u8g2_GetU8x8(&u8g2), 0); + u8g2_SetFont(&u8g2, u8g2_font_helvB18_tr); + + x = 50; + y = 30+0; + + +#ifdef U8G2_WITH_HVLINE_COUNT + u8g2.hv_cnt = 0UL; +#endif /* U8G2_WITH_HVLINE_COUNT */ + + /* + u8g2_ClearBuffer(&u8g2); + + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); + + u8g2_SendBuffer(&u8g2); + */ + + u8g2_FirstPage(&u8g2); + i = 0; + do + { + u8g2_SetFontDirection(&u8g2, 0); + u8g2_DrawString(&u8g2, x, y, "ABC"); + u8g2_SetFontDirection(&u8g2, 1); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 2); + u8g2_DrawString(&u8g2, x, y, "abc"); + u8g2_SetFontDirection(&u8g2, 3); + u8g2_DrawString(&u8g2, x, y, "abc"); + if ( i == 1 ) + { + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y1-1, 1, 0); + u8g2_DrawHVLine(&u8g2, u8g2.user_x1-1, u8g2.user_y0, 1, 0); + + } + + i++; + + + } while( u8g2_NextPage(&u8g2) ); +#ifdef U8G2_WITH_HVLINE_COUNT + printf("hv cnt: %ld\n", u8g2.hv_cnt); +#endif /* U8G2_WITH_HVLINE_COUNT */ + + tga_save("u8g2.tga"); + + return 0; +} + From 469a8050583d6e1b706641dc9805353a33518c0a Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 28 Feb 2016 22:23:26 +0100 Subject: [PATCH 085/109] update --- sys/arduino/HelloWorld/HelloWorld.pde | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index 209eed66..52bfeb83 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -58,7 +58,7 @@ //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 -//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 +U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 //U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 //U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 From b85e668eb642cd6b01c9d987604b7cb41eedf817 Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 4 Apr 2016 20:18:48 +0200 Subject: [PATCH 086/109] issue 315 --- csrc/u8g_dev_ssd1306_128x32.c | 14 + csrc/u8g_dev_ssd1306_128x64.c | 36 ++ csrc/u8g_dev_ssd1306_64x48.c | 14 + csrc/u8g_dev_uc1611_dogm240.c | 16 +- csrc/u8g_dev_uc1611_dogxl240.c | 15 +- csrc/u8g_rot.c | 2 +- sfntsrc/u8g_font_data.c | 764 -------------------------- sys/arduino/HelloWorld/HelloWorld.pde | 10 +- 8 files changed, 95 insertions(+), 776 deletions(-) diff --git a/csrc/u8g_dev_ssd1306_128x32.c b/csrc/u8g_dev_ssd1306_128x32.c index 3052d6bc..ff516ff6 100644 --- a/csrc/u8g_dev_ssd1306_128x32.c +++ b/csrc/u8g_dev_ssd1306_128x32.c @@ -230,6 +230,13 @@ uint8_t u8g_dev_ssd1306_128x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */ + u8g_SetChipSelect(u8g, dev, 0); + return 1; case U8G_DEV_MSG_SLEEP_ON: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); return 1; @@ -268,6 +275,13 @@ uint8_t u8g_dev_ssd1306_128x32_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */ + u8g_SetChipSelect(u8g, dev, 0); + return 1; case U8G_DEV_MSG_SLEEP_ON: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); return 1; diff --git a/csrc/u8g_dev_ssd1306_128x64.c b/csrc/u8g_dev_ssd1306_128x64.c index bd627796..1b67fbb4 100644 --- a/csrc/u8g_dev_ssd1306_128x64.c +++ b/csrc/u8g_dev_ssd1306_128x64.c @@ -240,6 +240,15 @@ uint8_t u8g_dev_ssd1306_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void case U8G_DEV_MSG_SLEEP_OFF: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); return 1; + case U8G_DEV_MSG_CONTRAST: + { + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, *(uint8_t *) arg); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } @@ -271,6 +280,15 @@ uint8_t u8g_dev_ssd1306_adafruit_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_SLEEP_OFF: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); return 1; + case U8G_DEV_MSG_CONTRAST: + { + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, *(uint8_t *) arg); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } @@ -349,6 +367,15 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo case U8G_DEV_MSG_SLEEP_OFF: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); return 1; + case U8G_DEV_MSG_CONTRAST: + { + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, *(uint8_t *) arg); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } } return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } @@ -386,6 +413,15 @@ uint8_t u8g_dev_sh1106_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi case U8G_DEV_MSG_SLEEP_OFF: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_off); return 1; + case U8G_DEV_MSG_CONTRAST: + { + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, *(uint8_t *) arg); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } } return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } diff --git a/csrc/u8g_dev_ssd1306_64x48.c b/csrc/u8g_dev_ssd1306_64x48.c index 1ca00e82..b9bdb1d1 100644 --- a/csrc/u8g_dev_ssd1306_64x48.c +++ b/csrc/u8g_dev_ssd1306_64x48.c @@ -128,6 +128,13 @@ uint8_t u8g_dev_ssd1306_64x48_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */ + u8g_SetChipSelect(u8g, dev, 0); + return 1; case U8G_DEV_MSG_SLEEP_ON: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); return 1; @@ -166,6 +173,13 @@ uint8_t u8g_dev_ssd1306_64x48_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* 11 Jul 2015: fixed contrast calculation */ + u8g_SetChipSelect(u8g, dev, 0); + return 1; case U8G_DEV_MSG_SLEEP_ON: u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd13xx_sleep_on); return 1; diff --git a/csrc/u8g_dev_uc1611_dogm240.c b/csrc/u8g_dev_uc1611_dogm240.c index 88efe1e3..e0f66091 100644 --- a/csrc/u8g_dev_uc1611_dogm240.c +++ b/csrc/u8g_dev_uc1611_dogm240.c @@ -43,8 +43,16 @@ static const uint8_t u8g_dev_uc1611_dogm240_init_seq[] PROGMEM = { - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ + U8G_ESC_DLY(200), + U8G_ESC_CS(1), // enable chip U8G_ESC_ADR(0), // instruction mode + 0xe2, // system reset + U8G_ESC_DLY(1), + 0x2f, // enable internal charge pump + 0xF1, // set last COM electrode 0x3F, // 64-1=63 0xF2, // set display start line @@ -96,16 +104,16 @@ uint8_t u8g_dev_uc1611_dogm240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void u8g_SetAddress(u8g, dev, 1); /* data mode */ if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) return 0; - u8g_SetChipSelect(u8g, dev, 1); + u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: - u8g_SetChipSelect(u8g, dev, 0); + u8g_SetChipSelect(u8g, dev, 1); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x81); /* 11 Jul 2015: bugfix, github issue 339 */ u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ - u8g_SetChipSelect(u8g, dev, 1); + u8g_SetChipSelect(u8g, dev, 0); return 1; } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); diff --git a/csrc/u8g_dev_uc1611_dogxl240.c b/csrc/u8g_dev_uc1611_dogxl240.c index 216300d4..1eaa4570 100644 --- a/csrc/u8g_dev_uc1611_dogxl240.c +++ b/csrc/u8g_dev_uc1611_dogxl240.c @@ -43,8 +43,17 @@ static const uint8_t u8g_dev_uc1611_dogxl240_init_seq[] PROGMEM = { + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ + U8G_ESC_DLY(200), U8G_ESC_CS(1), // enable chip U8G_ESC_ADR(0), // instruction mode + + 0xe2, // system reset + U8G_ESC_DLY(1), + 0x2f, // enable internal charge pump + 0xF1, // set last COM electrode 0x7F, // DOGXL240 0xF2, // set display start line @@ -96,16 +105,16 @@ static uint8_t u8g_dev_uc1611_dogxl240_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t ms u8g_SetAddress(u8g, dev, 1); /* data mode */ if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) return 0; - u8g_SetChipSelect(u8g, dev, 1); + u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: - u8g_SetChipSelect(u8g, dev, 0); + u8g_SetChipSelect(u8g, dev, 1); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x81); /* 11 Jul 2015: bugfix, github issue 339 */ u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) ); /* set contrast from, keep gain at 0 */ - u8g_SetChipSelect(u8g, dev, 1); + u8g_SetChipSelect(u8g, dev, 0); return 1; } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); diff --git a/csrc/u8g_rot.c b/csrc/u8g_rot.c index 3791675b..6df32834 100644 --- a/csrc/u8g_rot.c +++ b/csrc/u8g_rot.c @@ -40,7 +40,7 @@ uint8_t u8g_dev_rot90_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg); uint8_t u8g_dev_rot180_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg); uint8_t u8g_dev_rot270_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg); -uint8_t u8g_dev_rot_dummy_fn(void *u8g, void *dev, uint8_t msg, void *arg) +uint8_t u8g_dev_rot_dummy_fn(u8g_t *u8g, u8g_dev_t*dev, uint8_t msg, void *arg) { return 0; } diff --git a/sfntsrc/u8g_font_data.c b/sfntsrc/u8g_font_data.c index 09108089..55557fe9 100644 --- a/sfntsrc/u8g_font_data.c +++ b/sfntsrc/u8g_font_data.c @@ -18731,49 +18731,6 @@ const u8g_fntpgm_uint8_t u8g_font_fub20r[4022] U8G_FONT_SECTION("u8g_font_fub20r 192,15,0,30,0,30,0,30,0,30,0,30,0,30,0,30, 0,30,0,124,0,252,0,240,0,14,3,6,14,0,5,63, 156,127,248,225,240,255}; -/* - Fontname: -FreeType-FreeUniversal-Bold-R-Normal--27-270-72-72-P-136-ISO10646-1 - Copyright: FreeUniveral (c) Stephen Wilson 2009 Original Font Sil-Sophia Copyright (c) SIL International, 1994-2008. - Capital A Height: 0, '1' Height: 20 - Calculated Max Values w=14 h=20 x= 4 y= 0 dx=15 dy= 0 ascent=20 len=40 - Font Bounding box w=40 h=36 x=-2 y=-7 - Calculated Min Values x= 0 y= 0 dx= 0 dy= 0 - Pure Font ascent =20 descent= 0 - X Font ascent =20 descent= 0 - Max Font ascent =20 descent= 0 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_fub20t[477] U8G_SECTION(".progmem.u8g_font_fub20t") = { - 0,40,36,254,249,20,0,0,0,0,48,58,0,20,0,20, - 0,14,20,40,15,1,0,15,128,31,224,60,240,120,112,112, - 56,240,56,240,56,240,60,240,60,240,60,240,60,240,60,240, - 60,240,56,240,56,112,56,120,120,60,240,31,224,15,128,8, - 20,20,15,3,0,15,63,127,255,239,207,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,14,20,40,15,1,0,7, - 192,31,240,63,248,124,120,120,60,120,60,0,60,0,120,0, - 120,0,240,1,240,3,224,7,192,15,128,31,0,124,0,248, - 0,255,252,255,252,255,252,13,20,40,15,1,0,15,128,63, - 224,127,240,248,240,240,120,0,120,0,120,0,240,15,224,15, - 128,15,224,0,240,0,120,0,120,240,120,240,120,248,240,127, - 240,63,224,31,128,14,20,40,15,1,0,1,240,3,240,3, - 240,7,240,7,240,14,240,30,240,28,240,60,240,56,240,120, - 240,112,240,240,240,255,252,255,252,255,252,0,240,0,240,0, - 240,0,240,13,20,40,15,1,0,255,240,255,240,255,240,240, - 0,240,0,240,0,240,0,247,192,255,224,253,240,240,120,240, - 120,0,120,0,120,0,120,240,120,240,240,127,240,63,224,31, - 128,13,20,40,15,1,0,15,192,31,224,63,240,120,120,120, - 120,112,0,240,0,247,192,239,224,253,240,248,120,240,120,240, - 120,240,120,240,120,112,120,120,240,63,240,63,224,15,128,13, - 20,40,15,1,0,255,248,255,248,255,248,0,120,0,120,0, - 240,0,240,1,224,1,224,1,224,3,192,3,192,7,128,7, - 128,15,128,15,0,31,0,30,0,30,0,62,0,14,20,40, - 15,1,0,31,192,63,240,127,240,120,248,240,120,240,120,240, - 120,120,240,63,224,31,192,63,240,120,120,240,56,240,60,240, - 60,240,60,248,120,127,248,63,240,31,192,13,20,40,15,1, - 0,15,128,63,192,127,224,120,240,240,112,240,120,240,120,240, - 120,240,120,120,248,127,184,63,56,0,120,0,120,0,112,240, - 240,120,240,127,224,63,192,15,128,4,14,14,9,4,0,240, - 240,240,240,0,0,0,0,0,0,240,240,240,240}; /* Fontname: -FreeType-FreeUniversal-Bold-R-Normal--34-340-72-72-P-170-ISO10646-1 Copyright: FreeUniveral (c) Stephen Wilson 2009 Original Font Sil-Sophia Copyright (c) SIL International, 1994-2008. @@ -45380,34 +45337,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR08[2687] U8G_FONT_SECTION("u8g_font_helvR 11,5,255,254,8,16,0,72,72,80,80,48,32,32,192,5, 10,10,6,0,254,128,128,176,200,136,136,200,176,128,128,5, 10,10,5,255,254,80,0,72,72,80,80,48,32,32,192}; -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--11-80-100-100-P-56-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 0, '1' Height: 8 - Calculated Max Values w= 5 h= 8 x= 1 y= 5 dx= 6 dy= 0 ascent= 8 len= 8 - Font Bounding box w=13 h=18 x=-2 y=-4 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 8 descent= 0 - X Font ascent = 8 descent= 0 - Max Font ascent = 8 descent=-2 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_helvR08n[226] U8G_FONT_SECTION("u8g_font_helvR08n") = { - 0,13,18,254,252,8,0,0,0,0,42,58,0,8,254,8, - 0,3,3,3,4,0,5,160,64,160,5,5,5,6,0,1, - 32,32,248,32,32,2,3,3,3,0,254,64,64,128,3,1, - 1,4,0,3,224,1,1,1,3,1,0,128,3,8,8,3, - 0,0,32,32,64,64,64,64,128,128,5,8,8,6,0,0, - 112,136,136,136,136,136,136,112,2,8,8,6,1,0,64,192, - 64,64,64,64,64,64,5,8,8,6,0,0,112,136,8,8, - 48,64,128,248,5,8,8,6,0,0,112,136,8,48,8,8, - 136,112,5,8,8,6,0,0,16,48,80,80,144,248,16,16, - 5,8,8,6,0,0,120,64,64,112,8,8,136,112,5,8, - 8,6,0,0,112,136,128,240,136,136,136,112,5,8,8,6, - 0,0,248,8,16,32,32,64,64,64,5,8,8,6,0,0, - 112,136,136,112,136,136,136,112,5,8,8,6,0,0,112,136, - 136,136,120,8,136,112,1,6,6,3,1,0,128,0,0,0, - 0,128}; /* Fontname: -Adobe-Helvetica-Medium-R-Normal--11-80-100-100-P-56-ISO10646-1 Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. @@ -45735,36 +45664,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR10[3527] U8G_FONT_SECTION("u8g_font_helvR 14,14,8,1,253,128,128,128,184,204,132,132,132,132,204,184, 128,128,128,7,14,14,7,0,253,36,36,0,130,194,68,68, 36,40,24,16,16,48,96}; -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--14-100-100-100-P-76-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 0, '1' Height: 11 - Calculated Max Values w= 7 h=11 x= 2 y= 6 dx= 9 dy= 0 ascent=11 len=11 - Font Bounding box w=17 h=22 x=-2 y=-5 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent =11 descent= 0 - X Font ascent =11 descent= 0 - Max Font ascent =11 descent=-2 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_helvR10n[267] U8G_FONT_SECTION("u8g_font_helvR10n") = { - 0,17,22,254,251,11,0,0,0,0,42,58,0,11,254,11, - 0,5,5,5,7,1,6,32,168,112,168,32,7,7,7,9, - 1,1,16,16,16,254,16,16,16,2,4,4,3,0,254,64, - 64,64,128,3,1,1,4,0,4,224,1,2,2,3,1,0, - 128,128,4,11,11,4,0,0,16,16,32,32,32,64,64,64, - 128,128,128,6,11,11,8,1,0,120,132,132,132,132,132,132, - 132,132,132,120,3,11,11,8,2,0,32,224,32,32,32,32, - 32,32,32,32,32,6,11,11,8,1,0,120,132,132,4,8, - 16,32,64,128,128,252,6,11,11,8,1,0,120,132,132,4, - 4,56,4,4,132,132,120,7,11,11,8,1,0,4,12,20, - 36,68,132,132,254,4,4,4,6,11,11,8,1,0,252,128, - 128,128,248,4,4,4,132,132,120,6,11,11,8,1,0,120, - 132,128,128,184,196,132,132,132,132,120,6,11,11,8,1,0, - 252,4,8,8,16,16,32,32,64,64,64,6,11,11,8,1, - 0,120,132,132,132,132,120,132,132,132,132,120,6,11,11,8, - 1,0,120,132,132,132,132,124,4,4,132,132,120,1,8,8, - 3,1,0,128,128,0,0,0,0,128,128}; /* Fontname: -Adobe-Helvetica-Medium-R-Normal--14-100-100-100-P-76-ISO10646-1 Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. @@ -46150,38 +46049,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR12[4077] U8G_FONT_SECTION("u8g_font_helvR 32,192,7,16,16,9,1,252,128,128,128,184,196,130,130,130, 130,130,196,184,128,128,128,128,7,15,15,8,0,253,40,40, 0,130,130,68,68,40,40,56,16,16,32,32,192}; -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--17-120-100-100-P-88-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 0, '1' Height: 12 - Calculated Max Values w= 9 h=12 x= 3 y= 7 dx=10 dy= 0 ascent=12 len=18 - Font Bounding box w=20 h=26 x=-2 y=-6 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent =12 descent= 0 - X Font ascent =12 descent= 0 - Max Font ascent =12 descent=-2 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_helvR12n[290] U8G_FONT_SECTION("u8g_font_helvR12n") = { - 0,20,26,254,250,12,0,0,0,0,42,58,0,12,254,12, - 0,5,5,5,6,0,7,32,168,112,80,136,9,9,18,10, - 0,0,8,0,8,0,8,0,8,0,255,128,8,0,8,0, - 8,0,8,0,2,4,4,4,1,254,64,64,64,128,4,1, - 1,5,0,4,240,1,2,2,4,2,0,128,128,4,12,12, - 5,0,0,16,16,32,32,32,32,64,64,64,128,128,128,7, - 12,12,9,1,0,56,68,68,130,130,130,130,130,130,68,68, - 56,3,12,12,9,3,0,32,32,96,160,32,32,32,32,32, - 32,32,32,7,12,12,9,1,0,56,68,130,130,2,4,8, - 48,64,128,128,254,7,12,12,9,1,0,56,68,130,130,4, - 56,4,2,130,130,68,56,8,12,12,9,0,0,12,20,20, - 36,36,68,68,132,255,4,4,4,7,12,12,9,1,0,62, - 32,32,64,120,68,2,2,2,130,68,56,7,12,12,9,1, - 0,60,66,130,128,184,196,130,130,130,130,68,56,8,12,12, - 9,0,0,255,1,2,4,4,8,8,16,16,16,32,32,7, - 12,12,9,1,0,56,68,130,130,68,56,68,130,130,130,68, - 56,7,12,12,9,1,0,56,68,130,130,130,130,70,58,2, - 130,132,120,1,9,9,4,2,0,128,128,0,0,0,0,0, - 128,128}; /* Fontname: -Adobe-Helvetica-Medium-R-Normal--17-120-100-100-P-88-ISO10646-1 Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. @@ -46636,39 +46503,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR14[4920] U8G_FONT_SECTION("u8g_font_helvR 193,128,227,0,255,0,222,0,192,0,192,0,192,0,192,0, 8,18,18,10,1,252,102,102,0,0,195,195,195,102,102,102, 36,60,24,24,24,24,112,112}; -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--20-140-100-100-P-100-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 0, '1' Height: 13 - Calculated Max Values w= 9 h=14 x= 2 y= 7 dx=10 dy= 0 ascent=14 len=26 - Font Bounding box w=22 h=29 x=-2 y=-7 - Calculated Min Values x= 0 y=-3 dx= 0 dy= 0 - Pure Font ascent =13 descent= 0 - X Font ascent =13 descent= 0 - Max Font ascent =14 descent=-3 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_helvR14n[311] U8G_FONT_SECTION("u8g_font_helvR14n") = { - 0,22,29,254,249,13,0,0,0,0,42,58,0,14,253,13, - 0,5,7,7,7,1,7,32,168,248,32,248,168,32,8,10, - 10,10,1,0,24,24,24,24,255,255,24,24,24,24,2,5, - 5,5,1,253,192,192,64,64,128,5,1,1,6,0,5,248, - 2,2,2,5,1,0,192,192,5,14,14,5,0,0,24,24, - 24,24,48,48,48,96,96,96,192,192,192,192,8,13,13,10, - 1,0,60,126,102,195,195,195,195,195,195,195,102,126,60,5, - 13,13,10,2,0,24,248,248,24,24,24,24,24,24,24,24, - 24,24,8,13,13,10,1,0,60,254,195,3,7,14,28,56, - 112,224,192,255,255,8,13,13,10,1,0,62,127,195,195,6, - 28,30,7,3,195,199,126,60,9,13,26,10,0,0,3,0, - 7,0,15,0,27,0,51,0,51,0,99,0,195,0,255,128, - 255,128,3,0,3,0,3,0,8,13,13,10,1,0,254,254, - 192,192,252,254,199,3,3,195,199,254,124,8,13,13,10,1, - 0,60,127,99,192,192,220,254,195,195,195,227,126,60,8,13, - 13,10,1,0,255,255,3,6,12,12,24,24,48,48,96,96, - 96,8,13,13,10,1,0,60,126,231,195,195,102,126,231,195, - 195,231,126,60,8,13,13,10,1,0,60,126,199,195,195,195, - 127,59,3,3,198,254,124,2,10,10,5,1,0,192,192,0, - 0,0,0,0,0,192,192}; /* Fontname: -Adobe-Helvetica-Medium-R-Normal--20-140-100-100-P-100-ISO10646-1 Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. @@ -47295,53 +47129,6 @@ const u8g_fntpgm_uint8_t u8g_font_helvR18[7307] U8G_FONT_SECTION("u8g_font_helvR 128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56, 224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3, 0,6,0,6,0,12,0,60,0,56,0}; -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 0, '1' Height: 18 - Calculated Max Values w=12 h=19 x= 2 y=12 dx=14 dy= 0 ascent=19 len=36 - Font Bounding box w=28 h=37 x=-3 y=-8 - Calculated Min Values x= 0 y=-3 dx= 0 dy= 0 - Pure Font ascent =18 descent= 0 - X Font ascent =18 descent= 0 - Max Font ascent =19 descent=-3 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_helvR18n[536] U8G_FONT_SECTION("u8g_font_helvR18n") = { - 0,28,37,253,248,18,0,0,0,0,42,58,0,19,253,18, - 0,7,7,7,10,1,12,16,16,214,124,56,108,68,12,12, - 24,14,1,1,6,0,6,0,6,0,6,0,6,0,255,240, - 255,240,6,0,6,0,6,0,6,0,6,0,2,6,6,6, - 2,253,192,192,192,64,64,128,6,2,2,8,1,6,252,252, - 2,3,3,6,2,0,192,192,192,7,19,19,7,0,0,6, - 4,12,12,8,24,24,16,16,48,48,32,96,96,64,192,192, - 128,128,11,18,36,13,1,0,31,0,63,128,113,192,96,192, - 96,192,224,224,192,96,192,96,192,96,192,96,192,96,192,96, - 224,224,96,192,96,192,113,192,63,128,31,0,6,18,18,13, - 2,0,12,12,28,252,252,12,12,12,12,12,12,12,12,12, - 12,12,12,12,11,18,36,13,1,0,30,0,127,128,97,192, - 192,192,192,96,192,96,0,224,0,192,1,192,3,128,15,0, - 28,0,56,0,112,0,224,0,192,0,255,224,255,224,11,18, - 36,13,1,0,31,0,127,128,97,128,192,192,192,192,192,192, - 0,192,1,128,15,0,15,192,0,192,0,96,0,96,192,96, - 192,192,97,192,127,128,31,0,11,18,36,13,1,0,1,128, - 3,128,3,128,7,128,15,128,13,128,25,128,57,128,49,128, - 97,128,225,128,193,128,255,224,255,224,1,128,1,128,1,128, - 1,128,11,18,36,13,1,0,127,192,127,192,96,0,96,0, - 96,0,96,0,126,0,127,128,113,192,0,192,0,224,0,96, - 0,96,192,224,192,192,225,192,127,128,30,0,11,18,36,13, - 1,0,15,0,63,192,112,192,96,96,224,96,192,0,192,0, - 207,0,223,128,241,192,224,192,192,96,192,96,192,96,224,224, - 113,192,127,192,31,0,11,18,36,13,1,0,255,224,255,224, - 0,224,0,192,1,128,1,128,3,0,3,0,6,0,6,0, - 12,0,12,0,28,0,24,0,24,0,56,0,48,0,48,0, - 11,18,36,13,1,0,14,0,63,128,49,128,96,192,96,192, - 96,192,49,128,31,0,63,128,113,192,96,192,192,96,192,96, - 192,96,192,96,96,192,127,192,31,0,11,18,36,13,1,0, - 31,0,127,192,113,192,224,192,192,96,192,96,192,96,192,96, - 224,224,113,224,127,96,30,96,0,96,0,224,192,192,225,192, - 127,128,30,0,2,14,14,6,2,0,192,192,192,0,0,0, - 0,0,0,0,0,192,192,192}; /* Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. @@ -83974,557 +83761,6 @@ const u8g_fntpgm_uint8_t u8g_font_u8glib_4r[664] U8G_FONT_SECTION("u8g_font_u8gl 1,54,70,96,64,128,128,64,96,1,22,38,128,128,128,128, 128,128,1,54,70,192,64,32,32,64,192,5,66,82,80,160, 2,69,85,240,144,144,144,240}; -/* - Fontname: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1 - Copyright: - Capital A Height: 10, '1' Height: 10 - Calculated Max Values w=16 h=16 x= 4 y=14 dx=16 dy= 0 ascent=14 len=32 - Font Bounding box w=16 h=16 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent =10 descent=-2 - X Font ascent =11 descent=-2 - Max Font ascent =14 descent=-2 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_unifont_0_10[5136] U8G_FONT_SECTION("u8g_font_unifont_0_10") = { - 0,16,16,0,254,10,5,43,7,25,10,255,254,14,254,11, - 254,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,65,241,193,0,65,241,193,0,125,1,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,69,241,196,64,68,65,168,64,16, - 65,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,125,241,193, - 0,125,241,193,0,65,1,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,61,225,193,16,65,225,193,32,61,17,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,60,225,193,16,57,17,133, - 16,120,225,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,61, - 241,192,64,56,65,132,64,121,241,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,114,57,202,32,74,57,202,32,115,185,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,113,137,202,24,74, - 9,202,8,113,157,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,113,153,202,4,74,9,202,16,113,157,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,113,153,202,4,74,25,202,4,113, - 153,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,113,133,202, - 12,74,21,202,28,113,133,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,73,147,234,84,106,89,219,212,74,83,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,52,83,194,154,49,23,137, - 18,113,19,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,123, - 185,193,36,121,57,193,36,121,57,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,51,37,196,180,71,173,196,164,52,165,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,125,17,193,176,125, - 81,193,16,125,17,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,58,93,194,82,50,93,138,82,113,157,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,121,207,194,16,121,145,192,80,123, - 143,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,121,193,194, - 0,121,129,192,64,67,129,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,57,193,194,0,89,129,200,64,59,129,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,113,193,202,0,113,129,208, - 64,75,129,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,73, - 193,202,0,73,129,200,64,51,129,128,0,0,1,128,0,0, - 1,128,0,85,85,0,0,0,8,0,14,1,10,10,8,4, - 0,128,128,128,128,128,128,128,0,128,128,5,4,4,8,2, - 8,136,136,136,136,6,10,10,8,1,0,36,36,36,252,72, - 72,252,144,144,144,7,10,10,8,1,0,16,124,146,144,112, - 28,18,146,124,16,7,10,10,8,1,0,98,148,148,104,16, - 16,44,82,82,140,7,10,10,8,1,0,56,68,68,68,56, - 114,138,132,140,114,1,4,4,8,4,8,128,128,128,128,3, - 12,12,8,3,255,32,64,64,128,128,128,128,128,128,64,64, - 32,3,12,12,8,2,255,128,64,64,32,32,32,32,32,32, - 64,64,128,7,7,7,8,1,1,16,146,84,56,84,146,16, - 7,7,7,8,1,1,16,16,16,254,16,16,16,2,4,4, - 8,3,254,192,64,64,128,6,1,1,8,1,4,252,2,2, - 2,8,3,0,192,192,6,10,10,8,1,0,4,4,8,16, - 16,32,32,64,128,128,6,10,10,8,1,0,48,72,132,132, - 132,132,132,132,72,48,5,10,10,8,2,0,32,96,160,32, - 32,32,32,32,32,248,6,10,10,8,1,0,120,132,132,4, - 24,32,64,128,128,252,6,10,10,8,1,0,120,132,132,4, - 56,4,4,132,132,120,6,10,10,8,1,0,8,24,40,72, - 136,136,252,8,8,8,6,10,10,8,1,0,252,128,128,128, - 248,4,4,4,132,120,6,10,10,8,1,0,56,64,128,128, - 248,132,132,132,132,120,6,10,10,8,1,0,252,4,4,8, - 8,8,16,16,16,16,6,10,10,8,1,0,120,132,132,132, - 120,132,132,132,132,120,6,10,10,8,1,0,120,132,132,132, - 124,4,4,4,8,112,2,7,7,8,3,1,192,192,0,0, - 0,192,192,2,9,9,8,3,255,192,192,0,0,0,192,64, - 64,128,5,9,9,8,2,0,8,16,32,64,128,64,32,16, - 8,6,5,5,8,1,2,252,0,0,0,252,5,9,9,8, - 1,0,128,64,32,16,8,16,32,64,128,6,10,10,8,1, - 0,120,132,132,4,8,16,16,0,16,16,6,10,10,8,1, - 0,56,68,148,172,164,164,164,156,64,60,6,10,10,8,1, - 0,48,72,72,132,132,252,132,132,132,132,6,10,10,8,1, - 0,248,132,132,132,248,132,132,132,132,248,6,10,10,8,1, - 0,120,132,132,128,128,128,128,132,132,120,6,10,10,8,1, - 0,240,136,132,132,132,132,132,132,136,240,6,10,10,8,1, - 0,252,128,128,128,248,128,128,128,128,252,6,10,10,8,1, - 0,252,128,128,128,248,128,128,128,128,128,6,10,10,8,1, - 0,120,132,132,128,128,156,132,132,140,116,6,10,10,8,1, - 0,132,132,132,132,252,132,132,132,132,132,5,10,10,8,2, - 0,248,32,32,32,32,32,32,32,32,248,7,10,10,8,1, - 0,62,8,8,8,8,8,8,136,136,112,6,10,10,8,1, - 0,132,136,144,160,192,192,160,144,136,132,6,10,10,8,1, - 0,128,128,128,128,128,128,128,128,128,252,6,10,10,8,1, - 0,132,132,204,204,180,180,132,132,132,132,6,10,10,8,1, - 0,132,196,196,164,164,148,148,140,140,132,6,10,10,8,1, - 0,120,132,132,132,132,132,132,132,132,120,6,10,10,8,1, - 0,248,132,132,132,248,128,128,128,128,128,7,11,11,8,1, - 255,120,132,132,132,132,132,132,180,204,120,6,6,10,10,8, - 1,0,248,132,132,132,248,144,136,136,132,132,6,10,10,8, - 1,0,120,132,132,128,96,24,4,132,132,120,7,10,10,8, - 1,0,254,16,16,16,16,16,16,16,16,16,6,10,10,8, - 1,0,132,132,132,132,132,132,132,132,132,120,7,10,10,8, - 1,0,130,130,130,68,68,68,40,40,16,16,6,10,10,8, - 1,0,132,132,132,132,180,180,204,204,132,132,6,10,10,8, - 1,0,132,132,72,72,48,48,72,72,132,132,7,10,10,8, - 1,0,130,130,68,68,40,16,16,16,16,16,6,10,10,8, - 1,0,252,4,4,8,16,32,64,128,128,252,3,12,12,8, - 4,255,224,128,128,128,128,128,128,128,128,128,128,224,6,10, - 10,8,1,0,128,128,64,32,32,16,16,8,4,4,3,12, - 12,8,1,255,224,32,32,32,32,32,32,32,32,32,32,224, - 6,3,3,8,1,9,48,72,132,7,1,1,8,1,255,254, - 3,3,3,8,2,10,128,64,32,6,8,8,8,1,0,120, - 132,4,124,132,132,140,116,6,11,11,8,1,0,128,128,128, - 184,196,132,132,132,132,196,184,6,8,8,8,1,0,120,132, - 128,128,128,128,132,120,6,11,11,8,1,0,4,4,4,116, - 140,132,132,132,132,140,116,6,8,8,8,1,0,120,132,132, - 252,128,128,132,120,5,11,11,8,1,0,24,32,32,32,248, - 32,32,32,32,32,32,6,11,11,8,1,254,4,116,136,136, - 136,112,64,120,132,132,120,6,11,11,8,1,0,128,128,128, - 184,196,132,132,132,132,132,132,5,11,11,8,2,0,32,32, - 0,96,32,32,32,32,32,32,248,5,13,13,8,1,254,8, - 8,0,24,8,8,8,8,8,8,8,144,96,6,10,10,8, - 1,0,128,128,136,144,160,192,160,144,136,132,5,10,10,8, - 2,0,96,32,32,32,32,32,32,32,32,248,7,8,8,8, - 1,0,236,146,146,146,146,146,146,146,6,8,8,8,1,0, - 184,196,132,132,132,132,132,132,6,8,8,8,1,0,120,132, - 132,132,132,132,132,120,6,10,10,8,1,254,184,196,132,132, - 132,132,196,184,128,128,6,10,10,8,1,254,116,140,132,132, - 132,132,140,116,4,4,6,8,8,8,1,0,184,196,132,128, - 128,128,128,128,6,8,8,8,1,0,120,132,128,96,24,4, - 132,120,5,10,10,8,1,0,32,32,248,32,32,32,32,32, - 32,24,6,8,8,8,1,0,132,132,132,132,132,132,140,116, - 6,8,8,8,1,0,132,132,132,72,72,72,48,48,7,8, - 8,8,1,0,130,146,146,146,146,146,146,108,6,8,8,8, - 1,0,132,132,72,48,48,72,132,132,6,10,10,8,1,254, - 132,132,132,132,132,76,52,4,4,120,6,8,8,8,1,0, - 252,4,8,16,32,64,128,252,3,12,12,8,3,255,96,128, - 128,64,64,128,128,64,64,128,128,96,1,14,14,8,4,254, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,3,12, - 12,8,2,255,192,32,32,64,64,32,32,64,64,32,32,192, - 7,3,3,8,1,8,98,146,140,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,115,209,202,16,75,209,202, - 16,115,223,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,113, - 157,202,82,115,211,194,82,66,93,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,73,157,202,82,122,93,202,80,73,145,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,115,147,202,82,115, - 159,202,18,114,19,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,75,147,234,82,91,159,202,82,75,147,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,116,185,166,164,37,165,164,164,116, - 185,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,75,209,234, - 16,91,209,202,16,75,223,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,57,205,194,18,49,159,136,82,115,147,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,121,205,194,18,121,159,192, - 82,123,147,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,75, - 157,201,32,121,25,201,4,73,57,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,75,185,201,8,121,9,201,8,73,49,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,69,205,196,144,68, - 137,168,132,16,153,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,114,29,202,18,114,19,194,18,67,221,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,114,19,202,18,114,19,194,18,67, - 205,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,14,33,137, - 32,14,33,138,32,9,33,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,57,221,194,2,49,141,136,80,115,159,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,57,221,194,2,49,141,136, - 66,115,157,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,113, - 207,202,16,74,13,202,2,113,221,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,114,69,202,76,114,69,194,68,65,143,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,114,93,202,66,114, - 77,194,80,65,159,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,59,157,193,32,49,25,137,4,113,57,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,57,211,194,18,66,31,194,18,57, - 211,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,69,17,237, - 16,85,81,197,176,69,17,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,59,141,194,82,51,159,138,18,114,19,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,123,141,194,82,123,159,194, - 18,122,19,128,0,0,1,128,0,0,1,128,0,85,85,16, - 16,32,16,0,254,170,170,0,1,128,0,0,1,128,0,57, - 143,194,80,50,77,138,66,113,157,128,0,0,1,128,0,0, - 1,128,0,85,85,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,51,155,196,34,37,163,148,162,99,155,128, - 0,0,1,128,0,0,1,128,0,85,85,16,16,32,16,0, - 254,170,170,0,1,128,0,0,1,128,0,57,221,194,8,50, - 9,138,8,113,221,128,0,0,1,128,0,0,1,128,0,85, - 85,16,16,32,16,0,254,170,170,0,1,128,0,0,1,128, - 0,57,221,194,8,65,137,192,72,59,157,128,0,0,1,128, - 0,0,1,128,0,85,85,16,16,32,16,0,254,170,170,0, - 1,128,0,0,1,128,0,14,249,144,32,12,33,130,32,28, - 33,128,0,0,1,128,0,0,1,128,0,85,85,16,16,32, - 16,0,254,170,170,0,1,128,0,0,1,128,0,49,207,202, - 16,73,145,200,80,51,143,128,0,0,1,128,0,0,1,128, - 0,85,85,16,16,32,16,0,254,170,170,0,1,128,0,0, - 1,128,0,114,33,203,96,114,161,194,32,66,33,128,0,0, - 1,128,0,0,1,128,0,85,85,16,16,32,16,0,254,170, - 170,0,1,128,0,0,1,128,0,51,143,202,80,123,145,202, - 16,74,15,128,0,0,1,128,0,0,1,128,0,85,85,0, - 0,0,8,0,14,1,10,10,8,4,0,128,128,0,128,128, - 128,128,128,128,128,7,10,10,8,1,0,16,16,124,146,144, - 144,146,124,16,16,7,10,10,8,1,0,28,32,32,32,248, - 32,32,32,124,194,6,8,8,8,1,1,132,72,120,72,72, - 120,72,132,7,10,10,8,1,0,130,68,40,16,254,16,254, - 16,16,16,1,10,10,8,4,0,128,128,128,128,0,0,128, - 128,128,128,6,10,10,8,1,0,120,132,128,120,132,132,120, - 4,132,120,4,2,2,8,2,12,144,144,8,10,10,8,0, - 0,60,66,153,165,161,161,165,153,66,60,5,7,7,8,2, - 5,112,8,120,136,120,0,248,6,9,9,8,1,0,36,36, - 72,72,144,72,72,36,36,6,4,4,8,1,0,252,4,4, - 4,6,1,1,8,1,4,252,8,10,10,8,0,0,60,66, - 185,165,165,185,169,165,66,60,6,1,1,8,1,11,252,3, - 4,4,8,2,10,64,160,160,64,7,9,9,8,1,1,16, - 16,16,254,16,16,16,0,254,5,7,7,8,2,5,112,136, - 8,112,128,128,248,5,7,7,8,2,5,112,136,8,112,8, - 136,112,3,3,3,8,3,10,32,64,128,5,8,8,8,2, - 254,136,136,136,136,216,168,128,128,6,12,12,8,1,255,124, - 244,244,244,244,116,20,20,20,20,20,28,2,2,2,8,3, - 4,192,192,3,2,2,8,2,254,32,192,3,7,7,8,2, - 5,32,96,160,32,32,32,32,5,7,7,8,2,5,112,136, - 136,136,112,0,248,6,9,9,8,1,0,144,144,72,72,36, - 72,72,144,144,6,10,10,8,1,0,68,196,72,80,80,36, - 44,84,156,132,6,10,10,8,1,0,68,196,72,80,80,40, - 52,68,136,156,6,10,10,8,1,0,196,36,72,48,208,36, - 44,84,156,132,6,10,10,8,1,0,16,16,0,16,16,96, - 132,132,132,120,6,14,14,8,1,0,96,24,0,0,48,72, - 72,132,132,252,132,132,132,132,6,14,14,8,1,0,24,96, - 0,0,48,72,72,132,132,252,132,132,132,132,6,14,14,8, - 1,0,48,72,0,0,48,72,72,132,132,252,132,132,132,132, - 6,14,14,8,1,0,100,152,0,0,48,72,72,132,132,252, - 132,132,132,132,6,14,14,8,1,0,72,72,0,0,48,72, - 72,132,132,252,132,132,132,132,6,14,14,8,1,0,48,72, - 48,0,48,72,72,132,132,252,132,132,132,132,7,10,10,8, - 1,0,62,80,144,144,254,144,144,144,144,158,6,12,12,8, - 1,254,120,132,132,128,128,128,128,132,132,120,16,96,6,14, - 14,8,1,0,96,24,0,0,252,128,128,128,248,128,128,128, - 128,252,6,14,14,8,1,0,24,96,0,0,252,128,128,128, - 248,128,128,128,128,252,6,14,14,8,1,0,48,72,0,0, - 252,128,128,128,248,128,128,128,128,252,6,14,14,8,1,0, - 72,72,0,0,252,128,128,128,248,128,128,128,128,252,5,14, - 14,8,2,0,96,24,0,0,248,32,32,32,32,32,32,32, - 32,248,5,14,14,8,2,0,48,192,0,0,248,32,32,32, - 32,32,32,32,32,248,5,14,14,8,2,0,96,144,0,0, - 248,32,32,32,32,32,32,32,32,248,5,14,14,8,2,0, - 144,144,0,0,248,32,32,32,32,32,32,32,32,248,7,10, - 10,8,0,0,120,68,66,66,242,66,66,66,68,120,6,14, - 14,8,1,0,100,152,0,0,132,196,196,164,164,148,148,140, - 140,132,6,14,14,8,1,0,96,24,0,0,120,132,132,132, - 132,132,132,132,132,120,6,14,14,8,1,0,24,96,0,0, - 120,132,132,132,132,132,132,132,132,120,6,14,14,8,1,0, - 48,72,0,0,120,132,132,132,132,132,132,132,132,120,6,14, - 14,8,1,0,100,152,0,0,120,132,132,132,132,132,132,132, - 132,120,6,14,14,8,1,0,72,72,0,0,120,132,132,132, - 132,132,132,132,132,120,6,5,5,8,1,2,132,72,48,72, - 132,6,12,12,8,1,255,4,116,136,140,148,148,164,164,196, - 68,184,128,6,14,14,8,1,0,96,24,0,0,132,132,132, - 132,132,132,132,132,132,120,6,14,14,8,1,0,24,96,0, - 0,132,132,132,132,132,132,132,132,132,120,6,14,14,8,1, - 0,48,72,0,0,132,132,132,132,132,132,132,132,132,120,6, - 14,14,8,1,0,72,72,0,0,132,132,132,132,132,132,132, - 132,132,120,7,14,14,8,1,0,24,96,0,0,130,130,68, - 68,40,16,16,16,16,16,6,11,11,8,1,0,128,128,240, - 136,132,132,136,240,128,128,128,6,10,10,8,1,0,112,136, - 136,136,248,132,132,132,196,184,6,12,12,8,1,0,96,24, - 0,0,120,132,4,124,132,132,140,116,6,12,12,8,1,0, - 24,96,0,0,120,132,4,124,132,132,140,116,6,12,12,8, - 1,0,48,72,0,0,120,132,4,124,132,132,140,116,6,12, - 12,8,1,0,100,152,0,0,120,132,4,124,132,132,140,116, - 6,12,12,8,1,0,72,72,0,0,120,132,4,124,132,132, - 140,116,6,13,13,8,1,0,48,72,48,0,0,120,132,4, - 124,132,132,140,116,7,8,8,8,1,0,124,146,18,126,144, - 144,146,124,6,10,10,8,1,254,120,132,128,128,128,128,132, - 120,16,96,6,12,12,8,1,0,96,24,0,0,120,132,132, - 252,128,128,132,120,6,12,12,8,1,0,24,96,0,0,120, - 132,132,252,128,128,132,120,6,12,12,8,1,0,48,72,0, - 0,120,132,132,252,128,128,132,120,6,12,12,8,1,0,72, - 72,0,0,120,132,132,252,128,128,132,120,5,12,12,8,2, - 0,192,48,0,0,96,32,32,32,32,32,32,248,5,12,12, - 8,2,0,48,192,0,0,96,32,32,32,32,32,32,248,5, - 12,12,8,2,0,96,144,0,0,96,32,32,32,32,32,32, - 248,5,12,12,8,2,0,144,144,0,0,96,32,32,32,32, - 32,32,248,6,12,12,8,1,0,100,24,40,68,4,124,132, - 132,132,132,132,120,6,12,12,8,1,0,100,152,0,0,184, - 196,132,132,132,132,132,132,6,12,12,8,1,0,96,24,0, - 0,120,132,132,132,132,132,132,120,6,12,12,8,1,0,24, - 96,0,0,120,132,132,132,132,132,132,120,6,12,12,8,1, - 0,48,72,0,0,120,132,132,132,132,132,132,120,6,12,12, - 8,1,0,100,152,0,0,120,132,132,132,132,132,132,120,6, - 12,12,8,1,0,72,72,0,0,120,132,132,132,132,132,132, - 120,6,7,7,8,1,1,48,0,0,252,0,0,48,6,10, - 10,8,1,255,4,120,140,148,148,164,164,196,120,128,6,12, - 12,8,1,0,96,24,0,0,132,132,132,132,132,132,140,116, - 6,12,12,8,1,0,24,96,0,0,132,132,132,132,132,132, - 140,116,6,12,12,8,1,0,48,72,0,0,132,132,132,132, - 132,132,140,116,6,12,12,8,1,0,72,72,0,0,132,132, - 132,132,132,132,140,116,6,14,14,8,1,254,24,96,0,0, - 132,132,132,132,132,76,52,4,4,120,5,12,12,8,2,254, - 128,128,240,136,136,136,144,160,192,128,128,128,6,14,14,8, - 1,254,72,72,0,0,132,132,132,132,132,76,52,4,4,120 - }; -/* - Fontname: -gnu-unifont-medium-r-normal--16-160-75-75-c-80-iso10646-1 - Copyright: - Capital A Height: 10, '1' Height: 10 - Calculated Max Values w=16 h=16 x= 5 y=14 dx=16 dy= 0 ascent=14 len=32 - Font Bounding box w=16 h=16 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent =10 descent=-2 - X Font ascent =11 descent=-2 - Max Font ascent =14 descent=-2 -*/ -#include "u8g.h" -const u8g_fntpgm_uint8_t u8g_font_unifont_0_11[3240] U8G_FONT_SECTION("u8g_font_unifont_0_11") = { - 0,16,16,0,254,10,1,231,3,213,32,255,254,14,254,11, - 254,0,0,0,8,0,14,1,10,10,8,4,0,128,128,128, - 128,128,128,128,0,128,128,5,4,4,8,2,8,136,136,136, - 136,6,10,10,8,1,0,36,36,36,252,72,72,252,144,144, - 144,7,10,10,8,1,0,16,124,146,144,112,28,18,146,124, - 16,7,10,10,8,1,0,98,148,148,104,16,16,44,82,82, - 140,7,10,10,8,1,0,56,68,68,68,56,114,138,132,140, - 114,1,4,4,8,4,8,128,128,128,128,3,12,12,8,3, - 255,32,64,64,128,128,128,128,128,128,64,64,32,3,12,12, - 8,2,255,128,64,64,32,32,32,32,32,32,64,64,128,7, - 7,7,8,1,1,16,146,84,56,84,146,16,7,7,7,8, - 1,1,16,16,16,254,16,16,16,2,4,4,8,3,254,192, - 64,64,128,6,1,1,8,1,4,252,2,2,2,8,3,0, - 192,192,6,10,10,8,1,0,4,4,8,16,16,32,32,64, - 128,128,6,10,10,8,1,0,48,72,132,132,132,132,132,132, - 72,48,5,10,10,8,2,0,32,96,160,32,32,32,32,32, - 32,248,6,10,10,8,1,0,120,132,132,4,24,32,64,128, - 128,252,6,10,10,8,1,0,120,132,132,4,56,4,4,132, - 132,120,6,10,10,8,1,0,8,24,40,72,136,136,252,8, - 8,8,6,10,10,8,1,0,252,128,128,128,248,4,4,4, - 132,120,6,10,10,8,1,0,56,64,128,128,248,132,132,132, - 132,120,6,10,10,8,1,0,252,4,4,8,8,8,16,16, - 16,16,6,10,10,8,1,0,120,132,132,132,120,132,132,132, - 132,120,6,10,10,8,1,0,120,132,132,132,124,4,4,4, - 8,112,2,7,7,8,3,1,192,192,0,0,0,192,192,2, - 9,9,8,3,255,192,192,0,0,0,192,64,64,128,5,9, - 9,8,2,0,8,16,32,64,128,64,32,16,8,6,5,5, - 8,1,2,252,0,0,0,252,5,9,9,8,1,0,128,64, - 32,16,8,16,32,64,128,6,10,10,8,1,0,120,132,132, - 4,8,16,16,0,16,16,6,10,10,8,1,0,56,68,148, - 172,164,164,164,156,64,60,6,10,10,8,1,0,48,72,72, - 132,132,252,132,132,132,132,6,10,10,8,1,0,248,132,132, - 132,248,132,132,132,132,248,6,10,10,8,1,0,120,132,132, - 128,128,128,128,132,132,120,6,10,10,8,1,0,240,136,132, - 132,132,132,132,132,136,240,6,10,10,8,1,0,252,128,128, - 128,248,128,128,128,128,252,6,10,10,8,1,0,252,128,128, - 128,248,128,128,128,128,128,6,10,10,8,1,0,120,132,132, - 128,128,156,132,132,140,116,6,10,10,8,1,0,132,132,132, - 132,252,132,132,132,132,132,5,10,10,8,2,0,248,32,32, - 32,32,32,32,32,32,248,7,10,10,8,1,0,62,8,8, - 8,8,8,8,136,136,112,6,10,10,8,1,0,132,136,144, - 160,192,192,160,144,136,132,6,10,10,8,1,0,128,128,128, - 128,128,128,128,128,128,252,6,10,10,8,1,0,132,132,204, - 204,180,180,132,132,132,132,6,10,10,8,1,0,132,196,196, - 164,164,148,148,140,140,132,6,10,10,8,1,0,120,132,132, - 132,132,132,132,132,132,120,6,10,10,8,1,0,248,132,132, - 132,248,128,128,128,128,128,7,11,11,8,1,255,120,132,132, - 132,132,132,132,180,204,120,6,6,10,10,8,1,0,248,132, - 132,132,248,144,136,136,132,132,6,10,10,8,1,0,120,132, - 132,128,96,24,4,132,132,120,7,10,10,8,1,0,254,16, - 16,16,16,16,16,16,16,16,6,10,10,8,1,0,132,132, - 132,132,132,132,132,132,132,120,7,10,10,8,1,0,130,130, - 130,68,68,68,40,40,16,16,6,10,10,8,1,0,132,132, - 132,132,180,180,204,204,132,132,6,10,10,8,1,0,132,132, - 72,72,48,48,72,72,132,132,7,10,10,8,1,0,130,130, - 68,68,40,16,16,16,16,16,6,10,10,8,1,0,252,4, - 4,8,16,32,64,128,128,252,3,12,12,8,4,255,224,128, - 128,128,128,128,128,128,128,128,128,224,6,10,10,8,1,0, - 128,128,64,32,32,16,16,8,4,4,3,12,12,8,1,255, - 224,32,32,32,32,32,32,32,32,32,32,224,6,3,3,8, - 1,9,48,72,132,7,1,1,8,1,255,254,3,3,3,8, - 2,10,128,64,32,6,8,8,8,1,0,120,132,4,124,132, - 132,140,116,6,11,11,8,1,0,128,128,128,184,196,132,132, - 132,132,196,184,6,8,8,8,1,0,120,132,128,128,128,128, - 132,120,6,11,11,8,1,0,4,4,4,116,140,132,132,132, - 132,140,116,6,8,8,8,1,0,120,132,132,252,128,128,132, - 120,5,11,11,8,1,0,24,32,32,32,248,32,32,32,32, - 32,32,6,11,11,8,1,254,4,116,136,136,136,112,64,120, - 132,132,120,6,11,11,8,1,0,128,128,128,184,196,132,132, - 132,132,132,132,5,11,11,8,2,0,32,32,0,96,32,32, - 32,32,32,32,248,5,13,13,8,1,254,8,8,0,24,8, - 8,8,8,8,8,8,144,96,6,10,10,8,1,0,128,128, - 136,144,160,192,160,144,136,132,5,10,10,8,2,0,96,32, - 32,32,32,32,32,32,32,248,7,8,8,8,1,0,236,146, - 146,146,146,146,146,146,6,8,8,8,1,0,184,196,132,132, - 132,132,132,132,6,8,8,8,1,0,120,132,132,132,132,132, - 132,120,6,10,10,8,1,254,184,196,132,132,132,132,196,184, - 128,128,6,10,10,8,1,254,116,140,132,132,132,132,140,116, - 4,4,6,8,8,8,1,0,184,196,132,128,128,128,128,128, - 6,8,8,8,1,0,120,132,128,96,24,4,132,120,5,10, - 10,8,1,0,32,32,248,32,32,32,32,32,32,24,6,8, - 8,8,1,0,132,132,132,132,132,132,140,116,6,8,8,8, - 1,0,132,132,132,72,72,72,48,48,7,8,8,8,1,0, - 130,146,146,146,146,146,146,108,6,8,8,8,1,0,132,132, - 72,48,48,72,132,132,6,10,10,8,1,254,132,132,132,132, - 132,76,52,4,4,120,6,8,8,8,1,0,252,4,8,16, - 32,64,128,252,3,12,12,8,3,255,96,128,128,64,64,128, - 128,64,64,128,128,96,1,14,14,8,4,254,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,3,12,12,8,2,255, - 192,32,32,64,64,32,32,64,64,32,32,192,7,3,3,8, - 1,8,98,146,140,16,16,32,16,0,254,170,170,0,1,128, - 0,0,1,128,0,115,209,202,16,75,209,202,16,115,223,128, - 0,0,1,128,0,0,1,128,0,85,85,6,10,10,8,1, - 254,184,196,132,132,132,132,132,132,128,128,6,10,10,8,1, - 254,116,140,132,132,132,140,116,4,132,120,4,8,8,8,3, - 0,192,64,64,64,64,64,64,112,7,12,12,8,1,254,16, - 16,148,154,146,146,146,146,178,82,16,16,7,11,11,8,1, - 0,28,34,32,32,248,32,32,32,32,32,32,6,8,8,8, - 1,0,120,132,132,132,132,132,132,120,7,12,12,8,1,254, - 112,144,144,112,28,18,18,18,146,124,16,16,7,10,10,8, - 1,0,128,128,128,136,136,136,136,136,136,118,6,14,14,8, - 1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84, - 2,7,7,8,3,1,192,192,0,0,0,192,192,6,2,2, - 8,1,1,196,120,6,14,14,8,1,255,168,84,168,84,168, - 84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,168, - 84,168,84,168,84,168,84,168,84,168,84,168,84,6,14,14, - 8,1,255,168,84,168,84,168,84,168,84,168,84,168,84,168, - 84,6,14,14,8,1,255,168,84,168,84,168,84,168,84,168, - 84,168,84,168,84,6,14,14,8,1,255,168,84,168,84,168, - 84,168,84,168,84,168,84,168,84,6,14,14,8,1,255,168, - 84,168,84,168,84,168,84,168,84,168,84,168,84,5,4,4, - 8,2,255,32,32,112,136,6,3,3,8,1,9,48,0,204, - 4,6,6,8,2,8,48,192,48,192,48,192,2,3,3,8, - 3,10,192,0,192,4,3,3,8,2,10,176,128,176,3,3, - 3,8,3,255,128,128,96,5,5,5,8,2,9,32,112,248, - 112,32,6,4,4,8,1,9,72,164,148,72,3,3,3,8, - 0,9,192,32,32,2,3,3,8,5,255,64,128,64,4,4, - 4,8,1,254,208,208,16,224,3,3,3,8,3,10,96,128, - 128,3,3,3,8,5,9,96,128,128,5,5,5,8,3,9, - 48,64,152,160,32,8,4,4,8,0,9,66,165,66,36,3, - 4,4,8,5,9,64,160,64,128,4,3,3,8,0,8,80, - 96,128,5,3,3,8,1,254,136,112,32,3,3,3,8,2, - 255,32,32,224,2,3,3,8,3,255,64,128,64,3,3,3, - 8,2,255,32,32,192,5,4,4,8,1,254,40,200,16,96, - 4,5,5,8,2,254,96,128,96,16,96,3,3,3,8,2, - 9,192,32,32,3,4,4,8,1,9,64,160,64,32,5,4, - 4,8,2,254,136,112,32,32,2,3,3,8,2,10,64,128, - 64,3,3,3,8,3,10,32,32,224,3,3,3,8,5,255, - 128,128,96,5,4,4,8,0,9,72,168,168,144,4,4,4, - 8,2,9,96,144,144,96,2,3,3,8,3,255,192,0,192, - 5,3,3,8,2,255,168,0,72,5,3,3,8,2,255,232, - 0,8,5,3,3,8,2,255,232,64,72,2,2,2,8,3, - 0,192,192,6,2,2,8,1,0,204,204,6,3,3,8,1, - 254,204,0,48,4,1,1,8,2,0,240,5,3,3,8,2, - 254,248,32,32,2,2,2,8,2,10,192,192,2,2,2,8, - 1,10,192,192,5,3,3,8,2,255,128,32,8,2,1,1, - 8,3,5,192,1,3,3,8,4,255,128,128,128,6,2,2, - 8,1,10,124,248,4,1,1,8,2,10,240,1,9,9,8, - 4,0,128,128,128,128,128,128,128,128,128,2,2,2,8,5, - 10,192,192,2,2,2,8,1,10,192,192,3,8,8,8,3, - 0,64,224,64,0,0,64,224,64,2,2,2,8,3,10,192, - 192,2,2,2,8,3,10,192,192,4,9,9,8,2,0,224, - 128,128,128,128,128,128,128,240,5,4,4,8,2,254,248,32, - 32,32,6,14,14,8,1,255,168,84,168,84,168,84,168,84, - 168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84, - 168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255, - 168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14, - 14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84, - 168,84,6,14,14,8,1,255,168,84,168,84,168,84,168,84, - 168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84, - 168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255, - 168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14, - 14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84, - 168,84,6,9,9,8,1,0,132,132,68,36,88,144,136,132, - 132,7,9,9,8,1,0,248,8,8,8,8,8,8,8,254, - 6,9,9,8,1,0,96,16,16,16,8,24,40,68,132,6, - 9,9,8,1,0,252,8,8,8,8,8,8,8,8,6,9, - 9,8,1,0,252,4,4,68,68,68,68,68,68,3,9,9, - 8,2,0,224,32,32,32,32,32,32,32,32,5,9,9,8, - 2,0,192,48,40,32,32,32,32,32,32,6,9,9,8,1, - 0,252,68,68,68,68,68,68,68,68,6,9,9,8,1,0, - 140,148,132,132,132,132,132,132,252,3,4,4,8,2,5,224, - 32,32,32,6,11,11,8,1,254,252,4,4,4,4,4,4, - 4,4,4,4,6,9,9,8,1,0,252,4,4,4,4,4, - 4,4,248,5,11,11,8,2,0,128,128,248,8,8,8,8, - 16,16,32,192,7,9,9,8,0,0,254,34,34,34,34,34, - 34,34,62,7,9,9,8,1,0,156,98,66,130,130,130,130, - 130,142,3,11,11,8,2,254,224,32,32,32,32,32,32,32, - 32,32,32,4,9,9,8,2,0,112,16,16,16,16,16,16, - 16,240,6,9,9,8,1,0,252,132,132,132,132,132,132,136, - 240,7,9,9,8,0,0,18,18,18,18,18,18,18,18,254, - 6,11,11,8,1,254,252,132,132,132,228,4,4,4,4,4, - 4,6,9,9,8,1,0,252,132,132,132,228,4,4,4,252, - 5,11,11,8,2,254,136,136,144,160,192,128,128,128,128,128, - 128,6,9,9,8,1,0,132,132,72,48,16,8,4,4,252, - 6,11,11,8,1,254,252,68,68,72,72,80,64,64,64,64, - 64,6,9,9,8,1,0,252,4,4,4,4,4,4,4,4, - 7,9,9,8,1,0,146,146,146,146,146,146,146,146,254,6, - 9,9,8,1,0,124,68,68,68,68,68,68,68,196,6,14, - 14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84, - 168,84,6,14,14,8,1,255,168,84,168,84,168,84,168,84, - 168,84,168,84,168,84,6,14,14,8,1,255,168,84,168,84, - 168,84,168,84,168,84,168,84,168,84,6,14,14,8,1,255, - 168,84,168,84,168,84,168,84,168,84,168,84,168,84,6,14, - 14,8,1,255,168,84,168,84,168,84,168,84,168,84,168,84, - 168,84,7,9,9,8,1,0,238,34,34,34,34,34,34,34, - 34,7,9,9,8,1,0,238,34,34,34,2,2,2,2,2, - 7,4,4,8,1,5,238,34,34,34,3,3,3,8,4,9, - 32,64,128,6,3,3,8,1,9,36,72,144,6,14,14,8, - 1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84, - 6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84, - 168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84, - 168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,84, - 168,84,168,84,168,84,168,84,168,84,168,84,6,14,14,8, - 1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84, - 6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84, - 168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84, - 168,84,168,84,168,84,168,84,6,14,14,8,1,255,168,84, - 168,84,168,84,168,84,168,84,168,84,168,84,6,14,14,8, - 1,255,168,84,168,84,168,84,168,84,168,84,168,84,168,84, - 6,14,14,8,1,255,168,84,168,84,168,84,168,84,168,84, - 168,84,168,84,6,14,14,8,1,255,168,84,168,84,168,84, - 168,84,168,84,168,84,168,84}; /* Fontname: -gnu-Unifont-Medium-R-Normal-Sans-16-160-75-75-c-80-iso10646-1 Copyright: Copyright (C) 2014 Roman Czyborra, Paul Hardy, Qianqian Fang, Andrew Miller, et al. Licensed under the GNU General Public License; either version 2, or (at your option) a later version, with the GNU Font Embedding Exception. diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index 52bfeb83..c84ae4fe 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -58,7 +58,7 @@ //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 -U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 +//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 //U8GLIB_ST7920_128X64_4X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17 //U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 @@ -107,12 +107,12 @@ U8GLIB_ST7920_128X64_1X u8g(18, 16, 17); // SPI Com: SCK = en = 18, MOSI = rw = //U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C -//U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE); // I2C -//U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1611_DOGXL240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 @@ -168,6 +168,8 @@ void setup(void) { else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } + + pinMode(8, OUTPUT); } void loop(void) { @@ -178,6 +180,6 @@ void loop(void) { } while( u8g.nextPage() ); // rebuild the picture after some delay - delay(50); + //delay(50); } From ff85d09566f446440bdd16a6e47c6f3680a3b4ca Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 4 Apr 2016 22:26:34 +0200 Subject: [PATCH 087/109] issue 353 --- csrc/u8g_delay.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/csrc/u8g_delay.c b/csrc/u8g_delay.c index 01401e53..76137b27 100644 --- a/csrc/u8g_delay.c +++ b/csrc/u8g_delay.c @@ -52,6 +52,11 @@ # include # endif +/* issue 353 */ +#if defined(ARDUINO_ARCH_SAMD) +# include +#endif + # if defined(__AVR__) # define USE_AVR_DELAY # elif defined(__PIC32MX) From 3e7a30f615641b7d0c357ac34b7bbd8681808c8f Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 5 Apr 2016 20:04:51 +0200 Subject: [PATCH 088/109] towards 1.19 --- ChangeLog | 5 +++-- tools/release/arduino_new_lib_format/create_release.sh | 2 +- tools/release/print_release.sh | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1bcd8e1a..42b2bf96 100644 --- a/ChangeLog +++ b/ChangeLog @@ -159,8 +159,9 @@ u8glib ChangeLog * Fixed bug in u8g_DrawLine(), Github issue 343 * Fixed bug in u8g_DrawStr90P(), Github issue 331 * Support for SSD1306 with 64x48 pixel -2015-xx-xx v1.19 - +2016-04-05 v1.19 + * Fixed contrast (brightness) setting for SH1106 and SSD1306 devices + * Fixed compiler warnings diff --git a/tools/release/arduino_new_lib_format/create_release.sh b/tools/release/arduino_new_lib_format/create_release.sh index 04dcc218..a6e5d178 100755 --- a/tools/release/arduino_new_lib_format/create_release.sh +++ b/tools/release/arduino_new_lib_format/create_release.sh @@ -61,7 +61,7 @@ sed -i -e "s/version=.*/version=${ver}/" library.properties git commit -a -m `../u8glib/tools/release/print_release.sh` git push -echo now create a release in gitub for U8glib_Arduino, tag/namex = ${ver] +echo now create a release in gitub for U8glib_Arduino, tag/name = ${ver} # Relases in github: # Tag: 1.02pre3 # Release name: 1.02pre3 diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index a0769252..3d76bef3 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1,2 +1,2 @@ # without 'v' prefix -echo -n "1.18.1" +echo -n "1.19.0" From 1e1fea76856e70ccd74d40ca908f74df2e25e076 Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 6 Apr 2016 22:14:40 +0200 Subject: [PATCH 089/109] 1.19.1 --- sys/arduino/HelloWorld/HelloWorld.pde | 2 +- tools/release/print_release.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index c84ae4fe..b9a7f1cb 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -107,7 +107,7 @@ //U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE); // I2C -U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 +//U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_UC1611_DOGM240 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) //U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16 diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index 3d76bef3..d4012a3c 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1,2 +1,2 @@ # without 'v' prefix -echo -n "1.19.0" +echo -n "1.19.1" From ce06a0214943bae8d90d2ad51b479444581e1fe8 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 17 Apr 2016 13:01:29 +0200 Subject: [PATCH 090/109] added comments --- tools/intersection/intersection.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/intersection/intersection.c b/tools/intersection/intersection.c index 34458dee..9468f2e3 100644 --- a/tools/intersection/intersection.c +++ b/tools/intersection/intersection.c @@ -1,4 +1,10 @@ +/* + + intersection.c + + coverage: gcc -fprofile-arcs -ftest-coverage intersection.c +*/ #include #include @@ -243,7 +249,7 @@ void check(uint8_t b1, uint8_t b2) clear(); line(a1, a2, 1); line(b1, b2, 2); - show(); + //show(); intersection = is_array_intersection(); p = conditionpattern(b1, b2); pla[p] |= intersection+1; @@ -288,7 +294,7 @@ void check_size(uint8_t size) void check_all(void) { uint8_t size; - for( size =1; size < 255; size++ ) + for( size =0; size < 255; size++ ) { printf("size=%d\n", size); check_size(size); From ec0acc2b7a0acc30194e736a4782aa2ad6802452 Mon Sep 17 00:00:00 2001 From: olikraus Date: Sun, 17 Apr 2016 15:25:20 +0200 Subject: [PATCH 091/109] added some asserts --- tools/intersection/intersection.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/intersection/intersection.c b/tools/intersection/intersection.c index 9468f2e3..efdf3213 100644 --- a/tools/intersection/intersection.c +++ b/tools/intersection/intersection.c @@ -9,6 +9,7 @@ #include #include #include +#include uint8_t array[256]; @@ -303,6 +304,11 @@ void check_all(void) void main(void) { + assert( u8g_is_intersection_decision_tree(4, 6, 7, 9) == 0 ); + assert( u8g_is_intersection_decision_tree(4, 6, 6, 9) != 0 ); + assert( u8g_is_intersection_decision_tree(6, 9, 4, 6) != 0 ); + assert( u8g_is_intersection_decision_tree(7, 9, 4, 6) == 0 ); + conditioninit(); check_all(); /* From 4780f7c5b425f3034596294c911b4ac887c517b8 Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 24 May 2016 20:57:34 +0200 Subject: [PATCH 092/109] LD7032 I2C --- cppsrc/U8glib.h | 4 + csrc/u8g.h | 1 + csrc/u8g_dev_ld7032_60x32.c | 1 + sys/arduino/FPS/FPS.pde | 5 + sys/arduino/FPS/Makefile.105.uno | 285 ++++++++++++++++++++++++++ sys/arduino/HelloWorld/HelloWorld.pde | 1 + 6 files changed, 297 insertions(+) create mode 100644 sys/arduino/FPS/Makefile.105.uno diff --git a/cppsrc/U8glib.h b/cppsrc/U8glib.h index db8e718e..85ed4a32 100644 --- a/cppsrc/U8glib.h +++ b/cppsrc/U8glib.h @@ -1061,6 +1061,10 @@ class U8GLIB_LD7032_60x32 : public U8GLIB uint8_t en, uint8_t cs1, uint8_t di, uint8_t rw = U8G_PIN_NONE, uint8_t reset = U8G_PIN_NONE) : U8GLIB(&u8g_dev_ld7032_60x32_parallel, d0, d1, d2, d3, d4, d5, d6, d7, en, cs1, U8G_PIN_NONE, di, rw, reset) { } + U8GLIB_LD7032_60x32(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ld7032_60x32_i2c, options) + { } + }; diff --git a/csrc/u8g.h b/csrc/u8g.h index fc92e513..a1008b4a 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -494,6 +494,7 @@ extern u8g_dev_t u8g_dev_ssd1306_64x48_2x_i2c; extern u8g_dev_t u8g_dev_ld7032_60x32_sw_spi; extern u8g_dev_t u8g_dev_ld7032_60x32_hw_spi; extern u8g_dev_t u8g_dev_ld7032_60x32_parallel; +extern u8g_dev_t u8g_dev_ld7032_60x32_i2c; /* not test and not sure of this works */ /* experimental 65K TFT with st7687 controller */ extern u8g_dev_t u8g_dev_st7687_c144mvgd_sw_spi; diff --git a/csrc/u8g_dev_ld7032_60x32.c b/csrc/u8g_dev_ld7032_60x32.c index 596d9589..98833f7c 100644 --- a/csrc/u8g_dev_ld7032_60x32.c +++ b/csrc/u8g_dev_ld7032_60x32.c @@ -229,4 +229,5 @@ U8G_PB_DEV(u8g_dev_ld7032_60x32_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ld70 U8G_PB_DEV(u8g_dev_ld7032_60x32_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ld7032_60x32_fn, U8G_COM_HW_SPI); U8G_PB_DEV(u8g_dev_ld7032_60x32_parallel, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ld7032_60x32_fn, U8G_COM_PARALLEL); U8G_PB_DEV(u8g_dev_ld7032_60x32_hw_usart_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ld7032_60x32_fn, U8G_COM_HW_USART_SPI); +U8G_PB_DEV(u8g_dev_ld7032_60x32_i2c, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_ld7032_60x32_fn, U8G_COM_SSD_I2C); diff --git a/sys/arduino/FPS/FPS.pde b/sys/arduino/FPS/FPS.pde index 89339a62..ef91352a 100644 --- a/sys/arduino/FPS/FPS.pde +++ b/sys/arduino/FPS/FPS.pde @@ -116,6 +116,11 @@ Due NHD27OLED_GR u8g(10, 9) HW SPI FPS: Clip=34.1 Box=11.7 @=13.7 Pix=5.6 Due NHD27OLED_2X_GR u8g(10, 9) HW SPI FPS: Clip=38.1 Box=15.5 @=20.0 Pix=8.8 + + 28. Apr 2016 + Uno DOGS102 u8g(13, 11, 10, 9); SW SPI FPS: Clip=26.6 Box=6.1 @=8.5 Pix=2.8 11548 Bytes + Uno DOGS102 u8g(10, 9); HW SPI FPS: Clip=33.1 Box=6.4 @=9.1 Pix=2.9 11366 Bytes + */ diff --git a/sys/arduino/FPS/Makefile.105.uno b/sys/arduino/FPS/Makefile.105.uno new file mode 100644 index 00000000..bbf951d8 --- /dev/null +++ b/sys/arduino/FPS/Makefile.105.uno @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=uno + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyACM0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index b9a7f1cb..f827ac14 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -119,6 +119,7 @@ //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(11, 12, 9, 10, 8); // SPI Com: SCK = 11, MOSI = 12, CS = 9, A0 = 10, RST = 8 (SW SPI Nano Board) +U8GLIB_LD7032_60x32 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1608_240X64 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1608_240X64 u8g(10, 9, 8); // HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 From e1db9e926153165f154522e5047966049828e9fc Mon Sep 17 00:00:00 2001 From: getoffmyhack Date: Tue, 31 May 2016 09:51:07 -0700 Subject: [PATCH 093/109] Added hardware SPI support for atmega128 target. --- csrc/u8g_com_atmega_hw_spi.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/csrc/u8g_com_atmega_hw_spi.c b/csrc/u8g_com_atmega_hw_spi.c index ca2a0630..67dc0371 100644 --- a/csrc/u8g_com_atmega_hw_spi.c +++ b/csrc/u8g_com_atmega_hw_spi.c @@ -96,6 +96,16 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void u8g_SetPIOutput(u8g, U8G_PI_RESET); U8G_ATOMIC_START(); + +#if defined (__AVR_ATmega128__) + + DDRB |= _BV(2); /* D0, MOSI */ + DDRB |= _BV(1); /* SCK */ + DDRB |= _BV(0); /* slave select */ + + PORTB &= ~_BV(2); /* D0, MOSI = 0 */ + PORTB &= ~_BV(1); /* SCK = 0 */ +#else DDRB |= _BV(3); /* D0, MOSI */ DDRB |= _BV(5); /* SCK */ @@ -103,6 +113,8 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void PORTB &= ~_BV(3); /* D0, MOSI = 0 */ PORTB &= ~_BV(5); /* SCK = 0 */ + +#endif U8G_ATOMIC_END(); @@ -136,7 +148,11 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void } else { +#if defined (__AVR_ATmega128__) + PORTB &= ~_BV(1); +#else PORTB &= ~_BV(5); /* SCK = 0 */ +#endif /* enable */ u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */ } From 807fbd01da7614b90d46c80eecb4109031b9dd8c Mon Sep 17 00:00:00 2001 From: getoffmyhack Date: Tue, 31 May 2016 09:55:15 -0700 Subject: [PATCH 094/109] Added hardware SPI support for atmega128 target. --- csrc/u8g_com_atmega_hw_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csrc/u8g_com_atmega_hw_spi.c b/csrc/u8g_com_atmega_hw_spi.c index 67dc0371..dfed4a4f 100644 --- a/csrc/u8g_com_atmega_hw_spi.c +++ b/csrc/u8g_com_atmega_hw_spi.c @@ -149,7 +149,7 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void else { #if defined (__AVR_ATmega128__) - PORTB &= ~_BV(1); + PORTB &= ~_BV(1); /* SCK = 0 */ #else PORTB &= ~_BV(5); /* SCK = 0 */ #endif From 77475f84c5a452870b6313890d5f6fa21a315d2d Mon Sep 17 00:00:00 2001 From: olikraus Date: Wed, 1 Jun 2016 06:14:35 +0200 Subject: [PATCH 095/109] merge --- ChangeLog | 6 +++++- tools/release/print_release.sh | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42b2bf96..ad29b713 100644 --- a/ChangeLog +++ b/ChangeLog @@ -159,9 +159,13 @@ u8glib ChangeLog * Fixed bug in u8g_DrawLine(), Github issue 343 * Fixed bug in u8g_DrawStr90P(), Github issue 331 * Support for SSD1306 with 64x48 pixel -2016-04-05 v1.19 +2016-04-05 v1.19 Oliver Kraus * Fixed contrast (brightness) setting for SH1106 and SSD1306 devices * Fixed compiler warnings +2016-05-24 v1.20 Oliver Kraus + * Experimental support for LD7032 I2C + * HW SPI Support for ATMega128 + diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh index d4012a3c..a86f7ce9 100755 --- a/tools/release/print_release.sh +++ b/tools/release/print_release.sh @@ -1,2 +1,2 @@ # without 'v' prefix -echo -n "1.19.1" +echo -n "1.20.0" From b24a4a6ca7642f29c89fd6bc58489f48d912df92 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 2 Sep 2016 21:42:52 +0200 Subject: [PATCH 096/109] make pbm screen sizes less hardcoded The .c files for the pbm bitmap-writing virtual devices contain constants for the output width and height. Previously these constants were used throughout the code, making it impossible to change the width and height without changing these constants. With this change, only the initialization uses the constants, but the rest of the code reads back the width and height from the device struct and uses those. This enables a user of these devices to change the width and height to change the size of the output. This was tested for all three of the pbm devices. --- sys/pbm/dev/u8g_dev_pbm.c | 12 ++++++++++-- sys/pbm/dev/u8g_dev_pbm_gr_h2.c | 18 +++++++++++++----- sys/pbm/dev/u8g_dev_pbm_h.c | 16 ++++++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/sys/pbm/dev/u8g_dev_pbm.c b/sys/pbm/dev/u8g_dev_pbm.c index 70523852..6e2313fa 100644 --- a/sys/pbm/dev/u8g_dev_pbm.c +++ b/sys/pbm/dev/u8g_dev_pbm.c @@ -9,6 +9,12 @@ #include #include "u8g.h" +// These are default sizes. They can be changed without changing this +// file by modifying the corresponding parts of the ug8_dev_t struct. +// Changing the height and lowering the width is always possible. To +// increase the width, the page buffer (u8g_pb_dev_pbm below) should +// also be replaced by something bigger. The page height cannot be +// changed. #if defined(U8G_16BIT) #define WIDTH 1024 @@ -33,6 +39,8 @@ uint8_t u8g_dev_pbm_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { static FILE *fp; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_uint_t width = ((u8g_pb_t*)dev->dev_mem)->width; + u8g_uint_t height = ((u8g_pb_t*)dev->dev_mem)->p.total_height; switch(msg) { @@ -40,7 +48,7 @@ uint8_t u8g_dev_pbm_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) u8g_pb_Clear(pb); u8g_page_First(&(pb->p)); fp = fopen("u8g.pbm", "w"); - fprintf(fp, "P4\n%d %d\n", WIDTH, HEIGHT); + fprintf(fp, "P4\n%d %d\n", width, height); return 1; case U8G_DEV_MSG_PAGE_NEXT: { @@ -49,7 +57,7 @@ uint8_t u8g_dev_pbm_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) for( j = 0; j < 8; j++ ) { b = 0; - for( i = 0; i < WIDTH; i++ ) + for( i = 0; i < width; i++ ) { b<<= 1; if ( (((uint8_t *)(pb->buf))[i] & (1<dev_mem); + u8g_uint_t width = ((u8g_pb_t*)dev->dev_mem)->width; + u8g_uint_t height = ((u8g_pb_t*)dev->dev_mem)->p.total_height; switch(msg) { @@ -49,7 +57,7 @@ uint8_t u8g_dev_pbm_8h2_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) case U8G_DEV_MSG_PAGE_FIRST: #ifdef __unix__ u8g_buf_lower_limit = u8g_pb_dev_pbm_buf; - u8g_buf_upper_limit = u8g_pb_dev_pbm_buf + WIDTH; + u8g_buf_upper_limit = u8g_pb_dev_pbm_buf + width; #endif u8g_pb_Clear(pb); @@ -58,7 +66,7 @@ uint8_t u8g_dev_pbm_8h2_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) if ( u8g_dev_pbm_h2_enable != 0 ) { fp = fopen("u8g.pbm", "w"); - fprintf(fp, "P4\n%d %d\n", WIDTH, HEIGHT); + fprintf(fp, "P4\n%d %d\n", width, height); } return 1; case U8G_DEV_MSG_PAGE_NEXT: @@ -74,7 +82,7 @@ uint8_t u8g_dev_pbm_8h2_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) for(;;) { b1 = 0; - b = ((uint8_t *)(pb->buf))[i+j*(WIDTH/4)]; + b = ((uint8_t *)(pb->buf))[i+j*(width/4)]; for( k = 0; k < 4; k ++ ) { b1 >>= 1; @@ -84,7 +92,7 @@ uint8_t u8g_dev_pbm_8h2_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) } i++; b2 = 0; - b = ((uint8_t *)(pb->buf))[i+j*(WIDTH/4)]; + b = ((uint8_t *)(pb->buf))[i+j*(width/4)]; for( k = 0; k < 4; k ++ ) { b2 >>= 1; @@ -94,7 +102,7 @@ uint8_t u8g_dev_pbm_8h2_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) } i++; fprintf(fp, "%c", b1*16+b2); - if ( i >= WIDTH/4 ) + if ( i >= width/4 ) break; } } diff --git a/sys/pbm/dev/u8g_dev_pbm_h.c b/sys/pbm/dev/u8g_dev_pbm_h.c index 793ec34b..d7feecef 100644 --- a/sys/pbm/dev/u8g_dev_pbm_h.c +++ b/sys/pbm/dev/u8g_dev_pbm_h.c @@ -12,6 +12,12 @@ #include "u8g.h" +// These are default sizes. They can be changed without changing this +// file by modifying the corresponding parts of the ug8_dev_t struct. +// Changing the height and lowering the width is always possible. To +// increase the width, the page buffer (u8g_pb_dev_pbm below) should +// also be replaced by something bigger. The page height cannot be +// changed. #define WIDTH 128 #define HEIGHT 64 #define PAGE_HEIGHT 8 @@ -41,6 +47,8 @@ uint8_t u8g_dev_pbm_8h1_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { static FILE *fp; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_uint_t width = ((u8g_pb_t*)dev->dev_mem)->width; + u8g_uint_t height = ((u8g_pb_t*)dev->dev_mem)->p.total_height; switch(msg) { @@ -48,7 +56,7 @@ uint8_t u8g_dev_pbm_8h1_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) case U8G_DEV_MSG_PAGE_FIRST: #ifdef __unix__ u8g_buf_lower_limit = u8g_pb_dev_pbm_buf; - u8g_buf_upper_limit = u8g_pb_dev_pbm_buf + WIDTH; + u8g_buf_upper_limit = u8g_pb_dev_pbm_buf + width; #endif u8g_pb_Clear(pb); @@ -57,7 +65,7 @@ uint8_t u8g_dev_pbm_8h1_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) if ( u8g_dev_pbm_h_enable != 0 ) { fp = fopen("u8g.pbm", "w"); - fprintf(fp, "P4\n%d %d\n", WIDTH, HEIGHT); + fprintf(fp, "P4\n%d %d\n", width, height); } return 1; case U8G_DEV_MSG_PAGE_NEXT: @@ -69,9 +77,9 @@ uint8_t u8g_dev_pbm_8h1_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) for( j = 0; j < 8; j++ ) { b = 0; - for( i = 0; i < WIDTH/8; i++ ) + for( i = 0; i < width/8; i++ ) { - b = ((uint8_t *)(pb->buf))[i+j*(WIDTH/8)]; + b = ((uint8_t *)(pb->buf))[i+j*(width/8)]; fprintf(fp, "%c", b); } } From aac33f7edd6f697bb4c0782b78f4e942b495118f Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 8 Sep 2016 08:39:55 +0200 Subject: [PATCH 097/109] Expose u8g_GetGlyphDeltaX through the C++ API --- cppsrc/U8glib.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cppsrc/U8glib.h b/cppsrc/U8glib.h index 85ed4a32..f5de8a47 100644 --- a/cppsrc/U8glib.h +++ b/cppsrc/U8glib.h @@ -192,6 +192,7 @@ class U8GLIB : public Print u8g_uint_t getStrPixelWidthP(u8g_pgm_uint8_t *s) { return u8g_GetStrPixelWidthP(&u8g, s); } u8g_uint_t getStrWidth(const char *s) { return u8g_GetStrWidth(&u8g, s); } u8g_uint_t getStrWidthP(u8g_pgm_uint8_t *s) { return u8g_GetStrWidthP(&u8g, s); } + int8_t getGlyphDeltaX(uint8_t requested_encoding) { return u8g_GetGlyphDeltaX(&u8g, requested_encoding); } void setHardwareBackup(u8g_state_cb backup_cb) { u8g_SetHardwareBackup(&u8g, backup_cb); } From 221d2c408e3efe2457390dd3d1373ac7a835d4af Mon Sep 17 00:00:00 2001 From: Thomas Glamsch Date: Mon, 12 Sep 2016 22:49:27 +0200 Subject: [PATCH 098/109] Clean up ifdefs in ATmega hardware SPI code. --- csrc/u8g_com_atmega_hw_spi.c | 47 +++++++++++++++--------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/csrc/u8g_com_atmega_hw_spi.c b/csrc/u8g_com_atmega_hw_spi.c index dfed4a4f..1f4f1f6a 100644 --- a/csrc/u8g_com_atmega_hw_spi.c +++ b/csrc/u8g_com_atmega_hw_spi.c @@ -30,12 +30,7 @@ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - Assumes, that - MOSI is at PORTB, Pin 3 - and - SCK is at PORTB, Pin 5 + Update for ATOMIC operation done (01 Jun 2013) U8G_ATOMIC_OR(ptr, val) @@ -69,6 +64,18 @@ #include +/* Some AVR models assign the hardware SPI to different pins. */ +#if defined(__AVR_ATmega128__) +#define U8G_ATMEGA_HW_SPI_MOSI_PIN (_BV(2)) +#define U8G_ATMEGA_HW_SPI_SCK_PIN (_BV(1)) +#define U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN (_BV(0)) +#else +#define U8G_ATMEGA_HW_SPI_MOSI_PIN (_BV(3)) +#define U8G_ATMEGA_HW_SPI_SCK_PIN (_BV(5)) +#define U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN (_BV(2)) +#endif + + static uint8_t u8g_atmega_spi_out(uint8_t data) { /* unsigned char x = 100; */ @@ -97,25 +104,13 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void U8G_ATOMIC_START(); -#if defined (__AVR_ATmega128__) + DDRB |= U8G_ATMEGA_HW_SPI_MOSI_PIN; + DDRB |= U8G_ATMEGA_HW_SPI_SCK_PIN; + DDRB |= U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN; - DDRB |= _BV(2); /* D0, MOSI */ - DDRB |= _BV(1); /* SCK */ - DDRB |= _BV(0); /* slave select */ + PORTB &= ~U8G_ATMEGA_HW_SPI_MOSI_PIN; + PORTB &= ~U8G_ATMEGA_HW_SPI_SCK_PIN; - PORTB &= ~_BV(2); /* D0, MOSI = 0 */ - PORTB &= ~_BV(1); /* SCK = 0 */ -#else - - DDRB |= _BV(3); /* D0, MOSI */ - DDRB |= _BV(5); /* SCK */ - DDRB |= _BV(2); /* slave select */ - - PORTB &= ~_BV(3); /* D0, MOSI = 0 */ - PORTB &= ~_BV(5); /* SCK = 0 */ - -#endif - U8G_ATOMIC_END(); u8g_SetPILevel(u8g, U8G_PI_CS, 1); @@ -148,11 +143,7 @@ uint8_t u8g_com_atmega_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void } else { -#if defined (__AVR_ATmega128__) - PORTB &= ~_BV(1); /* SCK = 0 */ -#else - PORTB &= ~_BV(5); /* SCK = 0 */ -#endif + PORTB &= ~U8G_ATMEGA_HW_SPI_SCK_PIN; /* enable */ u8g_SetPILevel(u8g, U8G_PI_CS, 0); /* CS = 0 (low active) */ } From f5528264dd4fe76909c6225bfb6fc029c5103d3b Mon Sep 17 00:00:00 2001 From: Thomas Glamsch Date: Mon, 12 Sep 2016 23:45:00 +0200 Subject: [PATCH 099/109] Disable I2C interface for ATmega32P/ATmega3290P. Both of these lack a hardware TWI and only come with USI instead. --- csrc/u8g_com_i2c.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/csrc/u8g_com_i2c.c b/csrc/u8g_com_i2c.c index f9759527..3664dd5c 100644 --- a/csrc/u8g_com_i2c.c +++ b/csrc/u8g_com_i2c.c @@ -87,6 +87,12 @@ static void u8g_i2c_set_error(uint8_t code, uint8_t pos) #if __AVR_ARCH__ == 25 #undef U8G_ATMEGA_HW_TWI #endif + +/* Some ATmegas also lack dedicated I2C hardware. */ +#if defined(__AVR_ATmega329P__) || defined(__AVR_ATmega3290P__) +#undef U8G_ATMEGA_HW_TWI +#endif + #endif #if defined(U8G_ATMEGA_HW_TWI) From 2d29dda9ff9391550757c54700ec30fddda0396e Mon Sep 17 00:00:00 2001 From: Thomas Glamsch Date: Mon, 12 Sep 2016 23:47:16 +0200 Subject: [PATCH 100/109] Fix incorrect HW SPI pins for ATmega329P/ATmega3290P. --- csrc/u8g_com_atmega_hw_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csrc/u8g_com_atmega_hw_spi.c b/csrc/u8g_com_atmega_hw_spi.c index 1f4f1f6a..aedef745 100644 --- a/csrc/u8g_com_atmega_hw_spi.c +++ b/csrc/u8g_com_atmega_hw_spi.c @@ -65,7 +65,7 @@ /* Some AVR models assign the hardware SPI to different pins. */ -#if defined(__AVR_ATmega128__) +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega329P__) || defined(__AVR_ATmega3290P__) #define U8G_ATMEGA_HW_SPI_MOSI_PIN (_BV(2)) #define U8G_ATMEGA_HW_SPI_SCK_PIN (_BV(1)) #define U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN (_BV(0)) From 226ad0fc37a90315923531e00d13bbff7ab96a37 Mon Sep 17 00:00:00 2001 From: Thomas Glamsch Date: Tue, 13 Sep 2016 00:25:53 +0200 Subject: [PATCH 101/109] Adjust u8g_com_atmega_st7920_hw_spi to AVRs with different SPI pins. --- csrc/u8g_com_atmega_st7920_hw_spi.c | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/csrc/u8g_com_atmega_st7920_hw_spi.c b/csrc/u8g_com_atmega_st7920_hw_spi.c index 57857927..c4d2f996 100644 --- a/csrc/u8g_com_atmega_st7920_hw_spi.c +++ b/csrc/u8g_com_atmega_st7920_hw_spi.c @@ -33,11 +33,6 @@ A special SPI interface for ST7920 controller with HW SPI Support - Assumes, that - MOSI is at PORTB, Pin 3 - and - SCK is at PORTB, Pin 5 - Update for ATOMIC operation done (01 Jun 2013) U8G_ATOMIC_OR(ptr, val) U8G_ATOMIC_AND(ptr, val) @@ -68,6 +63,19 @@ #include #include + +/* Some AVR models assign the hardware SPI to different pins. */ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega329P__) || defined(__AVR_ATmega3290P__) +#define U8G_ATMEGA_HW_SPI_MOSI_PIN (_BV(2)) +#define U8G_ATMEGA_HW_SPI_SCK_PIN (_BV(1)) +#define U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN (_BV(0)) +#else +#define U8G_ATMEGA_HW_SPI_MOSI_PIN (_BV(3)) +#define U8G_ATMEGA_HW_SPI_SCK_PIN (_BV(5)) +#define U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN (_BV(2)) +#endif + + static uint8_t u8g_atmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE; static uint8_t u8g_atmega_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) { @@ -114,13 +122,13 @@ uint8_t u8g_com_atmega_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val //u8g_SetPIOutput(u8g, U8G_PI_A0); U8G_ATOMIC_START(); - - DDRB |= _BV(3); /* D0, MOSI */ - DDRB |= _BV(5); /* SCK */ - DDRB |= _BV(2); /* slave select */ - - PORTB &= ~_BV(3); /* D0, MOSI = 0 */ - PORTB &= ~_BV(5); /* SCK = 0 */ + + DDRB |= U8G_ATMEGA_HW_SPI_MOSI_PIN; + DDRB |= U8G_ATMEGA_HW_SPI_SCK_PIN; + DDRB |= U8G_ATMEGA_HW_SPI_SLAVE_SELECT_PIN; + + PORTB &= ~U8G_ATMEGA_HW_SPI_MOSI_PIN; + PORTB &= ~U8G_ATMEGA_HW_SPI_SCK_PIN; U8G_ATOMIC_END(); u8g_SetPILevel(u8g, U8G_PI_CS, 1); From c6bcb7944cec3cf6f7d9f80e61190e19b21fb326 Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 14 Nov 2016 05:51:54 +0100 Subject: [PATCH 102/109] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0a4b18f7..a869ca65 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # U8glib +Note: There will be no more development for U8glib. Please use [u8g2](https://github.com/olikraus/u8glib). + A graphics library with support for many different monochrome displays. ![nhd_oled180.jpg](https://github.com/olikraus/u8glib/wiki/otherpic/nhd_oled180.jpg) ![dogs102_180.jpg](https://github.com/olikraus/u8glib/wiki/otherpic/dogs102_180.jpg) From 00609fe25400fa29d9352a2461eac4e32c84e515 Mon Sep 17 00:00:00 2001 From: olikraus Date: Mon, 14 Nov 2016 05:56:07 +0100 Subject: [PATCH 103/109] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a869ca65..38ef6c5c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # U8glib -Note: There will be no more development for U8glib. Please use [u8g2](https://github.com/olikraus/u8glib). +Note: There will be no more development for U8glib. Please use [u8g2](https://github.com/olikraus/u8g2/wiki). A graphics library with support for many different monochrome displays. From f3836174a53f2622968c0b8a6ed8f17059fb58bf Mon Sep 17 00:00:00 2001 From: olikraus Date: Fri, 2 Dec 2016 21:59:55 +0100 Subject: [PATCH 104/109] update --- csrc/u8g_dev_uc1610_dogxl160.c | 2 +- sys/arduino/A2Printer/A2Printer.pde | 4 +- sys/arduino/GraphicsTest/GraphicsTest.pde | 4 +- .../GraphicsTest/Makefile.105.duemilanove | 285 ++++++++++++++++++ sys/arduino/HelloWorld/HelloWorld.pde | 4 +- sys/sdl/helloworld/main.c | 4 + 6 files changed, 296 insertions(+), 7 deletions(-) create mode 100644 sys/arduino/GraphicsTest/Makefile.105.duemilanove diff --git a/csrc/u8g_dev_uc1610_dogxl160.c b/csrc/u8g_dev_uc1610_dogxl160.c index 4f361664..8524b588 100644 --- a/csrc/u8g_dev_uc1610_dogxl160.c +++ b/csrc/u8g_dev_uc1610_dogxl160.c @@ -123,7 +123,7 @@ uint8_t u8g_dev_uc1610_dogxl160_bw_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, v u8g_SetAddress(u8g, dev, 1); /* data mode */ for( i = 0; i < WIDTH; i++ ) { - u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) ); + u8g_WriteByte(u8g, dev, u8g_dev_1to2( ((uint8_t *)(pb->buf))[i] >> 4 ) ); } u8g_SetChipSelect(u8g, dev, 0); diff --git a/sys/arduino/A2Printer/A2Printer.pde b/sys/arduino/A2Printer/A2Printer.pde index b101f995..96ddad00 100644 --- a/sys/arduino/A2Printer/A2Printer.pde +++ b/sys/arduino/A2Printer/A2Printer.pde @@ -59,11 +59,11 @@ uint8_t u8g_com_uart(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { //U8GLIB u8g(&u8g_dev_a2_micro_printer_192x120_ds, (u8g_com_fnptr)u8g_com_uart); // full resolution, requires to uncomment U8G_16BIT in u8g.h -//U8GLIB u8g(&u8g_dev_a2_micro_printer_384x240, (u8g_com_fnptr)u8g_com_uart); +U8GLIB u8g(&u8g_dev_a2_micro_printer_384x240, (u8g_com_fnptr)u8g_com_uart); // half resolution, extra log, requires to uncomment U8G_16BIT in u8g.h //U8GLIB u8g(&u8g_dev_a2_micro_printer_192x360_ds, (u8g_com_fnptr)u8g_com_uart); -U8GLIB u8g(&u8g_dev_a2_micro_printer_192x720_ds, (u8g_com_fnptr)u8g_com_uart); +//U8GLIB u8g(&u8g_dev_a2_micro_printer_192x720_ds, (u8g_com_fnptr)u8g_com_uart); diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index c25763b6..7f21582c 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -47,7 +47,7 @@ //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 -//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 +//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 @@ -77,7 +77,7 @@ //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 //U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 +U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 //U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 diff --git a/sys/arduino/GraphicsTest/Makefile.105.duemilanove b/sys/arduino/GraphicsTest/Makefile.105.duemilanove new file mode 100644 index 00000000..ea996947 --- /dev/null +++ b/sys/arduino/GraphicsTest/Makefile.105.duemilanove @@ -0,0 +1,285 @@ + +# +# Arduino-1.0 Makefile +# +# written by olikraus@gmail.com +# +# Features: +# - boards.txt is used to derive parameters +# - All intermediate files are put into a separate directory (TMPDIRNAME) +# - Simple use: Copy Makefile into the same directory of the .pde file +# +# Limitations: +# - requires UNIX environment +# - TMPDIRNAME must be subdirectory of the current directory. +# +# Targets +# all build everything +# upload build and upload to arduino +# clean remove all temporary files (includes final hex file) +# +# History +# 001 28 Apr 2010 first release +# 002 05 Oct 2010 added 'uno' +# 003 06 Dec 2011 arduino 1.0 +# 004 11 Feb 2012 u8glib +# + +#=== user configuration === +# All ...PATH variables must have a '/' at the end + +# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt +# Some examples: +# BOARD DESCRIPTION +# uno Arduino Uno +# atmega328 Arduino Duemilanove or Nano w/ ATmega328 +# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168 +# mega Arduino Mega +# mega2560 Arduino Mega2560 +# mini Arduino Mini +# lilypad328 LilyPad Arduino w/ ATmega328 +BOARD:=atmega328 + +# additional definitions +#DEFS:=-DARDUINO=105 + + +U8G_PATH:=$(shell cd ../../.. && pwd)/csrc/ +U8G_CPP_PATH:=$(shell cd ../../.. && pwd)/cppsrc/ +U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/ + + +# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. +# Can be empty if all tools are accessable through the search path +AVR_TOOLS_PATH:=/usr/bin/ + +# Install path of the arduino software. Requires a '/' at the end. +ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/ + +# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. +AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/ + +# The unix device where we can reach the arduino board +# Uno: /dev/ttyACM0 +# Duemilanove: /dev/ttyUSB0 +AVRDUDE_PORT:=/dev/ttyUSB0 + +# List of all libaries which should be included. +EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/ +EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/ +#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../ + +#=== fetch parameter from boards.txt processor parameter === +# the basic idea is to get most of the information from boards.txt + +BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt + +# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p +MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 +F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) +# get variant subfolder +VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT)) + + +# avrdude +# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 +AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) +# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 +AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) +# use stk500v1, because stk500 will default to stk500v2 +#AVRDUDE_PROGRAMMER:=stk500v1 + +#=== identify user files === +PDESRC:=$(shell ls *.pde) +TARGETNAME=$(basename $(PDESRC)) + +CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(U8G_FONT_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c +CSRC:=$(shell ls $(CDIRS) 2>/dev/null) + +CCSRC:=$(shell ls *.cc 2>/dev/null) + +CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) +CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(U8G_CPP_PATH)/*.cpp $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp +CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) + +#=== build internal variables === + +# the name of the subdirectory where everything is stored +TMPDIRNAME:=tmp +TMPDIRPATH:=$(TMPDIRNAME)/ + +AVRTOOLSPATH:=$(AVR_TOOLS_PATH) + +OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy +OBJDUMP:=$(AVRTOOLSPATH)avr-objdump +SIZE:=$(AVRTOOLSPATH)avr-size + +CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) + +COBJ:=$(CSRC:.c=.o) +CCOBJ:=$(CCSRC:.cc=.o) +CPPOBJ:=$(CPPSRC:.cpp=.o) + +OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) +DIRS:= $(dir $(OBJFILES)) + +DEPFILES:=$(OBJFILES:.o=.d) +# assembler files from avr-gcc -S +ASSFILES:=$(OBJFILES:.o=.s) +# disassembled object files with avr-objdump -S +DISFILES:=$(OBJFILES:.o=.dis) + + +LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a +ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf +HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex + +AVRDUDE_FLAGS = -V -F +AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf +AVRDUDE_FLAGS += -p $(MCU) +AVRDUDE_FLAGS += -P $(AVRDUDE_PORT) +AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE) +AVRDUDE_FLAGS += -U flash:w:$(HEXNAME) + +AVRDUDE = $(AVRDUDE_PATH)avrdude + +#=== predefined variable override === +# use "make -p -f/dev/null" to see the default rules and definitions + +# Build C and C++ flags. Include path information must be placed here +COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100 +# COMMON_FLAGS += -gdwarf-2 +COMMON_FLAGS += -Os +COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +COMMON_FLAGS += -I. +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino +COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT) +COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH) +COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS)) +COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections +COMMON_FLAGS += -Wl,--Map=output.map +COMMON_FLAGS += -Wl,--relax +COMMON_FLAGS += -mcall-prologues + +CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes +CXXFLAGS = $(COMMON_FLAGS) + +# Replace standard build tools by avr tools +CC = $(AVRTOOLSPATH)avr-gcc +CXX = $(AVRTOOLSPATH)avr-g++ +AR = @$(AVRTOOLSPATH)avr-ar + + +# "rm" must be able to delete a directory tree +RM = rm -rf + +#=== rules === + +# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH +# reuse existing variables as far as possible + +$(TMPDIRPATH)%.o: %.c + @echo compile $< + @$(COMPILE.c) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cc + @echo compile $< + @$(COMPILE.cc) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.o: %.cpp + @echo compile $< + @$(COMPILE.cpp) $(OUTPUT_OPTION) $< + +$(TMPDIRPATH)%.s: %.c + @$(COMPILE.c) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cc + @$(COMPILE.cc) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.s: %.cpp + @$(COMPILE.cpp) $(OUTPUT_OPTION) -S $< + +$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o + @$(OBJDUMP) -S $< > $@ + +.SUFFIXES: .elf .hex .pde + +.elf.hex: + @$(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(TMPDIRPATH)%.cpp: %.pde + @cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@ + @cat $< >> $@ + @echo >> $@ + @echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@ + + +.PHONY: all +all: tmpdir $(HEXNAME) assemblersource showsize + ls -al $(HEXNAME) $(ELFNAME) + +$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES))) + $(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@ + +$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES)) + +#=== create temp directory === +# not really required, because it will be also created during the dependency handling +.PHONY: tmpdir +tmpdir: + @test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH) + +#=== create assembler files for each C/C++ file === +.PHONY: assemblersource +assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES)) + + +#=== show the section sizes of the ELF file === +.PHONY: showsize +showsize: $(ELFNAME) + $(SIZE) $< + +#=== clean up target === +# this is simple: the TMPDIRPATH is removed +.PHONY: clean +clean: + $(RM) $(TMPDIRPATH) + +# Program the device. +# step 1: reset the arduino board with the stty command +# step 2: user avrdude to upload the software +.PHONY: upload +upload: $(HEXNAME) + stty -F $(AVRDUDE_PORT) hupcl + $(AVRDUDE) $(AVRDUDE_FLAGS) + + +# === dependency handling === +# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) +# Additionally (because this will be the first executed rule) TMPDIRPATH is created here. +# Instead of "sed" the "echo" command is used +# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd .. +DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\ +mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\ +set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@ + + +$(TMPDIRPATH)%.d: %.c + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cc + @$(DEPACTION) + +$(TMPDIRPATH)%.d: %.cpp + @$(DEPACTION) + +# Include dependency files. If a .d file is missing, a warning is created and the .d file is created +# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) +-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) + + diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index f827ac14..5018af40 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -78,7 +78,7 @@ //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 //U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 +U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 //U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 @@ -119,7 +119,7 @@ //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_LD7032_60x32 u8g(11, 12, 9, 10, 8); // SPI Com: SCK = 11, MOSI = 12, CS = 9, A0 = 10, RST = 8 (SW SPI Nano Board) -U8GLIB_LD7032_60x32 u8g(U8G_I2C_OPT_NONE); // I2C +//U8GLIB_LD7032_60x32 u8g(U8G_I2C_OPT_NONE); // I2C //U8GLIB_UC1608_240X64 u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 //U8GLIB_UC1608_240X64 u8g(10, 9, 8); // HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8 diff --git a/sys/sdl/helloworld/main.c b/sys/sdl/helloworld/main.c index 7f236ec2..351ef1e6 100644 --- a/sys/sdl/helloworld/main.c +++ b/sys/sdl/helloworld/main.c @@ -62,6 +62,10 @@ int main(void) u8g_t u8g; u8g_Init(&u8g, &u8g_dev_sdl_1bit); u8g_FirstPage(&u8g); + + + printf("%d\n", ((u8g_pb_t *)(u8g.dev->dev_mem))->p.page_height); + printf("%d\n", ((u8g_pb_t *)(u8g.dev->dev_mem))->p.total_height); do { From ee322babb21ae163f8937e7270839146a670e136 Mon Sep 17 00:00:00 2001 From: olikraus Date: Tue, 14 Feb 2017 19:33:40 +0100 Subject: [PATCH 105/109] issue --- sys/arduino/GraphicsTest/GraphicsTest.pde | 4 ++-- sys/arduino/HelloWorld/HelloWorld.pde | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/arduino/GraphicsTest/GraphicsTest.pde b/sys/arduino/GraphicsTest/GraphicsTest.pde index 7f21582c..4dfcfa22 100644 --- a/sys/arduino/GraphicsTest/GraphicsTest.pde +++ b/sys/arduino/GraphicsTest/GraphicsTest.pde @@ -77,8 +77,8 @@ //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 //U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 -//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 +//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 +U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16 diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index 5018af40..d7fc5984 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -77,8 +77,8 @@ //U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 +U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 +//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 //U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 From 99afbd151f73aa4aaf52b3e4da34cee5cc5a00d5 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 7 Apr 2017 19:24:03 +0200 Subject: [PATCH 106/109] Fix timeout handling for u8g_i2c_stop() To trigger a stop condition, the code sets the TWSTO bit, which is automaticaly cleared when the stop is copmleted. However, the code would call u8g_i2c_wait() to wait until the bit was *set*, not *cleared*. In most cases, the stop condition seems slow enough so the bit is not cleared and u8g_i2c_wait() is satisfied (though without waiting for the stop to be completed). However, in some cases the bit is already cleared, so u8g_i2c_wait stalls for the entire timeout and then sets a timeout error. In practice, these errors aren't usually checked, so this mostly causes some unneeded delays and not waiting for stop complete is probably not problematic either, but it is good to fix it anyway. This commit changes u8g_i2c_wait to allow waiting for a bit to be cleared in addition to it being set. --- csrc/u8g.h | 2 +- csrc/u8g_com_i2c.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/csrc/u8g.h b/csrc/u8g.h index a1008b4a..e04197c2 100644 --- a/csrc/u8g.h +++ b/csrc/u8g.h @@ -1511,7 +1511,7 @@ void u8g_i2c_clear_error(void) U8G_NOINLINE; uint8_t u8g_i2c_get_error(void) U8G_NOINLINE; uint8_t u8g_i2c_get_err_pos(void) U8G_NOINLINE; void u8g_i2c_init(uint8_t options) U8G_NOINLINE; /* use U8G_I2C_OPT_NONE as options */ -uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos) U8G_NOINLINE; +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t value, uint8_t pos) U8G_NOINLINE; uint8_t u8g_i2c_start(uint8_t sla) U8G_NOINLINE; uint8_t u8g_i2c_send_byte(uint8_t data) U8G_NOINLINE; uint8_t u8g_i2c_send_mode(uint8_t mode) U8G_NOINLINE; diff --git a/csrc/u8g_com_i2c.c b/csrc/u8g_com_i2c.c index 3664dd5c..3cab7286 100644 --- a/csrc/u8g_com_i2c.c +++ b/csrc/u8g_com_i2c.c @@ -144,10 +144,10 @@ void u8g_i2c_init(uint8_t options) u8g_i2c_clear_error(); } -uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos) +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t value, uint8_t pos) { volatile uint16_t cnt = 2000; /* timout value should be > 280 for 50KHz Bus and 16 Mhz CPU, however the start condition might need longer */ - while( !(TWCR & mask) ) + while( (TWCR & mask) != value ) { if ( cnt == 0 ) { @@ -175,7 +175,7 @@ uint8_t u8g_i2c_start(uint8_t sla) TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); /* wait */ - if ( u8g_i2c_wait(_BV(TWINT), 1) == 0 ) + if ( u8g_i2c_wait(_BV(TWINT), _BV(TWINT), 1) == 0 ) return 0; status = TW_STATUS; @@ -194,7 +194,7 @@ uint8_t u8g_i2c_start(uint8_t sla) TWCR = _BV(TWINT) | _BV(TWEN); /* wait */ - if ( u8g_i2c_wait(_BV(TWINT), 2) == 0 ) + if ( u8g_i2c_wait(_BV(TWINT), _BV(TWINT), 2) == 0 ) return 0; if ( u8g_i2c_opt & U8G_I2C_OPT_NO_ACK ) @@ -220,7 +220,7 @@ uint8_t u8g_i2c_send_byte(uint8_t data) register uint8_t status; TWDR = data; TWCR = _BV(TWINT) | _BV(TWEN); - if ( u8g_i2c_wait(_BV(TWINT), 3) == 0 ) + if ( u8g_i2c_wait(_BV(TWINT), _BV(TWINT), 3) == 0 ) return 0; if ( u8g_i2c_opt & U8G_I2C_OPT_NO_ACK ) @@ -246,7 +246,7 @@ void u8g_i2c_stop(void) TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO); /* no error is checked for the stop condition */ - u8g_i2c_wait(_BV(TWSTO), 4); + u8g_i2c_wait(_BV(TWSTO), 0, 4); } @@ -612,7 +612,7 @@ uint8_t u8g_i2c_send_byte(uint8_t data) { return 1; } -uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos) +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t value, uint8_t pos) { return 1; } @@ -626,7 +626,7 @@ void u8g_i2c_init(uint8_t options) u8g_i2c_clear_error(); } -uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos) +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t value, uint8_t pos) { return 1; } From f3d1077c2448ed4ba9c53534074249fa8dc9571c Mon Sep 17 00:00:00 2001 From: kraus Date: Sat, 10 Jul 2021 09:01:48 +0200 Subject: [PATCH 107/109] branch preparation --- autoclean.sh | 0 autogen.sh | 0 doc/do_device_wiki.sh | 0 download/bdf2u8g_101.exe | Bin sys/arduino/HelloWorld/HelloWorld.pde | 3 ++- sys/lpc11xx/gps/do | 0 sys/pbm/cliptest/Makefile | 0 sys/pbm/cliptest_gr/Makefile | 0 sys/pbm/helloworld/Makefile | 0 sys/stdout/flipdisk/Makefile | 0 sys/stdout/flipdisk_vs/Makefile | 0 sys/stdout/helloworld/Makefile | 0 sys/stdout/rotation/Makefile | 0 tools/descpic/Makefile | 0 tools/descpic/copy_to_wiki.sh | 0 tools/font/bdf/u8glib_4.bdf | 0 tools/font/bdf2u8g/bdf2u8g.exe | Bin tools/font/build/do_clean.sh | 0 tools/font/build/do_u8g_fonts.sh | 0 tools/font/build/do_u8g_fontsize.sh | 0 tools/font/build/do_u8g_fontsize_a.sh | 0 tools/font/build/do_u8g_fontsize_a_n.sh | 0 tools/font/build/do_u8g_fontsize_f1.sh | 0 tools/font/build/do_u8g_fontsize_n.sh | 0 tools/font/otf2bdf/configure | 0 tools/font/overview/Makefile | 0 tools/font/sfnt/do_sfntsrc.sh | 0 tools/font/u8g/u8glib_4.bdf | 0 tools/pic/png/do_resize.sh | 0 tools/pic/png/do_xbm.sh | 0 tools/polygon/do.sh | 0 tools/release/arduino/create_release.sh | 0 .../arduino_new_lib_format/create_release.sh | 0 tools/release/arm/create_release.sh | 0 tools/release/arm/sub_create.sh | 0 tools/release/avr/create_release.sh | 0 tools/release/botmat/create_release.sh | 0 tools/release/msp430/create_release.sh | 0 tools/release/pic18/create_release.sh | 0 tools/release/print_release.sh | 0 40 files changed, 2 insertions(+), 1 deletion(-) mode change 100755 => 100644 autoclean.sh mode change 100755 => 100644 autogen.sh mode change 100755 => 100644 doc/do_device_wiki.sh mode change 100644 => 100755 download/bdf2u8g_101.exe mode change 100755 => 100644 sys/lpc11xx/gps/do mode change 100755 => 100644 sys/pbm/cliptest/Makefile mode change 100755 => 100644 sys/pbm/cliptest_gr/Makefile mode change 100755 => 100644 sys/pbm/helloworld/Makefile mode change 100755 => 100644 sys/stdout/flipdisk/Makefile mode change 100755 => 100644 sys/stdout/flipdisk_vs/Makefile mode change 100755 => 100644 sys/stdout/helloworld/Makefile mode change 100755 => 100644 sys/stdout/rotation/Makefile mode change 100755 => 100644 tools/descpic/Makefile mode change 100755 => 100644 tools/descpic/copy_to_wiki.sh mode change 100755 => 100644 tools/font/bdf/u8glib_4.bdf mode change 100644 => 100755 tools/font/bdf2u8g/bdf2u8g.exe mode change 100755 => 100644 tools/font/build/do_clean.sh mode change 100755 => 100644 tools/font/build/do_u8g_fonts.sh mode change 100755 => 100644 tools/font/build/do_u8g_fontsize.sh mode change 100755 => 100644 tools/font/build/do_u8g_fontsize_a.sh mode change 100755 => 100644 tools/font/build/do_u8g_fontsize_a_n.sh mode change 100755 => 100644 tools/font/build/do_u8g_fontsize_f1.sh mode change 100755 => 100644 tools/font/build/do_u8g_fontsize_n.sh mode change 100755 => 100644 tools/font/otf2bdf/configure mode change 100755 => 100644 tools/font/overview/Makefile mode change 100755 => 100644 tools/font/sfnt/do_sfntsrc.sh mode change 100755 => 100644 tools/font/u8g/u8glib_4.bdf mode change 100755 => 100644 tools/pic/png/do_resize.sh mode change 100755 => 100644 tools/pic/png/do_xbm.sh mode change 100755 => 100644 tools/polygon/do.sh mode change 100755 => 100644 tools/release/arduino/create_release.sh mode change 100755 => 100644 tools/release/arduino_new_lib_format/create_release.sh mode change 100755 => 100644 tools/release/arm/create_release.sh mode change 100755 => 100644 tools/release/arm/sub_create.sh mode change 100755 => 100644 tools/release/avr/create_release.sh mode change 100755 => 100644 tools/release/botmat/create_release.sh mode change 100755 => 100644 tools/release/msp430/create_release.sh mode change 100755 => 100644 tools/release/pic18/create_release.sh mode change 100755 => 100644 tools/release/print_release.sh diff --git a/autoclean.sh b/autoclean.sh old mode 100755 new mode 100644 diff --git a/autogen.sh b/autogen.sh old mode 100755 new mode 100644 diff --git a/doc/do_device_wiki.sh b/doc/do_device_wiki.sh old mode 100755 new mode 100644 diff --git a/download/bdf2u8g_101.exe b/download/bdf2u8g_101.exe old mode 100644 new mode 100755 diff --git a/sys/arduino/HelloWorld/HelloWorld.pde b/sys/arduino/HelloWorld/HelloWorld.pde index d7fc5984..032196f8 100644 --- a/sys/arduino/HelloWorld/HelloWorld.pde +++ b/sys/arduino/HelloWorld/HelloWorld.pde @@ -77,13 +77,14 @@ //U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 -U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 +//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8 //U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16 //U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16 //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 ); // 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16 //U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16 +//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,A3,A2, A0, A1, A4); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16 //U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9 //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED) //U8GLIB_SSD1306_128X64 u8g(10, 9); // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are SCK = 13 and MOSI = 11) diff --git a/sys/lpc11xx/gps/do b/sys/lpc11xx/gps/do old mode 100755 new mode 100644 diff --git a/sys/pbm/cliptest/Makefile b/sys/pbm/cliptest/Makefile old mode 100755 new mode 100644 diff --git a/sys/pbm/cliptest_gr/Makefile b/sys/pbm/cliptest_gr/Makefile old mode 100755 new mode 100644 diff --git a/sys/pbm/helloworld/Makefile b/sys/pbm/helloworld/Makefile old mode 100755 new mode 100644 diff --git a/sys/stdout/flipdisk/Makefile b/sys/stdout/flipdisk/Makefile old mode 100755 new mode 100644 diff --git a/sys/stdout/flipdisk_vs/Makefile b/sys/stdout/flipdisk_vs/Makefile old mode 100755 new mode 100644 diff --git a/sys/stdout/helloworld/Makefile b/sys/stdout/helloworld/Makefile old mode 100755 new mode 100644 diff --git a/sys/stdout/rotation/Makefile b/sys/stdout/rotation/Makefile old mode 100755 new mode 100644 diff --git a/tools/descpic/Makefile b/tools/descpic/Makefile old mode 100755 new mode 100644 diff --git a/tools/descpic/copy_to_wiki.sh b/tools/descpic/copy_to_wiki.sh old mode 100755 new mode 100644 diff --git a/tools/font/bdf/u8glib_4.bdf b/tools/font/bdf/u8glib_4.bdf old mode 100755 new mode 100644 diff --git a/tools/font/bdf2u8g/bdf2u8g.exe b/tools/font/bdf2u8g/bdf2u8g.exe old mode 100644 new mode 100755 diff --git a/tools/font/build/do_clean.sh b/tools/font/build/do_clean.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fonts.sh b/tools/font/build/do_u8g_fonts.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fontsize.sh b/tools/font/build/do_u8g_fontsize.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fontsize_a.sh b/tools/font/build/do_u8g_fontsize_a.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fontsize_a_n.sh b/tools/font/build/do_u8g_fontsize_a_n.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fontsize_f1.sh b/tools/font/build/do_u8g_fontsize_f1.sh old mode 100755 new mode 100644 diff --git a/tools/font/build/do_u8g_fontsize_n.sh b/tools/font/build/do_u8g_fontsize_n.sh old mode 100755 new mode 100644 diff --git a/tools/font/otf2bdf/configure b/tools/font/otf2bdf/configure old mode 100755 new mode 100644 diff --git a/tools/font/overview/Makefile b/tools/font/overview/Makefile old mode 100755 new mode 100644 diff --git a/tools/font/sfnt/do_sfntsrc.sh b/tools/font/sfnt/do_sfntsrc.sh old mode 100755 new mode 100644 diff --git a/tools/font/u8g/u8glib_4.bdf b/tools/font/u8g/u8glib_4.bdf old mode 100755 new mode 100644 diff --git a/tools/pic/png/do_resize.sh b/tools/pic/png/do_resize.sh old mode 100755 new mode 100644 diff --git a/tools/pic/png/do_xbm.sh b/tools/pic/png/do_xbm.sh old mode 100755 new mode 100644 diff --git a/tools/polygon/do.sh b/tools/polygon/do.sh old mode 100755 new mode 100644 diff --git a/tools/release/arduino/create_release.sh b/tools/release/arduino/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/arduino_new_lib_format/create_release.sh b/tools/release/arduino_new_lib_format/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/arm/create_release.sh b/tools/release/arm/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/arm/sub_create.sh b/tools/release/arm/sub_create.sh old mode 100755 new mode 100644 diff --git a/tools/release/avr/create_release.sh b/tools/release/avr/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/botmat/create_release.sh b/tools/release/botmat/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/msp430/create_release.sh b/tools/release/msp430/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/pic18/create_release.sh b/tools/release/pic18/create_release.sh old mode 100755 new mode 100644 diff --git a/tools/release/print_release.sh b/tools/release/print_release.sh old mode 100755 new mode 100644 From f1642c3045b67d17be80ae21155ff780fa315bfb Mon Sep 17 00:00:00 2001 From: kraus Date: Sat, 10 Jul 2021 09:07:46 +0200 Subject: [PATCH 108/109] update --- download/u8glib_arduino_v1.17pre6.zip | Bin 0 -> 1131125 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 download/u8glib_arduino_v1.17pre6.zip diff --git a/download/u8glib_arduino_v1.17pre6.zip b/download/u8glib_arduino_v1.17pre6.zip new file mode 100644 index 0000000000000000000000000000000000000000..996c842fc0b6bd638f92dc2f596931c134b40423 GIT binary patch literal 1131125 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%0AXs7RaiksiArcpuh>rx(n> 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

%FWi zAGlNo;a1F0AaVEWa$#>0XTVE$7%wv_g@xVy8=Jw=L2*$Q^)EdJfchR4jvz%vR$6tj zm2l3{=+IHvF5EqrB-0Yi+A{nXQ6w*naELLEje+F#htKkWqj8TzoY%Z5k8JV*z0hYxx$6KrS#dFHVUp+WxK~;sjSTcgaRFa4tS}Z= zPkb>R7Asaw5&*Adt%s!}f}w059kRo+)Tr$4VcCH}0;ry`Ah0a%QI0iU^b;Cs+hG!~ zo-;VLh9VlhV8Mm7ukiC+&n9b4&%I{TS(OTGar?TW>4~q+_ z9Yj%eAlOlibruIPgx4h*hFXrL;Z|*T`>msu*L9FP*hjjtF%@b=Nxxk1!%871(rA0^ z^z1a|NY~0I#E-s$>(B;y@jTF$ySUw|m+jij{jQxc(J#%NLB1&I7qA^;75;jjdE&MY zlRyAa7RhDnmya-M=w!3&dNi_Yhw9VEradD;bxW#{bA%yw74lgqZn174WB4Fnyfu6f zckwLPwLWna_S+5rSM7#}go^8HKm0{PMdyhBKt{!pIq2<(e>>v2Ngnar5g*)YjmU3? z`gX*ZwxC}wpP|3JEfq)`JGa*bcmD|u?d~( z=fAR)f;a6L|M8DM{Qg(JYYZ6sw=iI=-hi>pR~C$23=iegpTSP>r}|~rg0Ws%F!pb3 z!C1xe0A*fSFrdu0vS93gTGsE&{{6mvPRqGpnlZGjv1L55j%^t$Vqzs$=#k$x2(>ka zjOt8YmK~la{#6>ZW%3A;p*t-GU5g|rF&gZeVKOwOjQ=tuI?xbD*)hQVG5a&_p~ClVP1h=LUi oB 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%0A=*Knpkr2DIGZeuJhmh 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

cgrW2CVU|g4 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%0AJUbN}KkjInknAr}%hJM8r< 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

Zq27RG*$-Av!7mHr*Mu!-dQgxkWkg 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⁡a}R!=43NzU_iRT>-k+tUlep5TgekVbwz+xtH@~ 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 Date: Mon, 21 Mar 2022 22:58:13 +0900 Subject: [PATCH 109/109] Add sleep support for st7920, mini12864, dogs102 --- csrc/u8g_dev_st7920_128x64.c | 32 ++++++++++++++++++++++++++++++++ csrc/u8g_dev_st7920_192x32.c | 32 ++++++++++++++++++++++++++++++++ csrc/u8g_dev_st7920_202x32.c | 32 ++++++++++++++++++++++++++++++++ csrc/u8g_dev_uc1701_dogs102.c | 30 ++++++++++++++++++++++++++++++ csrc/u8g_dev_uc1701_mini12864.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+) diff --git a/csrc/u8g_dev_st7920_128x64.c b/csrc/u8g_dev_st7920_128x64.c index 29e63134..12084551 100644 --- a/csrc/u8g_dev_st7920_128x64.c +++ b/csrc/u8g_dev_st7920_128x64.c @@ -61,6 +61,26 @@ static const uint8_t u8g_dev_st7920_128x64_init_seq[] PROGMEM = { U8G_ESC_END /* end of sequence */ }; +static const uint8_t u8g_dev_st7920_128x64_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x008, /* display off */ + 0x034, /* 8 Bit interface (DL=1), extended instruction set (RE=1) */ + 0x001, /* Standby mode */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_st7920_128x64_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x00c, /* display on, cursor & blink off */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + uint8_t u8g_dev_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) @@ -105,6 +125,12 @@ uint8_t u8g_dev_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_sleep_off); + return 1; } return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); } @@ -153,6 +179,12 @@ uint8_t u8g_dev_st7920_128x64_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_sleep_off); + return 1; } return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); } diff --git a/csrc/u8g_dev_st7920_192x32.c b/csrc/u8g_dev_st7920_192x32.c index 736b0828..ade67367 100644 --- a/csrc/u8g_dev_st7920_192x32.c +++ b/csrc/u8g_dev_st7920_192x32.c @@ -60,6 +60,26 @@ static const uint8_t u8g_dev_st7920_192x32_init_seq[] PROGMEM = { U8G_ESC_END /* end of sequence */ }; +static const uint8_t u8g_dev_st7920_192x32_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x008, /* display off */ + 0x034, /* 8 Bit interface (DL=1), extended instruction set (RE=1) */ + 0x001, /* Standby mode */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_st7920_192x32_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x00c, /* display on, cursor & blink off */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + uint8_t u8g_dev_st7920_192x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) @@ -94,6 +114,12 @@ uint8_t u8g_dev_st7920_192x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_sleep_off); + return 1; } return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); } @@ -132,6 +158,12 @@ uint8_t u8g_dev_st7920_192x32_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_192x32_sleep_off); + return 1; } return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); } diff --git a/csrc/u8g_dev_st7920_202x32.c b/csrc/u8g_dev_st7920_202x32.c index b36b7abc..161368d5 100644 --- a/csrc/u8g_dev_st7920_202x32.c +++ b/csrc/u8g_dev_st7920_202x32.c @@ -63,6 +63,26 @@ static const uint8_t u8g_dev_st7920_202x32_init_seq[] PROGMEM = { U8G_ESC_END /* end of sequence */ }; +static const uint8_t u8g_dev_st7920_202x32_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x008, /* display off */ + 0x034, /* 8 Bit interface (DL=1), extended instruction set (RE=1) */ + 0x001, /* Standby mode */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_st7920_202x32_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x038, /* 8 Bit interface (DL=1), basic instruction set (RE=0) */ + 0x00c, /* display on, cursor & blink off */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + uint8_t u8g_dev_st7920_202x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) @@ -97,6 +117,12 @@ uint8_t u8g_dev_st7920_202x32_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void * u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_sleep_off); + return 1; } return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); } @@ -135,6 +161,12 @@ uint8_t u8g_dev_st7920_202x32_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi u8g_SetChipSelect(u8g, dev, 0); } break; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_202x32_sleep_off); + return 1; } return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); } diff --git a/csrc/u8g_dev_uc1701_dogs102.c b/csrc/u8g_dev_uc1701_dogs102.c index 5161ef95..cf51f50c 100644 --- a/csrc/u8g_dev_uc1701_dogs102.c +++ b/csrc/u8g_dev_uc1701_dogs102.c @@ -77,6 +77,24 @@ static const uint8_t u8g_dev_dogs102_data_start[] PROGMEM = { U8G_ESC_END /* end of sequence */ }; +static const uint8_t u8g_dev_dogs102_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0ae, /* display off */ + 0x0a5, /* enter powersafe: all pixel on */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_dogs102_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0a4, /* display on */ + 0x0af, /* all pixel off */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + uint8_t u8g_dev_dogs102_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) @@ -105,6 +123,12 @@ uint8_t u8g_dev_dogs102_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_sleep_off); + return 1; } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } @@ -143,6 +167,12 @@ uint8_t u8g_dev_uc1701_dogs102_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_dogs102_sleep_off); + return 1; } return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } diff --git a/csrc/u8g_dev_uc1701_mini12864.c b/csrc/u8g_dev_uc1701_mini12864.c index 209a7b93..489c60ca 100644 --- a/csrc/u8g_dev_uc1701_mini12864.c +++ b/csrc/u8g_dev_uc1701_mini12864.c @@ -79,6 +79,24 @@ static const uint8_t u8g_dev_uc1701_mini12864_data_start[] PROGMEM = { U8G_ESC_END /* end of sequence */ }; +static const uint8_t u8g_dev_uc1701_mini12864_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0ae, /* display off */ + 0x0a5, /* enter powersafe: all pixel on */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + +static const uint8_t u8g_dev_uc1701_mini12864_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x0a4, /* display on */ + 0x0af, /* all pixel off */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ +}; + uint8_t u8g_dev_uc1701_mini12864_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) @@ -107,6 +125,12 @@ uint8_t u8g_dev_uc1701_mini12864_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, voi u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_sleep_off); + return 1; } return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } @@ -145,6 +169,12 @@ uint8_t u8g_dev_uc1701_mini12864_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_sleep_off); + return 1; } return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); }

=={cx>}iV`+d;9`}Pg!7;ts&A&mBBZWZfjW4^{i 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