mirror of
https://github.com/tsl0922/EPD-nRF5.git
synced 2025-12-05 15:32:48 +08:00
fix uc8159 image transfer
This commit is contained in:
@@ -33,7 +33,7 @@ typedef struct
|
||||
void (*init)(); /**< Initialize the e-Paper register */
|
||||
void (*clear)(bool refresh); /**< Clear screen */
|
||||
void (*write_image)(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, uint16_t w, uint16_t h); /**< write image */
|
||||
void (*write_ram)(bool begin, bool black, uint8_t *data, uint8_t len); /* write data to epd ram */
|
||||
void (*write_ram)(uint8_t cfg, uint8_t *data, uint8_t len); /* write data to epd ram */
|
||||
void (*refresh)(void); /**< Sends the image buffer in RAM to e-Paper and displays */
|
||||
void (*sleep)(void); /**< Enter sleep mode */
|
||||
int8_t (*read_temp)(void); /**< Read temperature from driver chip */
|
||||
|
||||
@@ -192,7 +192,7 @@ static void epd_service_on_write(ble_epd_t * p_epd, uint8_t * p_data, uint16_t l
|
||||
|
||||
case EPD_CMD_WRITE_IMAGE: // MSB=0000: ram begin, LSB=1111: black
|
||||
if (length < 3) return;
|
||||
p_epd->epd->drv->write_ram((p_data[1] >> 4) == 0x00, (p_data[1] & 0x0F) == 0x0F, &p_data[2], length - 2);
|
||||
p_epd->epd->drv->write_ram(p_data[1], &p_data[2], length - 2);
|
||||
break;
|
||||
|
||||
case EPD_CMD_SET_CONFIG:
|
||||
|
||||
@@ -166,8 +166,9 @@ void JD79xx_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y,
|
||||
}
|
||||
}
|
||||
|
||||
void JD79xx_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len)
|
||||
void JD79xx_Write_Ram(uint8_t cfg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
bool begin = (cfg >> 4) == 0x00;
|
||||
if (begin)
|
||||
EPD_WriteCmd(CMD_DTM);
|
||||
EPD_WriteData(data, len);
|
||||
@@ -184,7 +185,7 @@ static epd_driver_t epd_drv_JD79668 = {
|
||||
.init = JD79xx_Init,
|
||||
.clear = JD79xx_Clear,
|
||||
.write_image = JD79xx_Write_Image,
|
||||
.write_ram = JD79xx_Wite_Ram,
|
||||
.write_ram = JD79xx_Write_Ram,
|
||||
.refresh = JD79xx_Refresh,
|
||||
.sleep = JD79xx_Sleep,
|
||||
.read_temp = JD79xx_Read_Temp,
|
||||
|
||||
@@ -191,8 +191,10 @@ void SSD16xx_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y,
|
||||
}
|
||||
}
|
||||
|
||||
void SSD16xx_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len)
|
||||
void SSD16xx_Write_Ram(uint8_t cfg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
bool begin = (cfg >> 4) == 0x00;
|
||||
bool black = (cfg & 0x0F) == 0x0F;
|
||||
if (begin) {
|
||||
epd_model_t *EPD = epd_get();
|
||||
if (EPD->color == BWR)
|
||||
@@ -213,7 +215,7 @@ static epd_driver_t epd_drv_ssd1619 = {
|
||||
.init = SSD16xx_Init,
|
||||
.clear = SSD16xx_Clear,
|
||||
.write_image = SSD16xx_Write_Image,
|
||||
.write_ram = SSD16xx_Wite_Ram,
|
||||
.write_ram = SSD16xx_Write_Ram,
|
||||
.refresh = SSD16xx_Refresh,
|
||||
.sleep = SSD16xx_Sleep,
|
||||
.read_temp = SSD16xx_Read_Temp,
|
||||
|
||||
13
EPD/UC81xx.c
13
EPD/UC81xx.c
@@ -255,8 +255,10 @@ void UC8159_Write_Image(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y,
|
||||
EPD_WriteCmd(CMD_PTOUT); // partial out
|
||||
}
|
||||
|
||||
void UC81xx_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len)
|
||||
void UC81xx_Wite_Ram(uint8_t cfg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
bool begin = (cfg >> 4) == 0x00;
|
||||
bool black = (cfg & 0x0F) == 0x0F;
|
||||
if (begin) {
|
||||
epd_model_t *EPD = epd_get();
|
||||
if (EPD->color == BWR)
|
||||
@@ -268,13 +270,12 @@ void UC81xx_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len)
|
||||
}
|
||||
|
||||
// only black pixels are handled
|
||||
void UC8159_Wite_Ram(bool begin, bool black, uint8_t *data, uint8_t len)
|
||||
void UC8159_Wite_Ram(uint8_t cfg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
bool begin = (cfg >> 4) == 0x00;
|
||||
bool black = (cfg & 0x0F) == 0x0F;
|
||||
if (begin && black) EPD_WriteCmd(CMD_DTM1);
|
||||
for (uint8_t i = 0; i < len; i ++) {
|
||||
uint8_t black_data = data[i];
|
||||
UC8159_Send_Pixel(black_data, 0xFF);
|
||||
}
|
||||
EPD_WriteData(data, len);
|
||||
}
|
||||
|
||||
void UC81xx_Sleep(void)
|
||||
|
||||
@@ -162,6 +162,33 @@ async function sendcmd() {
|
||||
await write(bytes[0], bytes.length > 1 ? bytes.slice(1) : null);
|
||||
}
|
||||
|
||||
function convertUC8159(blackWhiteData, redWhiteData) {
|
||||
const halfLength = blackWhiteData.length;
|
||||
let payloadData = new Uint8Array(halfLength * 4);
|
||||
let payloadIdx = 0;
|
||||
let black_data, color_data, data;
|
||||
for (let i = 0; i < halfLength; i++) {
|
||||
black_data = blackWhiteData[i];
|
||||
color_data = redWhiteData[i];
|
||||
for (let j = 0; j < 8; j++) {
|
||||
if ((color_data & 0x80) == 0x00) data = 0x04; // red
|
||||
else if ((black_data & 0x80) == 0x00) data = 0x00; // black
|
||||
else data = 0x03; // white
|
||||
data = (data << 4) & 0xFF;
|
||||
black_data = (black_data << 1) & 0xFF;
|
||||
color_data = (color_data << 1) & 0xFF;
|
||||
j++;
|
||||
if ((color_data & 0x80) == 0x00) data |= 0x04; // red
|
||||
else if ((black_data & 0x80) == 0x00) data |= 0x00; // black
|
||||
else data |= 0x03; // white
|
||||
black_data = (black_data << 1) & 0xFF;
|
||||
color_data = (color_data << 1) & 0xFF;
|
||||
payloadData[payloadIdx++] = data;
|
||||
}
|
||||
}
|
||||
return payloadData;
|
||||
}
|
||||
|
||||
async function sendimg() {
|
||||
if (isCropMode()) {
|
||||
alert("请先完成图片裁剪!发送已取消。");
|
||||
@@ -193,8 +220,14 @@ async function sendimg() {
|
||||
await writeImage(processedData, 'color');
|
||||
} else if (ditherMode === 'threeColor') {
|
||||
const halfLength = Math.floor(processedData.length / 2);
|
||||
await writeImage(processedData.slice(0, halfLength), 'bw');
|
||||
await writeImage(processedData.slice(halfLength), 'red');
|
||||
const blackWhiteData = processedData.slice(0, halfLength);
|
||||
const redWhiteData = processedData.slice(halfLength);
|
||||
if (epdDriverSelect.value === '08' || epdDriverSelect.value === '09') {
|
||||
await writeImage(convertUC8159(blackWhiteData, redWhiteData), 'bw');
|
||||
} else {
|
||||
await writeImage(blackWhiteData, 'bw');
|
||||
await writeImage(redWhiteData, 'red');
|
||||
}
|
||||
} else if (ditherMode === 'blackWhiteColor') {
|
||||
await writeImage(processedData, 'bw');
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user