Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: display-puck display-puck
Diff: EPD.h
- Revision:
- 0:6ac5ba1343bf
- Child:
- 1:2f62e2b80305
diff -r 000000000000 -r 6ac5ba1343bf EPD.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EPD.h Thu Jul 17 14:15:53 2014 +0000
@@ -0,0 +1,168 @@
+// Copyright 2013 Pervasive Displays, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at:
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the License for the specific language
+// governing permissions and limitations under the License.
+
+#if !defined(EPD_H)
+#define EPD_H 1
+
+#include <SPI.h>
+#include <mbed.h>
+
+
+// if more SRAM available (8 kBytes)
+#define EPD_ENABLE_EXTRA_SRAM 1
+
+typedef enum {
+ EPD_1_44, // 128 x 96
+ EPD_2_0, // 200 x 96
+ EPD_2_7 // 264 x 176
+} EPD_size;
+
+typedef enum { // Image pixel -> Display pixel
+ EPD_compensate, // B -> W, W -> B (Current Image)
+ EPD_white, // B -> N, W -> W (Current Image)
+ EPD_inverse, // B -> N, W -> B (New Image)
+ EPD_normal // B -> B, W -> W (New Image)
+} EPD_stage;
+
+typedef void EPD_reader(void *buffer, uint32_t address, uint16_t length);
+
+class EPD_Class
+{
+ public:
+ uint16_t lines_per_display;
+
+ private:
+
+ DigitalOut EPD_Pin_EPD_CS;
+ DigitalOut EPD_Pin_PANEL_ON;
+ DigitalOut EPD_Pin_BORDER;
+ DigitalOut EPD_Pin_DISCHARGE;
+ PwmOut EPD_Pin_PWM;
+ DigitalOut EPD_Pin_RESET;
+ DigitalIn EPD_Pin_BUSY;
+
+ EPD_size size;
+ uint16_t stage_time;
+
+ uint16_t factored_stage_time;
+ uint16_t dots_per_line;
+ uint16_t bytes_per_line;
+ uint16_t bytes_per_scan;
+ const uint8_t *gate_source;
+ uint16_t gate_source_length;
+ const uint8_t *channel_select;
+ uint16_t channel_select_length;
+
+ bool filler;
+
+ public:
+ unsigned char lineDta[33];
+
+ public:
+ EPD_Class(PinName Pin_EPD_CS, PinName Pin_PANEL_ON, PinName Pin_BORDER, PinName Pin_DISCHARGE, PinName Pin_PWM, PinName Pin_RESET, PinName Pin_BUSY);
+ // power up and power down the EPD panel
+ void begin(EPD_size sz);
+ void start();
+ void end();
+
+ void setFactor(int temperature = 25) {
+ this->factored_stage_time = this->stage_time * this->temperature_to_factor_10x(temperature) / 10;
+ }
+
+ // clear display (anything -> white)
+ void clear(int from_line = 0, int to_line = -1)
+ {
+ if(to_line == -1){
+ to_line = this->lines_per_display;
+ }
+ this->frame_fixed_repeat(0xff, EPD_compensate, from_line, to_line);
+ this->frame_fixed_repeat(0xff, EPD_white, from_line, to_line);
+ this->frame_fixed_repeat(0xaa, EPD_inverse, from_line, to_line);
+ this->frame_fixed_repeat(0xaa, EPD_normal, from_line, to_line);
+ }
+
+ // assuming a clear (white) screen output an image (PROGMEM data)
+ void image(const uint8_t *image, int from_line = 0, int to_line = -1)
+ {
+ if(to_line == -1){
+ to_line = this->lines_per_display;
+ }
+ this->frame_fixed_repeat(0xaa, EPD_compensate, from_line, to_line);
+ this->frame_fixed_repeat(0xaa, EPD_white, from_line, to_line);
+ this->frame_data_repeat(image, EPD_inverse, from_line, to_line);
+ this->frame_data_repeat(image, EPD_normal, from_line, to_line);
+ }
+
+#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__)
+ void image_sd()
+ {
+ this->frame_fixed_repeat(0xaa, EPD_compensate);
+ this->frame_fixed_repeat(0xaa, EPD_white);
+ this->frame_data_repeat_sd(EPD_inverse);
+ this->frame_data_repeat_sd(EPD_normal);
+ }
+#endif
+ // change from old image to new image (PROGMEM data)
+ /*
+ void image(const uint8_t *old_image, const uint8_t *new_image)
+ {
+ this->frame_data_repeat(old_image, EPD_compensate);
+ this->frame_data_repeat(old_image, EPD_white);
+ this->frame_data_repeat(new_image, EPD_inverse);
+ this->frame_data_repeat(new_image, EPD_normal);
+ }
+ */
+
+
+ // Low level API calls
+ // ===================
+
+ // single frame refresh
+ void frame_fixed(uint8_t fixed_value, EPD_stage stage, int from_line, int to_line);
+ void frame_data(const uint8_t *new_image, EPD_stage stage, int from_line, int to_line);
+#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__)
+ void frame_data_sd(EPD_stage stage);
+#endif
+
+#if defined(EPD_ENABLE_EXTRA_SRAM)
+ void frame_sram(const uint8_t *new_image, EPD_stage stage);
+#endif
+ void frame_cb(uint32_t address, EPD_reader *reader, EPD_stage stage);
+
+ // stage_time frame refresh
+ void frame_fixed_repeat(uint8_t fixed_value, EPD_stage stage, int from_line, int to_line);
+ void frame_data_repeat(const uint8_t *new_image, EPD_stage stage, int from_line, int to_line);
+#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__)
+ void frame_data_repeat_sd(EPD_stage stage);
+#endif
+
+#if defined(EPD_ENABLE_EXTRA_SRAM)
+ void frame_sram_repeat(const uint8_t *new_image, EPD_stage stage);
+#endif
+ void frame_cb_repeat(uint32_t address, EPD_reader *reader, EPD_stage stage);
+
+ // convert temperature to compensation factor
+ int temperature_to_factor_10x(int temperature);
+
+ // single line display - very low-level
+ // also has to handle AVR progmem
+ void line(uint16_t line, const uint8_t *data, uint8_t fixed_value, bool read_progmem, EPD_stage stage);
+#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__)
+ void line_sd(uint16_t line, const uint8_t *data, uint8_t fixed_value, bool read_progmem, EPD_stage stage);
+#endif
+};
+
+extern EPD_Class EPD;
+
+#endif