Subversion Repositories chibiosIgnition

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * oledDisplay.H
  3.  *
  4.  *  Created on: 23 Mar 2018
  5.  *      Author: Mike
  6.  */
  7. #pragma once
  8.  
  9. #define swap(x,y) { typeof(x)t = x; x=y; y=t; }
  10. #define abs(x)      ((x)>0?(x):-(x))
  11.  
  12. enum colour_t { BLACK,WHITE, INVERT };
  13.  
  14. #include "spiInterface.H"
  15. #include "SSD13O6.h"
  16. class oledDisplayBase
  17. {
  18.  
  19. };
  20.  
  21. template  < uint16_t width, uint16_t height,  uint16_t ramWidth> class oledDisplay : public oledDisplayBase
  22. {
  23. public:
  24.         oledDisplay();
  25.  
  26.    uint8_t getRotation() { return rotation; };
  27.  
  28.    int16_t  getWidth() {
  29.         switch (rotation) {
  30.         case 0:
  31.                 return width;
  32.                 break;
  33.         case 1:
  34.                 return width;
  35.                 break;
  36.         case 2:
  37.                 return height;
  38.                 break;
  39.         case 3:
  40.                 return -width;
  41.                 break;
  42.         }
  43.         return 0;
  44.    }
  45.  
  46.    int16_t  getHeight() {
  47.         switch (rotation) {
  48.         case 0:
  49.                 return height;
  50.                 break;
  51.         case 1:
  52.                 return height;
  53.                 break;
  54.         case 2:
  55.                 return width;
  56.                 break;
  57.         case 3:
  58.                 return -height;
  59.                 break;
  60.         }
  61.         return 0;
  62.    }
  63.  
  64.  
  65.    // the most basic function, set a single pixel
  66.    void drawPixel(int16_t x, int16_t y, uint16_t color) {
  67.         if ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))
  68.                 return;
  69.  
  70.         // check rotation, move pixel around if necessary
  71.         switch (getRotation()) {
  72.         case 1:
  73.                 swap(x, y);
  74.                 x = width - x - 1;
  75.                 break;
  76.         case 2:
  77.                 x = width - x - 1;
  78.                 y = height - y - 1;
  79.                 break;
  80.         case 3:
  81.                 swap(x, y)
  82.                 ;
  83.                 y = height - y - 1;
  84.                 break;
  85.         }
  86.  
  87.         // x is which column
  88.         switch (color) {
  89.         case BLACK:
  90.                 displayBuffer[x + (y / 8) * width] &= ~(1 << (y & 7));
  91.                 break;
  92.  
  93.         default:
  94.         case WHITE:
  95.                 displayBuffer[x + (y / 8) * width] |= (1 << (y & 7));
  96.                 break;
  97.  
  98.         case INVERT:
  99.                 displayBuffer[x + (y / 8) * width] ^= (1 << (y & 7));
  100.                 break;
  101.         }
  102.    }
  103.  
  104.  
  105.    void display(void) {
  106.  
  107.  
  108.         // select entire display as window to write into
  109.         ssd1306commandSPIwrite(SSD1306_COLUMNADDR);
  110.         ssd1306commandSPIwrite(0);   // Column start address (0 = reset)
  111.         ssd1306commandSPIwrite(ramWidth-1); // Column end address (127 = reset)
  112.  
  113.         ssd1306commandSPIwrite(SSD1306_PAGEADDR);
  114.         ssd1306commandSPIwrite(0); // Page start address (0 = reset)
  115.         ssd1306commandSPIwrite((height == 64) ? 7 : 3); // Page end address
  116.  
  117.         int row;
  118.  
  119.         int col = ramWidth == 132 ? 2 : 0;
  120.         for (row = 0; row < height / 8; row++) {
  121.                 // set the cursor to
  122.                 ssd1306commandSPIwrite(0xB0 + row); //set page address
  123.                 ssd1306commandSPIwrite(col & 0xf); //set lower column address
  124.                 ssd1306commandSPIwrite(0x10 | (col >> 4)); //set higher column address
  125.  
  126.                 ssd1306SendDisplay(
  127.                                 (uint8_t *) (&displayBuffer[0]) + row * width,
  128.                                 width);
  129.  
  130.         }
  131.  
  132.    }
  133.  
  134.    // clear everything
  135.    void clearDisplay(void) {
  136.         memset(&displayBuffer, 0, (width * height / 8));
  137.    }
  138.  
  139.  
  140. private:
  141.  
  142.         uint8_t displayBuffer[width * height
  143.                         / 8];
  144.  
  145.         uint8_t rotation;
  146. };
  147.  
  148.  
  149. class ssd1106display : public oledDisplay  <128,64,128>
  150. {
  151.  
  152. };
  153.  
  154. class ssd1306display : public oledDisplay  <128,64,132>
  155. {
  156.  
  157.  
  158. };
  159.