diff --git a/EPD/EPD_driver.h b/EPD/EPD_driver.h index 3cebe66..10dba21 100644 --- a/EPD/EPD_driver.h +++ b/EPD/EPD_driver.h @@ -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 */ diff --git a/EPD/EPD_service.c b/EPD/EPD_service.c index 9645c4c..0273c64 100644 --- a/EPD/EPD_service.c +++ b/EPD/EPD_service.c @@ -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: diff --git a/EPD/JD79xx.c b/EPD/JD79xx.c index 79dbaa7..9e08e4c 100644 --- a/EPD/JD79xx.c +++ b/EPD/JD79xx.c @@ -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, diff --git a/EPD/SSD16xx.c b/EPD/SSD16xx.c index 7c36e36..fe8bbd7 100644 --- a/EPD/SSD16xx.c +++ b/EPD/SSD16xx.c @@ -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, diff --git a/EPD/UC81xx.c b/EPD/UC81xx.c index 34dcad9..735fcad 100644 --- a/EPD/UC81xx.c +++ b/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) diff --git a/html/js/main.js b/html/js/main.js index c0225d4..4d59eec 100644 --- a/html/js/main.js +++ b/html/js/main.js @@ -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 {