fix uc8159 image transfer

This commit is contained in:
Shuanglei Tao
2025-10-14 21:29:01 +08:00
parent b53fa53389
commit 3ce8200c11
6 changed files with 51 additions and 14 deletions

View File

@@ -33,7 +33,7 @@ typedef struct
void (*init)(); /**< Initialize the e-Paper register */ void (*init)(); /**< Initialize the e-Paper register */
void (*clear)(bool refresh); /**< Clear screen */ 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_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 (*refresh)(void); /**< Sends the image buffer in RAM to e-Paper and displays */
void (*sleep)(void); /**< Enter sleep mode */ void (*sleep)(void); /**< Enter sleep mode */
int8_t (*read_temp)(void); /**< Read temperature from driver chip */ int8_t (*read_temp)(void); /**< Read temperature from driver chip */

View File

@@ -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 case EPD_CMD_WRITE_IMAGE: // MSB=0000: ram begin, LSB=1111: black
if (length < 3) return; 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; break;
case EPD_CMD_SET_CONFIG: case EPD_CMD_SET_CONFIG:

View File

@@ -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) if (begin)
EPD_WriteCmd(CMD_DTM); EPD_WriteCmd(CMD_DTM);
EPD_WriteData(data, len); EPD_WriteData(data, len);
@@ -184,7 +185,7 @@ static epd_driver_t epd_drv_JD79668 = {
.init = JD79xx_Init, .init = JD79xx_Init,
.clear = JD79xx_Clear, .clear = JD79xx_Clear,
.write_image = JD79xx_Write_Image, .write_image = JD79xx_Write_Image,
.write_ram = JD79xx_Wite_Ram, .write_ram = JD79xx_Write_Ram,
.refresh = JD79xx_Refresh, .refresh = JD79xx_Refresh,
.sleep = JD79xx_Sleep, .sleep = JD79xx_Sleep,
.read_temp = JD79xx_Read_Temp, .read_temp = JD79xx_Read_Temp,

View File

@@ -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) { if (begin) {
epd_model_t *EPD = epd_get(); epd_model_t *EPD = epd_get();
if (EPD->color == BWR) if (EPD->color == BWR)
@@ -213,7 +215,7 @@ static epd_driver_t epd_drv_ssd1619 = {
.init = SSD16xx_Init, .init = SSD16xx_Init,
.clear = SSD16xx_Clear, .clear = SSD16xx_Clear,
.write_image = SSD16xx_Write_Image, .write_image = SSD16xx_Write_Image,
.write_ram = SSD16xx_Wite_Ram, .write_ram = SSD16xx_Write_Ram,
.refresh = SSD16xx_Refresh, .refresh = SSD16xx_Refresh,
.sleep = SSD16xx_Sleep, .sleep = SSD16xx_Sleep,
.read_temp = SSD16xx_Read_Temp, .read_temp = SSD16xx_Read_Temp,

View File

@@ -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 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) { if (begin) {
epd_model_t *EPD = epd_get(); epd_model_t *EPD = epd_get();
if (EPD->color == BWR) 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 // 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); if (begin && black) EPD_WriteCmd(CMD_DTM1);
for (uint8_t i = 0; i < len; i ++) { EPD_WriteData(data, len);
uint8_t black_data = data[i];
UC8159_Send_Pixel(black_data, 0xFF);
}
} }
void UC81xx_Sleep(void) void UC81xx_Sleep(void)

View File

@@ -162,6 +162,33 @@ async function sendcmd() {
await write(bytes[0], bytes.length > 1 ? bytes.slice(1) : null); 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() { async function sendimg() {
if (isCropMode()) { if (isCropMode()) {
alert("请先完成图片裁剪!发送已取消。"); alert("请先完成图片裁剪!发送已取消。");
@@ -193,8 +220,14 @@ async function sendimg() {
await writeImage(processedData, 'color'); await writeImage(processedData, 'color');
} else if (ditherMode === 'threeColor') { } else if (ditherMode === 'threeColor') {
const halfLength = Math.floor(processedData.length / 2); const halfLength = Math.floor(processedData.length / 2);
await writeImage(processedData.slice(0, halfLength), 'bw'); const blackWhiteData = processedData.slice(0, halfLength);
await writeImage(processedData.slice(halfLength), 'red'); 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') { } else if (ditherMode === 'blackWhiteColor') {
await writeImage(processedData, 'bw'); await writeImage(processedData, 'bw');
} else { } else {