SG12864A

Dependents:   SG12864A_TestProgram

Files at this revision

API Documentation at this revision

Comitter:
shintamainjp
Date:
Tue Jul 20 07:23:15 2010 +0000
Parent:
2:91c03e41c927
Child:
4:200d1ea4e76e
Commit message:

Changed in this revision

SG12864A.cpp Show annotated file Show diff for this revision Revisions of this file
SG12864A.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/SG12864A.cpp	Tue Jul 20 05:30:47 2010 +0000
+++ b/SG12864A.cpp	Tue Jul 20 07:23:15 2010 +0000
@@ -159,13 +159,17 @@
 void SG12864A::bufferPull(void) {
 }
 
-void SG12864A::bufferClear(void) {
+void SG12864A::bufferClear(bool reverse) {
     for (int i = 0; i < sizeof(buffer); i++) {
-        buffer[i] = 0x00;
+        if (reverse) {
+            buffer[i] = 0xFF;
+        } else {
+            buffer[i] = 0x00;
+        }
     }
 }
 
-void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
+void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
     /*
      * Bresenham's line algorithm
      */
@@ -190,9 +194,17 @@
     }
     for (int x = x1; x <= x2; x++) {
         if (steep) {
-            setPixel(y,x);
+            if (reverse) {
+                unsetPixel(y, x);
+            } else {
+                setPixel(y, x);
+            }
         } else {
-            setPixel(x,y);
+            if (reverse) {
+                unsetPixel(x, y);
+            } else {
+                setPixel(x, y);
+            }
         }
         error = error - deltay;
         if (error < 0) {
@@ -202,45 +214,67 @@
     }
 }
 
-void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
+void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
     for (int x = x1; x <= x2; x++) {
-        setPixel(x, y1);
-        setPixel(x, y2);
+        if (reverse) {
+            unsetPixel(x, y1);
+            unsetPixel(x, y2);
+        } else {
+            setPixel(x, y1);
+            setPixel(x, y2);
+        }
     }
     for (int y = y1; y <= y2; y++) {
-        setPixel(x1, y);
-        setPixel(x2, y);
-    }
-}
-
-void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
-    for (int x = x1; x <= x2; x++) {
-        for (int y = y1; y <= y2; y++) {
-            setPixel(x, y);
+        if (reverse) {
+            unsetPixel(x1, y);
+            unsetPixel(x2, y);
+        } else {
+            setPixel(x1, y);
+            setPixel(x2, y);
         }
     }
 }
 
-void SG12864A::bufferDrawString(const uint8_t x, const uint8_t y, const char * str) {
-    char *p = (char *)str;
+void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) {
+    for (int x = x1; x <= x2; x++) {
+        for (int y = y1; y <= y2; y++) {
+            if (reverse) {
+                unsetPixel(x, y);
+            } else {
+                setPixel(x, y);
+            }
+        }
+    }
+}
+
+void SG12864A::bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse) {
+    char *p = str;
     int cnt = 0;
     while (*p) {
-        bufferDrawChar(x + (FONT_X * cnt), y, *p);
+        bufferDrawChar(x + (FONT_X * cnt), y, *p, reverse);
         p++;
         cnt++;
     }
 }
 
-void SG12864A::bufferDrawChar(const uint8_t x, const uint8_t y, const char c) {
+void SG12864A::bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse) {
     if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) {
         int aofs = (c - FONT_MIN_CODE) * FONT_X;
         for (int i = 0; i < FONT_X; i++) {
             uint8_t pat = font5x7_data[aofs + i];
             for (int j = 0; j < FONT_Y; j++) {
                 if (pat & (1 << j)) {
-                    setPixel(x + i, y + j);
+                    if (reverse) {
+                        unsetPixel(x + i, y + j);
+                    } else {
+                        setPixel(x + i, y + j);
+                    }
                 } else {
-                    unsetPixel(x + i, y + j);
+                    if (reverse) {
+                        setPixel(x + i, y + j);
+                    } else {
+                        unsetPixel(x + i, y + j);
+                    }
                 }
             }
         }
@@ -249,15 +283,42 @@
             uint8_t pat = (i % 2) ? 0x55 : 0xAA;
             for (int j = 0; j < FONT_Y; j++) {
                 if (pat & (1 << j)) {
-                    setPixel(x + i, y + j);
+                    if (reverse) {
+                        unsetPixel(x + i, y + j);
+                    } else {
+                        setPixel(x + i, y + j);
+                    }
                 } else {
-                    unsetPixel(x + i, y + j);
+                    if (reverse) {
+                        setPixel(x + i, y + j);
+                    } else {
+                        unsetPixel(x + i, y + j);
+                    }
                 }
             }
         }
     }
 }
 
+void SG12864A::bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse) {
+    bufferDrawBox(x1, y1, x2, y2, reverse);
+    if (state) {
+        bufferDrawLine(x1, y1, x2, y2, reverse);
+        bufferDrawLine(x1, y2, x2, y1, reverse);
+    }
+}
+
+void SG12864A::bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool horizontal, bool reverse) {
+    bufferDrawBox(x1, y1, x2, y2, reverse);
+    if ((value < min) || (max < value)) {
+        return;
+    }
+    int tmp_max = max - min;
+    int tmp_val = value - min;
+    int pix = ((x2 - x1) * tmp_val) / tmp_max;
+    bufferFillBox(x1 + 1, y1 + 1, x1 + pix - 1, y2 - 1, reverse);
+}
+
 /**
  * High Level Interface.
  *
--- a/SG12864A.h	Tue Jul 20 05:30:47 2010 +0000
+++ b/SG12864A.h	Tue Jul 20 07:23:15 2010 +0000
@@ -34,18 +34,30 @@
         CS1,
         CS2
     };
+    
+    /*
+     * High Level Interfaces. (Abstracted)
+     */
     void bufferPush(void);
     void bufferPull(void);
-    void bufferClear(void);
-    void bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
-    void bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
-    void bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
-    void bufferDrawString(const uint8_t x, const uint8_t y, const char * str);
-    void bufferDrawChar(const uint8_t x, const uint8_t y, const char c);
+    void bufferClear(bool reverse = false);
+    void bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false);
+    void bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false);
+    void bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false);
+    void bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse = false);
+    void bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse = false);
+    void bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse = false);
+    void bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool horizontal = true, bool reverse = false);
 
+    /*
+     * High Level Interfaces.
+     */
     void reset(void);
     void clear(void);
 
+    /*
+     * Middle Level Interfaces.
+     */
     void setDisplayOnOff(Target t, bool on);
     void setDisplayStartLine(Target t, uint8_t displayStartLine);
     void setPageAddress(Target t, uint8_t addr);
@@ -75,6 +87,10 @@
         Data,
         Instruction
     };
+    
+    /*
+     * Low Level Interfaces.
+     */
     void setDirectionToRead();
     void setDirectionToWrite();
     void write(Target t, Mode m, uint8_t c);
--- a/main.cpp	Tue Jul 20 05:30:47 2010 +0000
+++ b/main.cpp	Tue Jul 20 07:23:15 2010 +0000
@@ -41,28 +41,73 @@
 #else
     lcd.clear();
     lcd.reset();
+    bool reverse = false;
     while (1) {
         //
-        lcd.bufferClear();
-        lcd.bufferDrawLine(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1);
-        lcd.bufferDrawLine(0, SG12864A::PIXEL_Y - 1, SG12864A::PIXEL_X - 1, 0);
-        lcd.bufferDrawString(1, 1, "This is a test #1.\b");
+        lcd.bufferClear(reverse);
+        lcd.bufferDrawLine(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse);
+        lcd.bufferDrawLine(0, SG12864A::PIXEL_Y - 1, SG12864A::PIXEL_X - 1, 0, reverse);
+        lcd.bufferDrawString(1, 1, "This is a test #1.\b", reverse);
+        lcd.bufferDrawCheckbox(50, 50, 60, 60, true, reverse);
         lcd.bufferPush();
         wait_ms(1000);
 
         //
-        lcd.bufferClear();
-        lcd.bufferDrawBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1);
-        lcd.bufferDrawString(1, 2, "This is a test #2.\b");
+        lcd.bufferClear(reverse);
+        lcd.bufferDrawBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse);
+        lcd.bufferDrawString(1, 2, "This is a test #2.\b", reverse);
+        lcd.bufferDrawCheckbox(50, 50, 60, 60, false, reverse);
         lcd.bufferPush();
         wait_ms(1000);
 
+#if 0
         //
-        lcd.bufferClear();
-        lcd.bufferFillBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1);
-        lcd.bufferDrawString(1, 3, "This is a test #3.\b");
+        lcd.bufferClear(reverse);
+        lcd.bufferFillBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse);
+        lcd.bufferDrawString(1, 3, "This is a test #3.\b", reverse);
+        lcd.bufferDrawCheckbox(50, 50, 60, 60, true, reverse);
         lcd.bufferPush();
         wait_ms(1000);
+#endif
+
+        //
+        {
+            lcd.bufferClear(reverse);
+            int min = 0;
+            int max = 100;
+            for (int i = min; i <= max; i++) {
+                lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse);
+                lcd.bufferPush();
+                wait_ms(2);
+            }
+        }
+
+        //
+        {
+            lcd.bufferClear(reverse);
+            int min = -100;
+            int max = 100;
+            for (int i = min; i <= max; i++) {
+                lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse);
+                lcd.bufferPush();
+                wait_ms(2);
+            }
+        }
+
+        //
+        {
+            lcd.bufferClear(reverse);
+            int min = 100;
+            int max = 600;
+            for (int i = min; i <= max; i++) {
+                lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse);
+                lcd.bufferPush();
+                wait_ms(2);
+            }
+        }
+
+        //
+        reverse = !reverse;
     }
 #endif
 }