Files
EPaperDrive/src/EPaperDrive.cpp
2022-02-02 21:38:58 +08:00

2620 lines
75 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "EPaperDrive.h"
//#include "EPD_drive_gpio.h"
uint8_t UNICODEbuffer[200];
String fontname;
EPaperDrive::EPaperDrive(bool SPIMode, uint8_t CS, uint8_t RST, uint8_t DC, uint8_t BUSY, uint8_t CLK, uint8_t DIN)
{
_CS = CS;
_RST = RST;
_DC = DC;
_BUSY = BUSY;
_CLK = CLK;
_DIN = DIN;
_SPIMode = SPIMode;
if (SPIMode == 0)
{
pinMode(CS, OUTPUT); // io初始化
pinMode(DC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(BUSY, INPUT);
pinMode(CLK, OUTPUT);
pinMode(DIN, OUTPUT);
}
else
{
pinMode(CS, OUTPUT);
pinMode(DC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(BUSY, INPUT);
}
}
EPaperDrive::~EPaperDrive()
{
}
void EPaperDrive::driver_delay_xms(unsigned long xms)
{
delay(xms);
}
void EPaperDrive::SetFS(fs::FS* FSType)
{
UserFS = FSType;
}
void EPaperDrive::SetHardSPI(SPIClass *spi)
{
MySPI = spi;
}
void EPaperDrive::SPI_Write(uint8_t value)
{
if (_SPIMode == 1)
{
MySPI->transfer(value);
}
else
{
EPD_CLK_0;
// delayMicroseconds(1);
for (int i = 0; i < 8; i++)
{
//高位在前发送方式 根据升级器件特性定
if ((value & 0x80) == 0x80)
EPD_DIN_1;
else
EPD_DIN_0;
// delayMicroseconds(1); //等待数据稳定 根据实际时钟调整
EPD_CLK_1; //上升沿发送数据
// delayMicroseconds(1);//CLK高电平保持一段时间 这个可以不需要 根据具体的spi时钟来确定
EPD_CLK_0; //把时钟拉低实现为下一次上升沿发送数据做准备
value = value << 1; //发送数据的位向前移动一位
}
}
}
void EPaperDrive::SetFont(FONT fontindex)
{
FontIndex = fontindex;
switch (fontindex)
{
case 0:
fontname = "/font16";
fontwidth = 16;
fontheight = 16;
break;
case 1:
fontname = "/font32";
fontwidth = 32;
fontheight = 32;
break;
case 2:
fontname = "/font10";
fontwidth = 10;
fontheight = 10;
break;
case 3:
fontname = "/font12";
fontwidth = 12;
fontheight = 12;
break;
case 5:
fontname = "/font70";
fontwidth = 70;
fontheight = 70;
break;
case 6:
fontname = "/font12num";
fontwidth = 12;
fontheight = 12;
break;
case 7:
fontname = "/font24";
fontwidth = 24;
fontheight = 24;
break;
case 8:
fontname = "/font8";
fontwidth = 8;
fontheight = 8;
break;
case 9:
fontname = "/font100num";
fontwidth = 100;
fontheight = 100;
break;
case 11:
fontname = "/weathericon";
fontwidth = 32;
fontheight = 32;
break;
case 12:
fontname = "/weathericon80";
fontwidth = 80;
fontheight = 80;
break;
case 13:
fontname = "/weathericon32";
fontwidth = 32;
fontheight = 32;
break;
case 14:
fontname = "/weathericon50";
fontwidth = 50;
fontheight = 50;
break;
}
}
void EPaperDrive::DrawCircle(int x, int y, int r, bool fill)
{
if (fill == 0)
{
for (int i = 0; i < 360; i++)
{
SetPixel(round(cos(i) * r + x), round(sin(i) * r) + y);
}
}
else
{
for (int j = 0; j < r; j++)
{
for (int i = 0; i < 360; i++)
{
SetPixel(round(cos(i) * j + x), round(sin(i) * j) + y);
}
}
}
}
void EPaperDrive::DrawBox(uint8_t x, int y, int w, int h)
{
for (int i = x; i < x + h; i++)
{
DrawXline(y, y + w - 1, i);
}
}
void EPaperDrive::DrawEmptyBox(int x, int y, int w, int h)
{
DrawXline(y, y + w, x);
DrawXline(y, y + w, x + h);
DrawYline(x, x + w, y);
DrawYline(x, x + w, y + w);
}
void EPaperDrive::DrawChart(int x, int y, int w, int c1, int c2, int c3, int c4, int c5, int c6)
{
int percent, sum, max_c = 0;
sum = c1 + c2 + c3 + c4 + c5 + c6;
if (sum == 0)
sum = 1;
max_c = max(c1, max_c);
max_c = max(c2, max_c);
max_c = max(c3, max_c);
max_c = max(c4, max_c);
max_c = max(c5, max_c);
max_c = max(c6, max_c);
if (max_c == 0)
max_c = 1;
w = w * sum / (2 * max_c);
SetFont(FONT12);
DrawUTF(x, y, ">0.3um");
percent = w * c1 / sum;
DrawBox(x + 1, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 2, y + 41 + percent, String(c1));
SetFont(FONT12);
DrawUTF(x + 12, y, ">0.5um");
percent = w * c2 / sum;
DrawBox(x + 13, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 14, y + 41 + percent, String(c2));
SetFont(FONT12);
DrawUTF(x + 24, y, ">1.0um");
percent = w * c3 / sum;
DrawBox(x + 25, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 26, y + 41 + percent, String(c3));
SetFont(FONT12);
DrawUTF(x + 36, y, ">2.5um");
percent = w * c4 / sum;
DrawBox(x + 37, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 38, y + 41 + percent, String(c4));
SetFont(FONT12);
DrawUTF(x + 48, y, ">5.0um");
percent = w * c5 / sum;
DrawBox(x + 49, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 50, y + 41 + percent, String(c5));
SetFont(FONT12);
DrawUTF(x + 60, y, ">10um");
percent = w * c6 / sum;
DrawBox(x + 61, y + 41, percent, 10);
SetFont(FONT8);
DrawUTF(x + 62, y + 41 + percent, String(c6));
}
void EPaperDrive::DrawCircleChart(int x, int y, int r, int w, int c1, int c2, int c3)
{
int sum = c1 + c2 + c3;
if (sum == 0)
sum = 1;
for (int i = 0; i < 360; i++)
{
SetPixel(-round(cos(M_PI * i / 180) * r) + x, round(sin(M_PI * i / 180) * r) + y);
}
for (int i = 0; i < 360; i++)
{
SetPixel(-round(cos(M_PI * i / 180) * (r - w)) + x, round(sin(M_PI * i / 180) * (r - w)) + y);
}
for (int i = 0; i < c1 * 360 / sum; i++)
{
for (int j = 0; j < w; j++)
{
SetPixel(-round(cos(M_PI * i / 180) * (r - j)) + x, round(sin(M_PI * i / 180) * (r - j)) + y);
}
}
for (int i = (c1 + c2) * 360 / sum - 1; i < (c1 + c2) * 360 / sum; i++)
{
for (int j = 0; j < w; j++)
{
SetPixel(-round(cos(M_PI * i / 180) * (r - j)) + x, round(sin(M_PI * i / 180) * (r - j)) + y);
}
}
for (int i = (c1 + c2) * 360 / sum; i < 360; i += 10)
{
for (int j = 0; j < w; j++)
{
SetPixel(-round(cos(M_PI * i / 180) * (r - j)) + x, round(sin(M_PI * i / 180) * (r - j)) + y);
}
}
y += 2;
DrawBox(x - r, y + r + 2, 8, 8);
SetFont(FONT12);
DrawUTF(x - r - 2, y + r + 12, "PM1.0");
SetFont(FONT12);
DrawUTF(x - r - 2, y + r + 12 + 30, String(c1));
SetFont(FONT12);
DrawEmptyBox(x - r + 14, y + r + 2, 8, 8);
DrawUTF(x - r + 12, y + r + 12, "PM2.5");
SetFont(FONT12);
DrawUTF(x - r + 12, y + r + 12 + 30, String(c2));
DrawEmptyBox(x - r + 28, y + r + 2, 8, 8);
for (int i = y + r + 2; i < y + r + 2 + 8; i += 2)
{
DrawYline(x - r + 28, x - r + 28 + 7, i);
}
SetFont(FONT12);
DrawUTF(x - r + 26, y + r + 12, "PM10");
SetFont(FONT12);
DrawUTF(x - r + 26, y + r + 12 + 30, String(c3));
}
int EPaperDrive::getIcon(int weathercodeindex)
{
if (weathercodeindex == 0)
return 12;
if (weathercodeindex == 1)
return 58;
if (weathercodeindex == 2)
return 58;
if (weathercodeindex == 3)
return 58;
if (weathercodeindex == 4)
return 54;
if (weathercodeindex >= 5 && weathercodeindex <= 18)
return 0;
if (weathercodeindex >= 19 && weathercodeindex <= 32)
return 19;
if (weathercodeindex >= 33 && weathercodeindex <= 36)
return 16;
if (weathercodeindex >= 37 && weathercodeindex <= 40)
return 16;
if (weathercodeindex == 41)
return 37;
if (weathercodeindex == 42)
return 37;
if (weathercodeindex == 43)
return 37;
return 17;
}
void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int point_n, int show_n, String tmax, String tmin, String code_d, String code_n, String text_d, String text_n, String date, String week) //绘制天气温度变化曲线
{
if (tmax == ",,,,,")
{
tmax = "5,5,5,5,5,5";
tmin = "2,2,2,2,2,2";
code_d = "0,0,0,0,0,0";
code_n = "0,0,0,0,0,0";
text_n = "晴,晴,晴,晴,晴,晴";
text_d = "晴,晴,晴,晴,晴,晴";
date = "1-1,1-2,1-3,1-4,1-5,1-6";
week = "1,1,1,1,1,1";
}
String code_d_a[point_n], code_n_a[point_n], text_d_a[point_n], text_n_a[point_n], date_a[point_n], week_a[point_n];
int tmax_a[point_n], tmin_a[point_n];
int min_data = 999, max_data = -999;
int tmin_x_cord[point_n], tmax_x_cord[point_n]; //将数值转成屏幕坐标
String temp_min[point_n];
String temp_max[point_n];
int j = 0, k = 0, l = 0;
//分割tmax和tmin
// Serial.println(tmax); Serial.println(tmin);
// Serial.println(code_d);
for (int i = 0; i < tmin.length(); i++)
{
temp_min[j] += tmin[i];
if (tmin.charAt(i) == char(','))
j++;
}
for (int i = 0; i < tmax.length(); i++)
{
temp_max[k] += tmax[i];
if (tmax.charAt(i) == char(','))
k++;
}
j = 0;
//分割code_d
for (int i = 0; i < code_d.length(); i++)
{
code_d_a[j] += code_d[i];
if (code_d.charAt(i) == char(','))
j++;
}
//分割code_n
j = 0;
for (int i = 0; i < code_n.length(); i++)
{
code_n_a[j] += code_n[i];
if (code_n.charAt(i) == char(','))
j++;
}
//分割text_d
j = 0;
for (int i = 0; i < text_d.length(); i++)
{
if (text_d.charAt(i) == char(','))
j++;
else
text_d_a[j] += text_d[i];
}
//分割text_n
j = 0;
for (int i = 0; i < text_n.length(); i++)
{
if (text_n.charAt(i) == char(','))
j++;
else
text_n_a[j] += text_n[i];
}
//分割week_n
j = 0;
for (int i = 0; i < week.length(); i++)
{
if (week.charAt(i) == char(','))
j++;
else
week_a[j] += week[i];
}
j = 0;
for (int i = 0; i < date.length(); i++)
{
if (date.charAt(i) == char(','))
j++;
else
date_a[j] += date[i];
}
for (int i = 0; i < point_n; i++)
{
tmax_a[i] = temp_max[i].toInt(); // Serial.printf("max:%d\n",tmax_a[i]);
tmin_a[i] = temp_min[i].toInt(); // Serial.printf("min:%d\n",tmin_a[i]);
}
//找出计算最大最小值
for (int i = 0; i < show_n; i++)
{
if (tmax_a[i] > max_data)
max_data = tmax_a[i];
if (tmax_a[i] < min_data)
min_data = tmax_a[i];
if (tmin_a[i] > max_data)
max_data = tmin_a[i];
if (tmin_a[i] < min_data)
min_data = tmin_a[i];
}
//转换坐标
if ((max_data - min_data) != 0)
{
for (int i = 0; i < show_n; i++)
{
tmin_x_cord[i] = xmax - ((xmax - xmin) * (tmin_a[i] - min_data) / (max_data - min_data));
tmax_x_cord[i] = xmax - ((xmax - xmin) * (tmax_a[i] - min_data) / (max_data - min_data));
}
}
int dy = (ymax - ymin) / (show_n - 1);
/*
Spline line;
float x[point_n];float y[point_n];
for(int i=0;i<point_n;i++)
{
y[i]=*data;x[i]=ymin+dy*i;
data++;
}
data=o;
line.setPoints(x,y,point_n);
line.setDegree(11);
for(int i=ymin;i<ymax;i++)
{
SetPixel(line.value(i),i);
}
*/
//画折线
for (int i = 0; i < show_n - 1; i++)
{
DrawLine(tmin_x_cord[i], ymin + dy * i, tmin_x_cord[i + 1], ymin + dy * (i + 1));
DrawLine(tmax_x_cord[i], ymin + dy * i, tmax_x_cord[i + 1], ymin + dy * (i + 1));
// DrawLine(tmin_x_cord[i]-1,ymin+dy*i,tmin_x_cord[i+1]-1,ymin+dy*(i+1));
// DrawLine(tmax_x_cord[i]-1,ymin+dy*i,tmax_x_cord[i+1]-1,ymin+dy*(i+1));
}
//画圆圈,添加标注
for (int i = 0; i < show_n; i++)
{
DrawCircle(tmin_x_cord[i], ymin + dy * i, 3, 1);
DrawCircle(tmax_x_cord[i], ymin + dy * i, 3, 1);
SetFont(FONT12);
fontscale = 1;
DrawUTF(tmax_x_cord[i] - 14, ymin + dy * i - 3 * (String(tmax_a[i]).length() + 1), String(tmax_a[i]) + "°");
DrawUTF(tmin_x_cord[i] + 2, ymin + dy * i - 3 * (String(tmax_a[i]).length() + 1), String(tmin_a[i]) + "°");
if (EPD_Type != WF32)
{
SetFont(ICON32);
DrawUTF(xmin - 44, ymin + dy * i - 16, String(char(getIcon(code_d_a[i].toInt()))));
SetFont(FONT12);
DrawUTF(xmin - 56, ymin + dy * i - 2 * text_d_a[i].length(), text_d_a[i]);
DrawUTF(xmin - 82, ymin + dy * i - 2 * week_a[i].length(), week_a[i]);
SetFont(ICON32);
DrawUTF(xmax + 14, ymin + dy * i - 16, String(char(getIcon(code_n_a[i].toInt()))));
SetFont(FONT12);
DrawUTF(xmax + 46, ymin + dy * i - 2 * text_n_a[i].length(), text_n_a[i]);
}
else
{
// SetFont(ICON32);DrawUTF(xmin-35,ymin+dy*i-16,String(char(getIcon(code_d_a[i].toInt()))));
SetFont(FONT12);
DrawUTF(xmax + 14, ymin + dy * i - 2 * text_d_a[i].length(), text_d_a[i]);
SetFont(ICON32);
DrawUTF(xmax + 26, ymin + dy * i - 16, String(char(getIcon(code_d_a[i].toInt()))));
SetFont(FONT12);
DrawUTF(xmin - 28, ymin + dy * i - 2 * week_a[i].length(), week_a[i]);
}
// Serial.print("code_d:");
// Serial.println(code_d_a[i]);
// Serial.print("txt_n:");
// Serial.println(text_n_a[i]);
}
if (EPD_Type != WF32)
Inverse(xmin - 83, xmin - 69, 0, 400);
}
void EPaperDrive::DrawXline(int start, int end, int x)
{
for (int i = start; i <= end; i++)
{
SetPixel(x, i);
}
}
void EPaperDrive::DrawYline(int start, int end, int y)
{
for (int i = start; i <= end; i++)
{
SetPixel(i, y);
}
}
void EPaperDrive::DrawLine(int xstart, int ystart, int xend, int yend)
{
int dx = abs(xend - xstart);
int dy = abs(yend - ystart);
if (dx >= dy)
{
if (xend > xstart)
{
for (int i = xstart; i <= xend; i++)
{
SetPixel(i, round((i - xstart) * (yend - ystart) / (xend - xstart)) + ystart);
}
}
else
{
for (int i = xstart; i >= xend; i--)
{
SetPixel(i, round((i - xstart) * (yend - ystart) / (xend - xstart)) + ystart);
}
}
}
else
{
if (yend > ystart)
{
for (int i = ystart; i <= yend; i++)
{
SetPixel(round((i - ystart) * (xend - xstart) / (yend - ystart)) + xstart, i);
}
}
else
{
for (int i = ystart; i >= yend; i--)
{
SetPixel(round((i - ystart) * (xend - xstart) / (yend - ystart)) + xstart, i);
}
}
}
}
void EPaperDrive::Inverse(int xStart, int xEnd, int yStart, int yEnd)
{
for (int i = 0; i < (xEnd - xStart); i++)
{
for (int j = 0; j < (yEnd - yStart); j++)
{
InversePixel(xStart + i, yStart + j);
}
}
}
void EPaperDrive::DrawUTF(int16_t x, int16_t y, String code)
{
char buffer[200];
code.toCharArray(buffer, 200);
DrawUTF(x, y, fontwidth, fontheight, (uint8_t *)buffer);
}
void EPaperDrive::DrawUTF(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t *code)
{
int charcount;
charcount = UTFtoUNICODE((uint8_t *)code);
DrawUnicodeStr(x, y, width, height, charcount, (uint8_t *)UNICODEbuffer);
}
int EPaperDrive::UTFtoUNICODE(uint8_t *code)
{
int i = 0;
int charcount = 0;
while (code[i] != '\0')
{
// Serial.println("current codei");
// Serial.println(code[i],HEX);
// Serial.println(code[i]&0xf0,HEX);
if (code[i] <= 0x7f) // ascii
{
UNICODEbuffer[charcount * 2] = 0x00;
UNICODEbuffer[charcount * 2 + 1] = code[i];
// Serial.println("english or number");
// Serial.println(UNICODEbuffer[charcount*2],HEX);
// Serial.println(UNICODEbuffer[charcount*2+1],HEX);
i++;
charcount++;
}
else if ((code[i] & 0xe0) == 0xc0)
{
UNICODEbuffer[charcount * 2 + 1] = (code[i] << 6) + (code[i + 1] & 0x3f);
UNICODEbuffer[charcount * 2] = (code[i] >> 2) & 0x07;
i += 2;
charcount++;
// Serial.println("two bits utf-8");
}
else if ((code[i] & 0xf0) == 0xe0)
{
UNICODEbuffer[charcount * 2 + 1] = (code[i + 1] << 6) + (code[i + 2] & 0x7f);
UNICODEbuffer[charcount * 2] = (code[i] << 4) + ((code[i + 1] >> 2) & 0x0f);
// Serial.println("three bits utf-8");
// Serial.println(UNICODEbuffer[charcount*2],HEX);
// Serial.println(UNICODEbuffer[charcount*2+1],HEX);
i += 3;
charcount++;
}
else
{
return 0;
}
}
UNICODEbuffer[charcount * 2] = '\0';
return charcount;
}
void EPaperDrive::DrawUnicodeChar(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t *code)
{
int offset;
int sizeofsinglechar;
if (height % 8 == 0)
sizeofsinglechar = (height / 8) * width;
else
sizeofsinglechar = (height / 8 + 1) * width;
offset = (code[0] * 0x100 + code[1]) * sizeofsinglechar;
// Serial.println("code[1]");
// Serial.println(code[1]);
// Serial.println("sizeofsinglechar");
// Serial.println(sizeofsinglechar);
// File f = UserFS->open(fontname, "r");
File f = UserFS->open(fontname, "r");
f.seek(offset, SeekSet);
char zi[sizeofsinglechar];
f.readBytes(zi, sizeofsinglechar);
/*for(int i=0;i<32;i++)
{
Serial.println(zi[i],HEX);
}*/
// Serial.println("offset");
// Serial.println(offset);
if (offset < 0xff * sizeofsinglechar && FontIndex < 10)
{
drawXbm(x, y, width, height, (uint8_t *)zi);
}
else
{
drawXbm(x, y, width, height, (uint8_t *)zi);
}
// SPIFFS.end();
}
void EPaperDrive::DrawUnicodeStr(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t strlength, uint8_t *code)
{
int ymax = yDot;
if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == WF42 || EPD_Type == GDEY042Z98)
{
ymax = xDot;
}
CurrentCursor = 0;
uint8_t sizeofsinglechar;
if (height % 8 == 0)
sizeofsinglechar = (height / 8) * width;
else
sizeofsinglechar = (height / 8 + 1) * width;
int ymove = 0;
int xmove = 0;
strlength *= 2;
int i = 0;
while (i < strlength)
{
int offset;
offset = (code[i] * 0x100 + code[i + 1]) * sizeofsinglechar;
if (offset < 0xff * sizeofsinglechar && fontscale == 1)
{
DrawUnicodeChar(x + xmove, y + ymove, width, height, (uint8_t *)code + i);
ymove += CurrentCursor + 1;
if ((y + ymove + width / 2) >= ymax - 1)
{
xmove += height + 1;
ymove = 0;
CurrentCursor = 0;
}
}
else if (offset < 0xff * sizeofsinglechar && fontscale == 2)
{
DrawUnicodeChar(x + xmove, y + ymove, width, height, (uint8_t *)code + i);
ymove += CurrentCursor + 2;
if ((y + ymove + width) >= ymax - 1)
{
xmove += height + 1;
ymove = 0;
CurrentCursor = 0;
}
}
else if (fontscale == 2)
{
DrawUnicodeChar(x + xmove, y + ymove, width, height, (uint8_t *)code + i);
ymove += width * 2;
if ((y + ymove + width * 2) >= ymax - 1)
{
xmove += height * 2 + 2;
ymove = 0;
CurrentCursor = 0;
}
}
else
{
DrawUnicodeChar(x + xmove, y + ymove, width, height, (uint8_t *)code + i);
ymove += width;
if ((y + ymove + width) >= ymax - 1)
{
xmove += height + 1;
ymove = 0;
CurrentCursor = 0;
}
}
i++;
i++;
}
}
void EPaperDrive::drawXbm(int16_t xMove, int16_t yMove, int16_t width, int16_t height, uint8_t *xbm)
{
int16_t heightInXbm = (height + 7) / 8;
uint8_t Data;
for (int16_t x = 0; x < width; x++)
{
for (int16_t y = 0; y < height; y++)
{
if (y & 7)
{
Data <<= 1; // Move a bit
}
else
{ // Read new Data every 8 bit
Data = xbm[(y / 8) + x * heightInXbm];
}
// if there is a bit draw it
if (((Data & 0x80) >> 7))
{
if (fontscale == 1)
{
SetPixel(xMove + y, yMove + x);
CurrentCursor = x;
}
if (fontscale == 2)
{
SetPixel(xMove + y * 2, yMove + x * 2);
SetPixel(xMove + y * 2 + 1, yMove + x * 2);
SetPixel(xMove + y * 2, yMove + x * 2 + 1);
SetPixel(xMove + y * 2 + 1, yMove + x * 2 + 1);
CurrentCursor = x * 2;
}
// if(fontscale==2) {SetPixel(xMove + y*2, yMove + x*2);CurrentCursor=x*2;}
}
}
}
}
void EPaperDrive::DrawXbm_P(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm)
{
int16_t heightInXbm = (height + 7) / 8;
uint8_t Data;
// uint8_t temp[heightInXbm*width];
// memcpy_P(temp, xbm, heightInXbm*width);
for (int16_t x = 0; x < width; x++)
{
for (int16_t y = 0; y < height; y++)
{
if (y & 7)
{
Data <<= 1; // Move a bit
}
else
{ // Read new Data every 8 bit
Data = pgm_read_byte(xbm + (y / 8) + x * heightInXbm);
}
// if there is a bit draw it
if (((Data & 0x80) >> 7))
{
if (fontscale == 1)
{
SetPixel(xMove + y, yMove + x);
CurrentCursor = x;
}
if (fontscale == 2)
{
SetPixel(xMove + y * 2, yMove + x * 2);
SetPixel(xMove + y * 2 + 1, yMove + x * 2);
SetPixel(xMove + y * 2, yMove + x * 2 + 1);
SetPixel(xMove + y * 2 + 1, yMove + x * 2 + 1);
}
}
}
}
}
void EPaperDrive::DrawXbm_p_gray(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm, uint8_t level)
{
int16_t heightInXbm = (height + 1) / 2;
uint8_t Data;
for (int16_t x = 0; x < width; x++)
{
for (int16_t y = 0; y < height; y++)
{
if (y % 2 != 0)
{
Data <<= 4; // Move a bit
}
else
{ // Read new Data every 8 bit
Data = pgm_read_byte(xbm + (y / 2) + x * heightInXbm);
}
// if there is a bit draw it
if (((Data & 0xf0) >> 4 == level))
{
SetPixel(xMove + y, yMove + x);
CurrentCursor = x;
}
}
}
}
void EPaperDrive::DrawXbm_spiff_gray(int16_t xMove, int16_t yMove, int16_t width, int16_t height, uint8_t level)
{
// File f = UserFS->open("/pic.xbm", "r");
File f = UserFS->open("/pic.xbm", "r");
int16_t heightInXbm = (height + 1) / 2;
uint8_t Data;
for (int16_t x = 0; x < width; x++)
{
for (int16_t y = 0; y < height; y++)
{
if (y % 2 != 0)
{
Data <<= 4; // Move a bit
}
else
{ // Read new Data every 8 bit
Data = ~f.read();
}
// if there is a bit draw it
if (((Data & 0xf0) >> 4 == level))
{
SetPixel(xMove + y, yMove + x);
CurrentCursor = x;
}
}
}
f.close();
}
void EPaperDrive::SetPixel(int16_t x, int16_t y)
{
if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == WF42 || EPD_Type == GDEY042Z98)
{
int16_t temp = x;
x = y;
y = yDot - 1 - temp;
if (x < xDot && y < yDot)
EPDbuffer[x / 8 + y * xDot / 8] &= ~(0x80 >> x % 8);
}
else if (EPD_Type == WF29BZ03)
{
if (frame == 0)
{
if (x < (xDot * 2) && y < (yDot * 2))
EPDbuffer[x / 4 + y * xDot / 4] &= ~(0x80 >> ((x % 4) * 2));
}
else
{
if (x < (xDot * 2) && y < (yDot * 2))
EPDbuffer[x / 4 + y * xDot / 4] &= ~(0x40 >> ((x % 4) * 2));
}
}
else
{
if (x < xDot && y < yDot)
EPDbuffer[x / 8 + y * xDot / 8] &= ~(0x80 >> x % 8);
}
}
void EPaperDrive::InversePixel(int16_t x, int16_t y)
{
if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == WF42 || EPD_Type == GDEY042Z98)
{
int16_t temp = x;
x = y;
y = yDot - 1 - temp;
if (x < xDot && y < yDot)
EPDbuffer[x / 8 + y * xDot / 8] ^= (0x80 >> x % 8);
}
else if (EPD_Type == WF29BZ03)
{
if (frame == 0)
{
if (x < (xDot * 2) && y < (yDot * 2))
EPDbuffer[x / 4 + y * xDot / 4] ^= (0x80 >> ((x % 4) * 2));
}
else
{
if (x < (xDot * 2) && y < (yDot * 2))
EPDbuffer[x / 4 + y * xDot / 4] ^= (0x40 >> ((x % 4) * 2));
}
}
else
{
if (x < xDot && y < yDot)
EPDbuffer[x / 8 + y * xDot / 8] ^= (0x80 >> x % 8);
// Serial.printf("(%d,%d)\n",x,y);
}
}
void EPaperDrive::clearbuffer()
{
if (EPD_Type == WF29BZ03)
{
for (int i = 0; i < (xDot * yDot / 4); i++)
EPDbuffer[i] = 0xff;
}
else
for (int i = 0; i < (xDot * yDot / 8); i++)
EPDbuffer[i] = 0xff;
}
void EPaperDrive::EPD_Set_Model(uint8_t model)
{
EPD_Type = epd_type(model);
switch (model)
{
case 0:
xDot = 128;
yDot = 296;
break; // WX29
case 1:
xDot = 128;
yDot = 296;
break; // WF29
case 2:
xDot = 400;
yDot = 300;
break; // OPM4_2
case 3:
xDot = 648;
yDot = 480;
break; // WF58
case 4:
xDot = 128;
yDot = 296;
break; // WF29BZ03
case 5:
xDot = 152;
yDot = 152;
break; // C154
case 6:
xDot = 400;
yDot = 300;
break; // DKE42_3COLOR
case 7:
xDot = 128;
yDot = 296;
break; // DKE29_3COLOR
case 8:
xDot = 400;
yDot = 300;
break; // WF42
case 9:
break; // WF32
case 10:
xDot = 128;
yDot = 296;
break; // WFT0290CZ10
case 11:
xDot = 400;
yDot = 300;
break; // GDEY042Z98
case 12:
xDot = 152;
yDot = 296;
break;
}
}
bool EPaperDrive::ReadBusy(void)
{
unsigned long i = 0;
for (i = 0; i < 100; i++)
{
// println("isEPD_BUSY = %d\r\n",isEPD_CS);
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
if (READ_EPD_BUSY == 0)
{
// Serial.println("Busy is Low \r\n");
return 1;
}
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (READ_EPD_BUSY != 0)
{
// Serial.println("Busy is H \r\n");
return 1;
}
}
delay(2);
// Serial.println("epd is Busy");
}
return 0;
}
bool EPaperDrive::ReadBusy_long(void)
{
unsigned long i = 0;
for (i = 0; i < 2000; i++)
{
// println("isEPD_BUSY = %d\r\n",isEPD_CS);
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
if (READ_EPD_BUSY == 0)
{
// Serial.println("Busy is Low \r\n");
return 1;
}
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (READ_EPD_BUSY != 0)
{
// Serial.println("Busy is H \r\n");
return 1;
}
}
delay(2);
// Serial.println("epd is Busy");
}
return 0;
}
void EPaperDrive::EPD_WriteCMD(uint8_t command)
{
/*if(EPD_Type==WX29||EPD_Type==OPM42||EPD_Type==DKE42_3COLOR||EPD_Type==DKE29_3COLOR)
{
ReadBusy();
} */
// ReadBusy();
EPD_CS_0;
EPD_DC_0; // command write
SPI_Write(command);
EPD_CS_1;
}
void EPaperDrive::EPD_WriteData(uint8_t Data)
{
EPD_CS_0;
EPD_DC_1;
SPI_Write(Data);
EPD_CS_1;
}
void EPaperDrive::EPD_WriteCMD_p1(uint8_t command, uint8_t para)
{
/*if(EPD_Type==WX29||EPD_Type==OPM42||EPD_Type==DKE42_3COLOR||EPD_Type==DKE29_3COLOR)
{
ReadBusy();
}*/
// ReadBusy();
EPD_CS_0;
EPD_DC_0; // command write
SPI_Write(command);
EPD_DC_1; // command write
SPI_Write(para);
EPD_CS_1;
}
void EPaperDrive::deepsleep(void)
{
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
ReadBusy_long();
EPD_WriteCMD_p1(0x10, 0x01);
// EPD_WriteCMD_p1(0x22,0xc0);//power off
// EPD_WriteCMD(0x20);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
ReadBusy_long();
EPD_WriteCMD(0x50);
EPD_WriteData(0xf7); // border floating
EPD_WriteCMD(0x02); // power off
// ReadBusy();
EPD_WriteCMD(0x07); // sleep
EPD_WriteData(0xa5);
}
}
void EPaperDrive::EPD_Write(uint8_t *value, uint8_t Datalen)
{
uint8_t i = 0;
uint8_t *ptemp;
ptemp = value;
ReadBusy();
EPD_CS_0;
EPD_DC_0; // When DC is 0, write command
SPI_Write(*ptemp); // The first uint8_t is written with the command value
ptemp++;
EPD_DC_1; // When DC is 1, write Data
for (i = 0; i < Datalen - 1; i++)
{ // sub the Data
SPI_Write(*ptemp);
ptemp++;
}
ReadBusy();
EPD_CS_1;
}
void EPaperDrive::EPD_WriteDispRam(unsigned int XSize, unsigned int YSize, uint8_t *Dispbuff, unsigned int offset, uint8_t label)
{
int i = 0, j = 0;
if (EPD_Type == WF29BZ03)
{
EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
/* for(i=0;i<(YSize*2);i++){
for(j=0;j<(XSize*2);j++){
SPI_Write(*Dispbuff);
Dispbuff++;
}
} */
if (label != 1)
{
for (i = 0; i < (YSize * 2); i++)
{
for (j = 0; j < (XSize * 2); j++)
{
SPI_Write(label);
}
}
}
else
{
Dispbuff += offset;
for (i = 0; i < (YSize * 2); i++)
{
for (j = 0; j < (XSize * 2); j++)
{
SPI_Write(*Dispbuff);
Dispbuff++;
}
}
}
EPD_CS_1;
return;
}
/*if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == C154 || EPD_Type == WF42)
{
/*EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
for(i=0;i<YSize;i++){
for(j=0;j<XSize;j++){
SPI_Write(0xFF);
}
}
EPD_CS_1; */
//}
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
ReadBusy();
EPD_DC_0; // command write
EPD_CS_0;
SPI_Write(0x24);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
EPD_CS_0;
EPD_DC_0; // command write
SPI_Write(0x13);
}
EPD_DC_1; // Data write
// Serial.printf("Xsize=%dYsize=%d\r\n",XSize,YSize);
if (label != 1)
{
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(label);
}
}
}
else
{
Dispbuff += offset;
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(*Dispbuff);
Dispbuff++;
}
Dispbuff += xDot / 8 - XSize;
}
}
EPD_CS_1;
}
void EPaperDrive::EPD_WriteDispRam_RED(unsigned int XSize, unsigned int YSize, uint8_t *Dispbuff, unsigned int offset, uint8_t label)
{
int i = 0, j = 0;
if (EPD_Type == WF29BZ03)
{
EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
for (i = 0; i < (YSize * 2); i++)
{
for (j = 0; j < (XSize * 2); j++)
{
SPI_Write(*Dispbuff);
Dispbuff++;
}
}
EPD_CS_1;
return;
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42)
{
EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(0x00);
}
}
EPD_CS_1;
}
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
ReadBusy();
EPD_DC_0; // command write
EPD_CS_0;
SPI_Write(0x26);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42)
{
EPD_CS_0;
EPD_DC_0; // command write
SPI_Write(0x13);
}
EPD_DC_1; // Data write
// Serial.printf("Xsize=%dYsize=%d\r\n",XSize,YSize);
if (label != 1)
{
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(label);
}
}
}
else
{
Dispbuff += offset;
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(~*Dispbuff);
Dispbuff++;
}
Dispbuff += xDot / 8 - XSize;
}
}
EPD_CS_1;
}
void EPaperDrive::EPD_WriteDispRam_Old(unsigned int XSize, unsigned int YSize, uint8_t *Dispbuff, unsigned int offset, uint8_t label)
{
int i = 0, j = 0;
if (EPD_Type == WF29BZ03)
{
EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
for (i = 0; i < (YSize * 2); i++)
{
for (j = 0; j < (XSize * 2); j++)
{
SPI_Write(*Dispbuff);
Dispbuff++;
}
}
EPD_CS_1;
return;
}
/*if(EPD_Type==WF29||EPD_Type==WF58||EPD_Type==WF42)
{
EPD_WriteCMD(0x10);
EPD_CS_0;
EPD_DC_1;
for(i=0;i<YSize;i++){
for(j=0;j<XSize;j++){
SPI_Write(0x00);
}
}
EPD_CS_1;
}*/
else if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
ReadBusy();
EPD_DC_0; // command write
EPD_CS_0;
SPI_Write(0x26);
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
ReadBusy();
EPD_CS_0;
EPD_DC_0; // command write
SPI_Write(0x10);
}
EPD_DC_1; // Data write
// Serial.printf("Xsize=%dYsize=%d\r\n",XSize,YSize);
if (label != 1)
{
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(label);
}
}
}
else
{
Dispbuff += offset;
for (i = 0; i < YSize; i++)
{
for (j = 0; j < XSize; j++)
{
SPI_Write(*Dispbuff);
Dispbuff++;
}
Dispbuff += xDot / 8 - XSize;
}
}
ReadBusy_long();
EPD_CS_1;
}
void EPaperDrive::EPD_SetRamArea(uint16_t Xstart, uint16_t Xend,
uint8_t Ystart, uint8_t Ystart1, uint8_t Yend, uint8_t Yend1)
{
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
uint8_t RamAreaX[3]; // X start and end
uint8_t RamAreaY[5]; // Y start and end
RamAreaX[0] = 0x44; // command
RamAreaX[1] = Xstart / 8;
RamAreaX[2] = Xend / 8;
RamAreaY[0] = 0x45; // command
RamAreaY[1] = Ystart;
RamAreaY[2] = Ystart1;
RamAreaY[3] = Yend;
RamAreaY[4] = Yend1;
EPD_Write(RamAreaX, sizeof(RamAreaX));
EPD_Write(RamAreaY, sizeof(RamAreaY));
// Serial.printf("set ram area%d %d %d %d %d %d %d %d\n",RamAreaX[0],RamAreaX[1],RamAreaX[2],RamAreaY[0],RamAreaY[1],RamAreaY[2],RamAreaY[3],RamAreaY[4]);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WF29BZ03 || EPD_Type == WFT0290CZ10)
{
EPD_WriteCMD(0x91); // enter partial refresh mode
EPD_WriteCMD(0x90);
if (EPD_Type == WF42)
{
EPD_WriteData(Xstart / 256);
EPD_WriteData(Xstart % 256);
EPD_WriteData(Xend / 256);
EPD_WriteData(Xend % 256);
EPD_WriteData(Ystart);
EPD_WriteData(Ystart1);
EPD_WriteData(Yend);
EPD_WriteData(Yend1);
EPD_WriteData(0x0);
}
/*else if (EPD_Type == WFT0290CZ10)
{
EPD_WriteData(Xstart); // x-start
EPD_WriteData(Xend - 1); // x-end
EPD_WriteData(Ystart / 256);
EPD_WriteData(Ystart % 256); // y-start
EPD_WriteData(Yend / 256);
EPD_WriteData(Yend % 256 - 1); // y-end
EPD_WriteData(0x28);
}*/
else
{
EPD_WriteData(Xstart);
EPD_WriteData(Xend);
EPD_WriteData(Ystart);
EPD_WriteData(Ystart1);
EPD_WriteData(Yend);
EPD_WriteData(Yend1);
EPD_WriteData(0x0);
}
}
}
void EPaperDrive::EPD_SetRamPointer(uint16_t addrX, uint8_t addrY, uint8_t addrY1)
{
uint8_t RamPointerX[2]; // default (0,0)
uint8_t RamPointerY[3];
// Set RAM X address counter
RamPointerX[0] = 0x4e;
RamPointerX[1] = addrX;
// RamPointerX[1] = 0xff;
// Set RAM Y address counter
RamPointerY[0] = 0x4f;
RamPointerY[1] = addrY;
RamPointerY[2] = addrY1;
// RamPointerY[1] = 0x2b;
// RamPointerY[2] = 0x02;
EPD_Write(RamPointerX, sizeof(RamPointerX));
EPD_Write(RamPointerY, sizeof(RamPointerY));
// Serial.printf("0x4e: %d , 0x4f: %d %d \n",RamPointerX[1],RamPointerY[1],RamPointerY[2]);
}
void EPaperDrive::EPD_Init(void)
{
EPD_RST_0;
driver_delay_xms(10);
EPD_RST_1;
// driver_delay_xms(100);
if (EPD_Type == WX29)
{
EPD_Write(GateVol, sizeof(GateVol));
EPD_Write(GDOControl, sizeof(GDOControl)); // Pannel configuration, Gate selection
EPD_Write(softstart, sizeof(softstart)); // X decrease, Y decrease
EPD_Write(VCOMVol, sizeof(VCOMVol)); // VCOM setting
EPD_Write(DummyLine, sizeof(DummyLine)); // dummy line per gate
EPD_Write(Gatetime, sizeof(Gatetime)); // Gage time setting
EPD_Write(RamDataEntryMode, sizeof(RamDataEntryMode)); // X increase, Y decrease
EPD_WriteCMD_p1(0x22, 0xc0); // poweron
EPD_WriteCMD(0x20);
}
else if (EPD_Type == WF29BZ03)
{
EPD_WriteCMD(0x01);
EPD_WriteData(0x07);
EPD_WriteData(0x00);
EPD_WriteData(0x0B);
EPD_WriteData(0x00);
EPD_WriteCMD(0x06);
EPD_WriteData(0x07);
EPD_WriteData(0x07);
EPD_WriteData(0x07);
EPD_WriteCMD(0x04);
ReadBusy();
EPD_WriteCMD(0X00);
EPD_WriteData(0xb7); // b7
EPD_WriteCMD(0X50);
EPD_WriteData(0x37);
EPD_WriteCMD(0x30);
EPD_WriteData(0x39);
EPD_WriteCMD(0x61);
EPD_WriteData(0x80);
EPD_WriteData(0x01);
EPD_WriteData(0x28);
EPD_WriteCMD(0x82);
EPD_WriteData(0x00);
}
else if (EPD_Type == WF29)
{
EPD_WriteCMD(0x01);
EPD_WriteData(0x03);
EPD_WriteData(0x00);
EPD_WriteData(0x26); // default26 max2b
EPD_WriteData(0x26); // default26 max2b
EPD_WriteData(0x03);
EPD_WriteCMD(0x06);
EPD_WriteData(0x17);
EPD_WriteData(0x17);
EPD_WriteCMD(0x04);
//
EPD_WriteCMD(0x00);
EPD_WriteData(0xb7);
EPD_WriteCMD(0x30); // PLL
EPD_WriteData(0x3a);
EPD_WriteCMD(0x61); // resolution
EPD_WriteData(0x80);
EPD_WriteData(0x01);
EPD_WriteData(0x28);
EPD_WriteCMD(0X82);
EPD_WriteData(0x20);
EPD_WriteCMD(0X50);
EPD_WriteData(0x97);
}
else if (EPD_Type == WF42)
{
EPD_WriteCMD(0x01);
EPD_WriteData(0x03);
EPD_WriteData(0x00);
EPD_WriteData(0x2f); // default26 max2b
EPD_WriteData(0x2f); // default26 max2b
EPD_WriteData(0xff);
EPD_WriteCMD(0x06);
EPD_WriteData(0x17);
EPD_WriteData(0x17);
EPD_WriteData(0x17);
EPD_WriteCMD(0x04);
ReadBusy();
EPD_WriteCMD(0x00);
EPD_WriteData(0xb7); // b7 a7
EPD_WriteData(0x0b);
EPD_WriteCMD(0x30); // PLL
EPD_WriteData(0x3c);
// EPD_WriteCMD(0x61); //resolution
// EPD_WriteData (0x80);
// EPD_WriteData (0x01);
// EPD_WriteData (0x28);
EPD_WriteCMD(0X82);
EPD_WriteData(0x12);
EPD_WriteCMD(0X50);
EPD_WriteData(0x97);
}
else if (EPD_Type == WF58)
{
EPD_WriteCMD(0x01);
EPD_WriteData(0x37); // POWER SETTING
EPD_WriteData(0x00);
EPD_WriteCMD(0X00); // PANNEL SETTING
EPD_WriteData(0xb7);
// EPD_WriteData(0x08);
EPD_WriteCMD(0x30); // PLL setting
EPD_WriteData(0x3a); // PLL: 0-15¦:0x3C, 15+:0x3A
EPD_WriteCMD(0X82); // VCOM VOLTAGE SETTING
EPD_WriteData(0x28); // all temperature range
EPD_WriteCMD(0x06); // boost
EPD_WriteData(0xc7);
EPD_WriteData(0xcc);
EPD_WriteData(0x28);
EPD_WriteCMD(0X50); // VCOM AND Data INTERVAL SETTING
EPD_WriteData(0x77);
EPD_WriteCMD(0X60); // TCON SETTING
EPD_WriteData(0x22);
EPD_WriteCMD(0X65); // FLASH CONTROL
EPD_WriteData(0x00);
EPD_WriteCMD(0x61); // tres
EPD_WriteData(0x02); // source 600
EPD_WriteData(0x88);
EPD_WriteData(0x01); // gate 448
EPD_WriteData(0xe0);
EPD_WriteCMD(0xe5); // FLASH MODE
EPD_WriteData(0x03);
EPD_WriteCMD(0X00); // PANNEL SETTING
EPD_WriteData(0x17);
EPD_WriteCMD(0x04); // POWER ON
ReadBusy();
}
/*if(EPD_Type==99)//dke
{
ReadBusy();
EPD_WriteCMD(0x12); //SWRESET
ReadBusy();
EPD_WriteCMD(0x74);
EPD_WriteData(0x54);
EPD_WriteCMD(0x7E);
EPD_WriteData(0x3B);
EPD_WriteCMD(0x2B); // Reduce glitch under ACVCOM
EPD_WriteData(0x04);
EPD_WriteData(0x63);
EPD_WriteCMD(0x0C); // Soft start setting
EPD_WriteData(0x8B);
EPD_WriteData(0x9C);
EPD_WriteData(0x96);
EPD_WriteData(0x0F);
EPD_WriteCMD(0x01); // Set MUX as 300
EPD_WriteData(0x2B);
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteCMD(0x11); // Data entry mode
EPD_WriteData(0x01);
EPD_WriteCMD(0x44);
EPD_WriteData(0x00); // RAM x address start at 0
EPD_WriteData(0x31); // RAM x address end at 31h(49+1)*8->400
EPD_WriteCMD(0x45);
EPD_WriteData(0x2B); // RAM y address start at 12Bh
EPD_WriteData(0x01);
EPD_WriteData(0x00); // RAM y address end at 00h
EPD_WriteData(0x00);
EPD_WriteCMD(0x3C); // board
EPD_WriteData(0x01); // HIZ
EPD_WriteCMD(0x18);
EPD_WriteData(0X80);
EPD_WriteCMD(0x22);
EPD_WriteData(0XB1); //Load Temperature and waveform setting.
EPD_WriteCMD(0x20);
ReadBusy();
EPD_WriteCMD(0x4E);
EPD_WriteData(0x00);
EPD_WriteCMD(0x4F);
EPD_WriteData(0x2B);
EPD_WriteData(0x01);
}*/
else if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR)
{
EPD_WriteCMD(0x74); //
EPD_WriteData(0x54); //
EPD_WriteCMD(0x7E); //
EPD_WriteData(0x3B); //
EPD_WriteCMD(0x01); //
EPD_WriteData(0x2B); //
EPD_WriteData(0x01);
EPD_WriteData(0x00); //
EPD_WriteCMD(0x0C); //
EPD_WriteData(0x8B); //
EPD_WriteData(0x9C); //
EPD_WriteData(0xD6); //
EPD_WriteData(0x0F); //
EPD_WriteCMD(0x3A); //
EPD_WriteData(0x21); //
EPD_WriteCMD(0x3B); //
EPD_WriteData(0x06); //
EPD_WriteCMD(0x3C); //
EPD_WriteData(0x03); //
EPD_WriteCMD(0x11); // data enter mode
EPD_WriteData(0x01); // 01 Y decrement, X increment,
EPD_WriteCMD(0x2C); //
EPD_WriteData(0x00); // fff
EPD_WriteCMD(0x37); //
EPD_WriteData(0x00); //
EPD_WriteData(0x00); //
EPD_WriteData(0x00); //
EPD_WriteData(0x00); //
EPD_WriteData(0x80); //
EPD_WriteCMD(0x21); //
EPD_WriteData(0x40); //
EPD_WriteCMD(0x22);
EPD_WriteData(0xc7); // c5forgraymode//
}
else if (EPD_Type == C154)
{
EPD_WriteCMD(0x01);
EPD_WriteData(0x03);
EPD_WriteData(0x00);
EPD_WriteData(0x2b);
EPD_WriteData(0x26);
EPD_WriteData(0x03);
EPD_WriteCMD(0x06); // boost soft start
EPD_WriteData(0x17);
EPD_WriteData(0x17);
EPD_WriteData(0x17);
EPD_WriteCMD(0x04);
ReadBusy();
EPD_WriteCMD(0x00); // panel setting
EPD_WriteData(0xff); // LUT from OTP160x296
EPD_WriteData(0x0d); // VCOM to 0V fast
EPD_WriteCMD(0x61); // resolution setting
EPD_WriteData(0x98); // 152
EPD_WriteData(0x00); // 152
EPD_WriteData(0x98);
EPD_WriteCMD(0X30);
EPD_WriteData(0x29);
EPD_WriteCMD(0X50); // VCOM AND DATA INTERVAL SETTING
EPD_WriteData(0x97); // WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
ReadBusy();
}
else if (EPD_Type == DKE29_3COLOR)
{
ReadBusy();
EPD_WriteCMD(0x12); // SWRESET
ReadBusy();
EPD_WriteCMD(0x01); // Driver output control
EPD_WriteData(0x27);
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteCMD(0x11); // data entry mode
EPD_WriteData(0x01);
EPD_WriteCMD(0x44); // set Ram-X address start/end position
EPD_WriteData(0x00);
EPD_WriteData(0x0F); // 0x0F-->(15+1)*8=128
EPD_WriteCMD(0x45); // set Ram-Y address start/end position
EPD_WriteData(0x27); // 0x0127-->(295+1)=296
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteCMD(0x3C); // BorderWavefrom
EPD_WriteData(0x05);
EPD_WriteCMD(0x18); // Read built-in temperature sensor
EPD_WriteData(0x80);
EPD_WriteCMD(0x21); // Display update control
EPD_WriteData(0x00);
EPD_WriteData(0x80);
EPD_WriteCMD(0x4E); // set RAM x address count to 0;
EPD_WriteData(0x00);
EPD_WriteCMD(0x4F); // set RAM y address count to 0X199;
EPD_WriteData(0x27);
EPD_WriteData(0x01);
ReadBusy();
}
else if (EPD_Type == WFT0290CZ10)
{
driver_delay_xms(10);
EPD_WriteCMD(0x06); // boost soft start
EPD_WriteData(0x17); // A
EPD_WriteData(0x17); // B
EPD_WriteData(0x17); // C
EPD_WriteCMD(0x04); // Power on
ReadBusy();
EPD_WriteCMD(0x00); // panel setting
EPD_WriteData(0x97); // LUT from OTP£¬128x296
// EPD_WriteData(0x0d); //实测这一句话没啥用可能是兼容IC的锅
EPD_WriteCMD(0x61); // resolution setting
EPD_WriteData(0x80);
EPD_WriteData(0x01);
EPD_WriteData(0x28);
EPD_WriteCMD(0x82); // vcom_DC setting
EPD_WriteData(0x12);
EPD_WriteCMD(0X50); // VCOM AND DATA INTERVAL SETTING
EPD_WriteData(0x97);
}
else if (EPD_Type == GDEY042Z98)
{
// Serial.printf("开始全刷初始化 \n");
driver_delay_xms(10);
ReadBusy(); //读busy信号
EPD_WriteCMD(0x12); // 软件复位 soft reset
ReadBusy();
EPD_WriteCMD(0x01); // 驱动输出控制 drive output control
EPD_WriteData(0x2B); // Y 的低字节
EPD_WriteData(0x01); // Y 的高字节
EPD_WriteData(0x00);
EPD_WriteCMD(0x11); // 数据 扫描设置 对数据地址设置有影响 以及对图片取模等也有影响 data entry mode
EPD_WriteData(0x01); // X模式 x加 y 减 X-mode x+ y-
EPD_WriteCMD(0x44); // X 地址起始位 设置与扫描方式 有关
EPD_WriteData(0x00);
EPD_WriteData(0x31);
EPD_WriteCMD(0x45); // Y 地址起始位 设置与扫描方式 有关
EPD_WriteData(0x2B);
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteCMD(0x3C); // Border 设置 黑白一般设置为跟随白波形即 0x01 Border setting
EPD_WriteData(0x01);
}
else if (EPD_Type == HINKE0266A15A0)
{
driver_delay_xms(10);
ReadBusy();
EPD_WriteCMD(0x12); // 软件复位 soft reset
ReadBusy();
EPD_WriteCMD(0x01); // Driver output control
EPD_WriteData(0x27);
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteCMD(0x11); // data entry mode
EPD_WriteData(0x01);
EPD_WriteCMD(0x44); // set Ram-X address start/end position
EPD_WriteData(0x00);
EPD_WriteData(0x12); // 0x0F-->(15+1)*8=128
EPD_WriteCMD(0x45); // set Ram-Y address start/end position
EPD_WriteData(0x27); // 0x0127-->(295+1)=296
EPD_WriteData(0x01);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteCMD(0x3C); // BorderWavefrom
EPD_WriteData(0x05);
/*EPD_WriteCMD(0x18); // Read built-in temperature sensor
EPD_WriteData(0x80);*/
/*EPD_WriteCMD(0x21); // Display update control
EPD_WriteData(0x00);
EPD_WriteData(0x80);*/
EPD_WriteCMD(0x4E); // set RAM x address count to 0;
EPD_WriteData(0x00);
EPD_WriteCMD(0x4F); // set RAM y address count to 0X199;
EPD_WriteData(0x27);
EPD_WriteData(0x01);
ReadBusy();
}
}
void EPaperDrive::EPD_Set_Contrast(uint8_t vcom)
{
if (EPD_Type == OPM42)
{
EPD_WriteCMD(0x2C); //
EPD_WriteData(vcom); // fff
}
}
void EPaperDrive::EPD_Update(void)
{
if (EPD_Type == OPM42)
{
EPD_WriteCMD(0x20);
}
if (EPD_Type == DKE42_3COLOR)
{
EPD_WriteCMD(0x22); // Display Update Control
EPD_WriteData(0xC7);
EPD_WriteCMD(0x20); // Activate Display Update Sequence
}
if (EPD_Type == WX29)
{
EPD_WriteCMD_p1(0x22, 0x04);
EPD_WriteCMD(0x20);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
EPD_WriteCMD(0x12);
ReadBusy();
}
if (EPD_Type == DKE29_3COLOR)
{
EPD_WriteCMD(0x22); // Display Update Control
EPD_WriteData(0xc7);
EPD_WriteCMD(0x20); // Activate Display Update Sequence
ReadBusy();
}
else if (EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
EPD_WriteCMD(0x22); // Display Update Control
EPD_WriteData(0xC7);
EPD_WriteCMD(0x20); // Activate Display Update Sequence
ReadBusy();
}
}
void EPaperDrive::EPD_Update_Part(void)
{
if (EPD_Type == DKE29_3COLOR)
{
EPD_WriteCMD(0x22); // Display Update Control
EPD_WriteData(0xff);
EPD_WriteCMD(0x20); // Activate Display Update Sequence
}
else if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR)
{
EPD_WriteCMD(0x20);
}
else if (EPD_Type == WX29)
{
EPD_WriteCMD_p1(0x22, 0x04);
EPD_WriteCMD(0x20);
}
else if (EPD_Type == WF29 || EPD_Type == WF42)
{
EPD_WriteCMD(0x92);
EPD_WriteCMD(0x12);
}
else if (EPD_Type == WFT0290CZ10)
{
EPD_WriteCMD(0x91);
EPD_WriteCMD(0x12);
// ReadBusy();
}
else if (EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
EPD_WriteCMD(0x22); // Display Update Control
EPD_WriteData(0xFF);
EPD_WriteCMD(0x20); // Activate Display Update Sequence
}
}
void EPaperDrive::EPD_init_Full(void)
{
EPD_Init();
#ifdef debug
Serial.println("EPD_Init");
#endif
if (EPD_Type == WX29)
{
EPD_Write((uint8_t *)LUTDefault_full, sizeof(LUTDefault_full));
}
else if (EPD_Type == OPM42)
{
EPD_Write((uint8_t *)LUTDefault_full_opm42, sizeof(LUTDefault_full_opm42));
}
else if (EPD_Type == DKE42_3COLOR)
{
EPD_Write((uint8_t *)LUTDefault_full_dke42, sizeof(LUTDefault_full_dke42));
}
else if (EPD_Type == WF29BZ03)
{
EPD_Write((uint8_t *)lut_vcomDC_bz03, sizeof(lut_vcomDC_bz03));
EPD_Write((uint8_t *)lut_ww_bz03, sizeof(lut_ww_bz03));
EPD_Write((uint8_t *)lut_bw_bz03, sizeof(lut_bw_bz03));
EPD_Write((uint8_t *)lut_wb_bz03, sizeof(lut_wb_bz03));
EPD_Write((uint8_t *)lut_bb_bz03, sizeof(lut_bb_bz03));
}
else if (EPD_Type == WF42)
{
EPD_Write((uint8_t *)lut_vcomDC, sizeof(lut_vcomDC));
EPD_Write((uint8_t *)lut_ww, sizeof(lut_ww));
EPD_Write((uint8_t *)lut_bw, sizeof(lut_bw));
EPD_Write((uint8_t *)lut_wb, sizeof(lut_wb));
EPD_Write((uint8_t *)lut_bb, sizeof(lut_bb));
}
else if (EPD_Type == WF42)
{
EPD_Write((uint8_t *)lut_wf42_vcomDC, sizeof(lut_wf42_vcomDC));
EPD_Write((uint8_t *)lut_wf42_ww, sizeof(lut_wf42_ww));
EPD_Write((uint8_t *)lut_wf42_bw, sizeof(lut_wf42_bw));
EPD_Write((uint8_t *)lut_wf42_wb, sizeof(lut_wf42_wb));
EPD_Write((uint8_t *)lut_wf42_bb, sizeof(lut_wf42_bb));
}
else if (EPD_Type == C154)
{
EPD_Write((uint8_t *)lut_vcomDC_154, sizeof(lut_vcomDC_154));
EPD_Write((uint8_t *)lut_ww_154, sizeof(lut_ww_154));
EPD_Write((uint8_t *)lut_bw_154, sizeof(lut_bw_154));
EPD_Write((uint8_t *)lut_wb_154, sizeof(lut_wb_154));
EPD_Write((uint8_t *)lut_bb_154, sizeof(lut_bb_154));
}
else if (EPD_Type == DKE29_3COLOR)
{
EPD_Write((uint8_t *)LUTDefault_full_dke29, sizeof(LUTDefault_full_dke29));
}
else if (EPD_Type == WFT0290CZ10)
{
EPD_Write((uint8_t *)lut_vcomDC_WFT0290CZ10, sizeof(lut_vcomDC_WFT0290CZ10));
EPD_Write((uint8_t *)lut_ww_WFT0290CZ10, sizeof(lut_ww_WFT0290CZ10));
EPD_Write((uint8_t *)lut_bw_WFT0290CZ10, sizeof(lut_bw_WFT0290CZ10));
EPD_Write((uint8_t *)lut_wb_WFT0290CZ10, sizeof(lut_wb_WFT0290CZ10));
EPD_Write((uint8_t *)lut_bb_WFT0290CZ10, sizeof(lut_bb_WFT0290CZ10));
}
else if (EPD_Type == GDEY042Z98)
{
// Serial.printf("即将写入全刷波形 \n");
EPD_Write((uint8_t *)LUTDefault_full_GDEY042Z98, sizeof(LUTDefault_full_GDEY042Z98));
EPD_WriteCMD(0x3F);
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 227 + 1));
EPD_WriteCMD(0x03); //门电压 gate voltage
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 228 + 1));
EPD_WriteCMD(0x04); //源电压 source voltage
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 229 + 1));
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 230 + 1));
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 231 + 1));
EPD_WriteCMD(0x2C); /// vcom
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 232 + 1));
EPD_WriteCMD(0x22);
EPD_WriteData(0xC0);
EPD_WriteCMD(0x20);
}
else if (EPD_Type == HINKE0266A15A0)
{
EPD_Write((uint8_t *)LUTDefault_full_HINKE0266A15A0, sizeof(LUTDefault_full_HINKE0266A15A0));
}
}
void EPaperDrive::EPD_init_Part(void)
{
if (EPD_Type == WX29)
{
EPD_Init(); // display
EPD_Write((uint8_t *)LUTDefault_part, sizeof(LUTDefault_part));
EPD_WriteCMD_p1(0x22, 0xc0); // poweron
EPD_WriteCMD(0x20);
}
else if (EPD_Type == OPM42)
{
EPD_Init();
EPD_WriteCMD(0x21);
EPD_WriteData(0x00);
EPD_Write((uint8_t *)LUTDefault_part_opm42, sizeof(LUTDefault_part_opm42));
}
else if (EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR)
{
EPD_Init();
EPD_WriteCMD(0x21);
EPD_WriteData(0x00);
EPD_Write((uint8_t *)LUTDefault_part_dke42, sizeof(LUTDefault_part_dke42));
}
else if (EPD_Type == WF29)
{
EPD_Init();
EPD_WriteCMD(0x50);
EPD_WriteData(0xb7);
EPD_Write((uint8_t *)lut_vcomDC1, sizeof(lut_vcomDC1));
EPD_Write((uint8_t *)lut_ww1, sizeof(lut_ww1));
EPD_Write((uint8_t *)lut_bw1, sizeof(lut_bw1));
EPD_Write((uint8_t *)lut_wb1, sizeof(lut_wb1));
EPD_Write((uint8_t *)lut_bb1, sizeof(lut_bb1));
}
else if (EPD_Type == WF42)
{
EPD_Init();
// EPD_WriteCMD(0x50);
// EPD_WriteData(0xb7);
EPD_Write((uint8_t *)lut_part_wf42_vcomDC, sizeof(lut_part_wf42_vcomDC));
EPD_Write((uint8_t *)lut_part_wf42_ww, sizeof(lut_part_wf42_ww));
EPD_Write((uint8_t *)lut_part_wf42_bw, sizeof(lut_part_wf42_bw));
EPD_Write((uint8_t *)lut_part_wf42_wb, sizeof(lut_part_wf42_wb));
EPD_Write((uint8_t *)lut_part_wf42_bb, sizeof(lut_part_wf42_bb));
}
else if (EPD_Type == DKE29_3COLOR)
{
EPD_Init();
EPD_WriteCMD(0x21);
EPD_WriteData(0x00);
EPD_Write((uint8_t *)LUTDefault_part_dke29, sizeof(LUTDefault_part_dke29));
}
else if (EPD_Type == WF29BZ03)
{
EPD_Init();
EPD_Write((uint8_t *)lut_vcomDC_part_bz03, sizeof(lut_vcomDC_part_bz03));
EPD_Write((uint8_t *)lut_ww_part_bz03, sizeof(lut_ww_part_bz03));
EPD_Write((uint8_t *)lut_bw_part_bz03, sizeof(lut_bw_part_bz03));
EPD_Write((uint8_t *)lut_wb_part_bz03, sizeof(lut_wb_part_bz03));
EPD_Write((uint8_t *)lut_bb_part_bz03, sizeof(lut_wb_part_bz03));
}
else if (EPD_Type == WFT0290CZ10)
{
// EPD_Init();
// Serial.println("Will EPD Write");
EPD_RST_0;
driver_delay_xms(10);
EPD_RST_1;
driver_delay_xms(10);
EPD_WriteCMD(0x01); // POWER SETTING
EPD_WriteData(0x03);
EPD_WriteData(0x02);
EPD_WriteData(0x21);
EPD_WriteData(0x21);
EPD_WriteCMD(0x06); // boost soft start
EPD_WriteData(0x17); // A
EPD_WriteData(0x17); // B
EPD_WriteData(0x17); // C
EPD_WriteCMD(0x04);
ReadBusy();
EPD_WriteCMD(0x00); // panel setting
EPD_WriteData(0xA7); // LUT from OTP£¬128x296
// EPD_WriteData(0x0d); // VCOM to 0V fast
EPD_WriteCMD(0x30); // PLL setting
EPD_WriteData(0x3c); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_WriteCMD(0x61); // resolution setting
EPD_WriteData(0x80);
EPD_WriteData(0x01);
EPD_WriteData(0x28);
EPD_WriteCMD(0x82); // vcom_DC setting
EPD_WriteData(0x08);
EPD_WriteCMD(0X50);
EPD_WriteData(0xD7);
/*EPD_Write((uint8_t *)lut_vcomDC1, sizeof(lut_vcomDC1));
EPD_Write((uint8_t *)lut_ww1, sizeof(lut_ww1));
EPD_Write((uint8_t *)lut_bw1, sizeof(lut_bw1));
EPD_Write((uint8_t *)lut_wb1, sizeof(lut_wb1));
EPD_Write((uint8_t *)lut_bb1, sizeof(lut_bb1));*/
EPD_Write((uint8_t *)lut_vcomDC_part_WFT0290CZ10, sizeof(lut_vcomDC_part_WFT0290CZ10)); // Serial.println("vcom");
EPD_Write((uint8_t *)lut_ww_part_WFT0290CZ10, sizeof(lut_ww_part_WFT0290CZ10)); // Serial.println("ww");
EPD_Write((uint8_t *)lut_bw_part_WFT0290CZ10, sizeof(lut_bw_part_WFT0290CZ10)); // Serial.println("bw");
EPD_Write((uint8_t *)lut_wb_part_WFT0290CZ10, sizeof(lut_wb_part_WFT0290CZ10)); // Serial.println("wb");
EPD_Write((uint8_t *)lut_bb_part_WFT0290CZ10, sizeof(lut_bb_part_WFT0290CZ10)); // Serial.println("bb");
// Serial.println("EPD Write OK");
}
else if (EPD_Type == GDEY042Z98)
{
EPD_Init();
EPD_WriteCMD(0x21);
EPD_WriteData(0x00);
EPD_Write((uint8_t *)LUTDefault_part_GDEY042Z98, sizeof(LUTDefault_part_GDEY042Z98));
EPD_WriteCMD(0x3F);
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 227 + 1));
EPD_WriteCMD(0x03); //门电压 gate voltage
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 228 + 1));
EPD_WriteCMD(0x04); //源电压 source voltage
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 229 + 1));
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 230 + 1));
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 231 + 1));
EPD_WriteCMD(0x2C); /// vcom
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 232 + 1));
EPD_WriteCMD(0x22);
EPD_WriteData(0xC0);
EPD_WriteCMD(0x20);
ReadBusy();
}
else if (EPD_Type == HINKE0266A15A0)
{
EPD_Init();
EPD_Write((uint8_t *)LUTDefault_part_HINKE0266A15A0, sizeof(LUTDefault_part_HINKE0266A15A0));
/*EPD_WriteCMD(0x37);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteData(0x00);
EPD_WriteData(0x40);
EPD_WriteData(0x00);
EPD_WriteData(0x00);*/
// EPD_WriteCMD(0x22); // Display Update Control
// EPD_WriteData(0xC0);
// EPD_WriteCMD(0x20); // Activate Display Update Sequence
ReadBusy();
}
}
void EPaperDrive::EPD_Transfer_Full_BW(uint8_t *DisBuffer, uint8_t Label)
{
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == WFT0290CZ10 || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
unsigned int yStart = 0;
unsigned int yEnd = yDot - 1;
unsigned int xStart = 0;
unsigned int xEnd = xDot - 1;
unsigned long temp = yStart;
yStart = yDot - 1 - yEnd;
yEnd = yDot - 1 - temp;
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_SetRamArea(xStart, xEnd, yEnd % 256, yEnd / 256, yStart % 256, yStart / 256);
if (Label == 2)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // white
}
else if (Label == 3)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // black
}
else if (Label == 4)
{
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); // black
}
else
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
// EPD_Update();
// ReadBusy_long();
// EPD_WriteDispRam(xDot/8, yDot, (uint8_t *)DisBuffer,0,1);
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (Label == 2)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // white
}
else if (Label == 3)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // black
}
else if (Label == 4)
{
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); // black
}
else
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); // white
}
// EPD_Update();
}
}
void EPaperDrive::EPD_Transfer_Full_RED(uint8_t *DisBuffer, uint8_t Label)
{
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
unsigned int yStart = 0;
unsigned int yEnd = yDot - 1;
unsigned int xStart = 0;
unsigned int xEnd = xDot - 1;
unsigned long temp = yStart;
yStart = yDot - 1 - yEnd;
yEnd = yDot - 1 - temp;
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_SetRamArea(xStart, xEnd, yEnd % 256, yEnd / 256, yStart % 256, yStart / 256);
if (Label == 2)
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // white
}
else if (Label == 3)
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // black
}
else
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
// EPD_Update();
// ReadBusy_long();
// EPD_WriteDispRam_Old(xDot/8, yDot, (uint8_t *)DisBuffer,0,1);
}
if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (Label == 2)
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // white
}
else if (Label == 3)
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // black
}
else
{
EPD_WriteDispRam_RED(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); // white
}
// EPD_Update();
}
}
void EPaperDrive::EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)
{
int nowtime = millis();
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
unsigned int yStart = 0;
unsigned int yEnd = yDot - 1;
unsigned int xStart = 0;
unsigned int xEnd = xDot - 1;
unsigned long temp = yStart;
yStart = yDot - 1 - yEnd;
yEnd = yDot - 1 - temp;
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_SetRamArea(xStart, xEnd, yEnd % 256, yEnd / 256, yStart % 256, yStart / 256);
if (EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
EPD_Transfer_Full_RED((uint8_t *)DisBuffer, 2);
}
if (Label == 2)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // white
}
else if (Label == 3)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // black
}
else
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
nowtime = millis() - nowtime;
EPD_Update();
nowtime = millis() - nowtime;
int updatatime = nowtime;
// Serial.printf("开始全刷 \n");
ReadBusy_long();
ReadBusy_long();
ReadBusy_long();
ReadBusy_long();
nowtime = millis() - nowtime;
// Serial.printf("全刷结束,耗时%dms", nowtime - updatatime);
if (EPD_Type == DKE29_3COLOR)
{
// EPD_Transfer_Full_RED((uint8_t *)EPDbuffer,1);
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
// Serial.printf("即将写入的是全刷的0x26数据 \n");
// EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
else if (EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); //我也不知道啥情况,但是如果你不对这个寄存器写两遍一样的数据局刷无效
// EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
else
{
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (Label == 2)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff); // white
}
else if (Label == 3)
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0x00); // black
}
else
{
EPD_WriteDispRam(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
ReadBusy_long();
// EPD_WriteDispRam_Old(xDot/8, yDot, (uint8_t *)DisBuffer,0,1);
EPD_Update();
/*if(EPD_Type==WF32)
{
WiFi.mode(WIFI_OFF);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
gpio_pin_wakeup_enable(GPIO_ID_PIN(4), GPIO_PIN_INTR_HILEVEL);
wifi_fpm_open();
wifi_fpm_do_sleep(0xFFFFFFF); // only 0xFFFFFFF, any other value and it won't disconnect the RTC timer
delay(10);
} */
// ReadBusy_long();
// ReadBusy_long();
// ReadBusy_long();
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
ReadBusy_long();
}
}
void EPaperDrive::EPD_Dis_Part(int xStart, int xEnd, int yStart, int yEnd, uint8_t *DisBuffer, uint8_t Label)
{
// EPD.EPD_Dis_Part(16,87,237,399,(uint8_t *)EPD.EPDbuffer,1);
if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == WF42 || EPD_Type == GDEY042Z98)
{
int temp1 = xStart, temp2 = xEnd;
xStart = yStart;
xEnd = yEnd;
yEnd = yDot - temp1 - 2;
yStart = yDot - temp2 - 3;
}
unsigned int Xsize = xEnd - xStart;
unsigned int Ysize = yEnd - yStart + 1;
if (Xsize % 8 != 0)
{
Xsize = Xsize + (8 - Xsize % 8);
}
Xsize = Xsize / 8;
unsigned int offset = yStart * xDot / 8 + xStart / 8;
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
unsigned long temp = yStart;
yStart = yDot - 1 - yEnd;
yEnd = yDot - 1 - temp;
EPD_SetRamArea(xStart, xEnd, yEnd % 256, yEnd / 256, yStart % 256, yStart / 256);
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
if (Label == 2)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0x00);
else if (Label == 3)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0xff);
else
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
EPD_Update_Part();
ReadBusy_long();
ReadBusy_long();
if (EPD_Type == DKE29_3COLOR)
{
// Serial.printf("即将写入的是局刷的的0x26数据 \n");
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
else if (EPD_Type == GDEY042Z98)
{
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
else if (EPD_Type == HINKE0266A15A0)
{
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
// EPD_WriteDispRam_Old(Xsize, Ysize,(uint8_t *)DisBuffer,offset,1);
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
EPD_SetRamArea(xStart, xEnd, yStart / 256, yStart % 256, yEnd / 256, yEnd % 256);
ReadBusy_long();
// EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer,offset,0x00);
if (Label == 2)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0xff);
else if (Label == 3)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0x00);
else
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
EPD_Update_Part();
ReadBusy();
ReadBusy();
ReadBusy();
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
ReadBusy();
}
}
void EPaperDrive::EPD_Transfer_Part(int xStart, int xEnd, int yStart, int yEnd, uint8_t *DisBuffer, uint8_t Label)
{
if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98)
{
int temp1 = xStart, temp2 = xEnd;
xStart = yStart;
xEnd = yEnd;
yEnd = yDot - temp1 - 2;
yStart = yDot - temp2 - 3;
}
unsigned int Xsize = xEnd - xStart;
unsigned int Ysize = yEnd - yStart + 1;
if (Xsize % 8 != 0)
{
Xsize = Xsize + (8 - Xsize % 8);
}
Xsize = Xsize / 8;
unsigned int offset = yStart * xDot / 8 + xStart / 8;
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
unsigned long temp = yStart;
yStart = yDot - 1 - yEnd;
yEnd = yDot - 1 - temp;
EPD_SetRamArea(xStart, xEnd, yEnd % 256, yEnd / 256, yStart % 256, yStart / 256);
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
if (Label == 2)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0x00);
else if (Label == 3)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0xff);
else
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
// EPD_Update_Part();
ReadBusy();
// EPD_WriteDispRam_Old(Xsize, Ysize,(uint8_t *)DisBuffer,offset,1);
// ReadBusy();
// EPD_SetRamArea(xStart,xEnd,yEnd%256,yEnd/256,yStart%256,yStart/256);
// EPD_SetRamPointer(xStart/8,yEnd%256,yEnd/256);
// EPD_WriteDispRam(Xsize, Ysize,(uint8_t *)DisBuffer,offset,1);
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WF29BZ03 || EPD_Type == WFT0290CZ10)
{
EPD_SetRamArea(xStart, xEnd, yStart / 256, yStart % 256, yEnd / 256, yEnd % 256);
if (Label == 2)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0xff);
else if (Label == 3)
EPD_WriteDispRam(xEnd - xStart, yEnd - yStart + 1, (uint8_t *)DisBuffer, offset, 0x00);
else
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
// EPD_Update_Part();
}
}