diff --git a/Firmware/ATC_Paper.bin b/Firmware/ATC_Paper.bin index 2395ee4..35f6bfe 100644 Binary files a/Firmware/ATC_Paper.bin and b/Firmware/ATC_Paper.bin differ diff --git a/Firmware/src/app_att.c b/Firmware/src/app_att.c index 577e8c1..9b318fd 100644 --- a/Firmware/src/app_att.c +++ b/Firmware/src/app_att.c @@ -91,6 +91,7 @@ static const u8 my_EPD_BLEUUID[16] = { EPD_BLE_CHAR_UUID }; #define EPD_BLE_SERVICE_UUID 0x38, 0x9a, 0x7d, 0x21, 0xd3, 0x83, 0x4e, 0x04, 0xba, 0xa3, 0xa9, 0xeb, 0x10, 0x7b, 0x18, 0x13 static const u8 my_EPD_BLE_ServiceUUID[16] = { EPD_BLE_SERVICE_UUID }; static u8 my_EPD_BLE_Data = 0x00; +static u8 my_EPD_BLEInCCC[2]; // Include attribute (Battery service) static const u16 include[3] = {BATT_PS_H, BATT_LEVEL_INPUT_CCB_H, SERVICE_UUID_BATTERY}; @@ -150,7 +151,7 @@ static const u8 my_RxTxCharVal[5] = { //// EPD_BLE attribute values static const u8 my_EPD_BLECharVal[19] = { - CHAR_PROP_READ | CHAR_PROP_WRITE, + CHAR_PROP_NOTIFY | CHAR_PROP_WRITE, U16_LO(EPD_BLE_CMD_OUT_DP_H), U16_HI(EPD_BLE_CMD_OUT_DP_H), EPD_BLE_CHAR_UUID, }; @@ -196,9 +197,10 @@ static const attribute_t my_Attributes[] = { {0,ATT_PERMISSIONS_WRITE, 2,sizeof(my_RxTx_Data),(u8*)(&my_RxTxUUID), (&my_RxTx_Data), &RxTxWrite}, //value {0,ATT_PERMISSIONS_RDWR,2,sizeof(RxTxValueInCCC),(u8*)(&clientCharacterCfgUUID), (u8*)(RxTxValueInCCC), 0}, //value ////////////////////////////////////// EPD_BLE //////////////////////////////////////////////////// - {3,ATT_PERMISSIONS_READ, 2, 16,(u8*)(&my_primaryServiceUUID), (u8*)(&my_EPD_BLE_ServiceUUID), 0}, + {4,ATT_PERMISSIONS_READ, 2, 16,(u8*)(&my_primaryServiceUUID), (u8*)(&my_EPD_BLE_ServiceUUID), 0}, {0,ATT_PERMISSIONS_READ, 2, sizeof(my_EPD_BLECharVal), (u8*)(&my_characterUUID), (u8*)(my_EPD_BLECharVal), 0}, {0,ATT_PERMISSIONS_WRITE, 16, sizeof(my_EPD_BLE_Data), (u8*)(&my_EPD_BLEUUID), (&my_EPD_BLE_Data), (att_readwrite_callback_t) &epd_ble_handle_write}, + {0,ATT_PERMISSIONS_RDWR, 2, sizeof(my_EPD_BLEInCCC),(u8*)(&clientCharacterCfgUUID), (u8*)(my_EPD_BLEInCCC), 0}, //value }; void my_att_init(void) diff --git a/Firmware/src/epd.c b/Firmware/src/epd.c index 9d48a63..2d0de8d 100755 --- a/Firmware/src/epd.c +++ b/Firmware/src/epd.c @@ -240,6 +240,8 @@ _attribute_ram_code_ void epd_display_tiff(uint8_t *pData, int iSize) extern uint8_t mac_public[6]; _attribute_ram_code_ void epd_display(uint32_t time_is, uint16_t battery_mv, int16_t temperature, uint8_t full_or_partial) { + uint8_t battery_level; + if (epd_update_state) return; @@ -279,6 +281,7 @@ _attribute_ram_code_ void epd_display(uint32_t time_is, uint16_t battery_mv, int obdFill(&obd, 0, 0); // fill with white char buff[100]; + battery_level = get_battery_level(battery_mv); sprintf(buff, "S24_%02X%02X%02X %s", mac_public[2], mac_public[1], mac_public[0], epd_model_string[epd_model]); obdWriteStringCustom(&obd, (GFXfont *)&Dialog_plain_16, 1, 17, (char *)buff, 1); sprintf(buff, "%s", BLE_conn_string[ble_get_connected()]); @@ -287,7 +290,7 @@ _attribute_ram_code_ void epd_display(uint32_t time_is, uint16_t battery_mv, int obdWriteStringCustom(&obd, (GFXfont *)&DSEG14_Classic_Mini_Regular_40, 75, 65, (char *)buff, 1); sprintf(buff, "-----%d'C-----", EPD_read_temp()); obdWriteStringCustom(&obd, (GFXfont *)&Special_Elite_Regular_30, 10, 95, (char *)buff, 1); - sprintf(buff, "Battery %dmV", battery_mv); + sprintf(buff, "Battery %dmV %d%%", battery_mv, battery_level); obdWriteStringCustom(&obd, (GFXfont *)&Dialog_plain_16, 10, 120, (char *)buff, 1); FixBuffer(epd_temp, epd_buffer, resolution_w, resolution_h); EPD_Display(epd_buffer, resolution_w * resolution_h / 8, full_or_partial); diff --git a/Firmware/src/epd.h b/Firmware/src/epd.h index 5219730..5efd093 100644 --- a/Firmware/src/epd.h +++ b/Firmware/src/epd.h @@ -1,7 +1,7 @@ #pragma once -#define epd_height 200 -#define epd_width 200 +#define epd_height 128 +#define epd_width 296 #define epd_buffer_size ((epd_height/8) * epd_width) void set_EPD_model(uint8_t model_nr); diff --git a/Firmware/src/epd_ble_service.c b/Firmware/src/epd_ble_service.c index 8f07a22..27eabb0 100644 --- a/Firmware/src/epd_ble_service.c +++ b/Firmware/src/epd_ble_service.c @@ -23,6 +23,7 @@ int epd_ble_handle_write(void *p) rf_packet_att_write_t *req = (rf_packet_att_write_t *)p; uint8_t *payload = &req->value; unsigned int payload_len = req->l2capLen - 3; + uint8_t out_buffer[20] = {0}; ASSERT_MIN_LEN(payload_len, 1); @@ -46,12 +47,20 @@ int epd_ble_handle_write(void *p) return 0; // Write data to image buffer. case 0x03: - if (byte_pos + payload_len - 1 >= sizeof(epd_buffer) + 1) + if (byte_pos + payload_len - 1 >= epd_buffer_size + 1) { + out_buffer[0] = 0x00; + out_buffer[1] = 0x00; + bls_att_pushNotifyData(EPD_BLE_CMD_OUT_DP_H, out_buffer, 2); return 0; } memcpy(epd_buffer + byte_pos, payload + 1, payload_len - 1); + byte_pos += payload_len - 1; + + out_buffer[0] = payload_len >> 8; + out_buffer[1] = payload_len & 0xff; + bls_att_pushNotifyData(EPD_BLE_CMD_OUT_DP_H, out_buffer, 2); return 0; case 0x04: // decode & display a TIFF image epd_display_tiff(epd_buffer, byte_pos); diff --git a/Firmware/src/epd_bwr_296.c b/Firmware/src/epd_bwr_296.c index 4a8b8b1..a334a0b 100644 --- a/Firmware/src/epd_bwr_296.c +++ b/Firmware/src/epd_bwr_296.c @@ -60,7 +60,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_detect(void) _attribute_ram_code_ uint8_t EPD_BWR_296_read_temp(void) { uint8_t epd_temperature = 0 ; - + // SW Reset EPD_WriteCmd(0x12); @@ -118,7 +118,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_read_temp(void) // Display update control EPD_WriteCmd(0x22); EPD_WriteData(0xB1); - + // Master Activation EPD_WriteCmd(0x20); @@ -126,11 +126,11 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_read_temp(void) // Temperature sensor read from register EPD_WriteCmd(0x1B); - epd_temperature = EPD_SPI_read(); + epd_temperature = EPD_SPI_read(); EPD_SPI_read(); WaitMs(5); - + // deep sleep EPD_WriteCmd(0x10); EPD_WriteData(0x01); @@ -138,10 +138,9 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_read_temp(void) return epd_temperature; } -_attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, uint8_t full_or_partial) -{ +_attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, uint8_t full_or_partial) { uint8_t epd_temperature = 0 ; - + // SW Reset EPD_WriteCmd(0x12); @@ -178,7 +177,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, // Set RAM Y- Address Start/End EPD_WriteCmd(0x45); - EPD_WriteData(0x27); //0x0127-->(295+1)=296 + EPD_WriteData(0x28); //0x0127-->(295+1)=296 EPD_WriteData(0x01); EPD_WriteData(0x00); EPD_WriteData(0x00); @@ -199,7 +198,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, // Display update control EPD_WriteCmd(0x22); EPD_WriteData(0xB1); - + // Master Activation EPD_WriteCmd(0x20); @@ -207,7 +206,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, // Temperature sensor read from register EPD_WriteCmd(0x1B); - epd_temperature = EPD_SPI_read(); + epd_temperature = EPD_SPI_read(); EPD_SPI_read(); WaitMs(5); @@ -232,7 +231,7 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, EPD_WriteData(0x28); EPD_WriteData(0x01); - EPD_WriteCmd(0x26);// RED Color TODO make something out of it :) + EPD_WriteCmd(0x26); int i; for (i = 0; i < size; i++) { @@ -247,11 +246,11 @@ _attribute_ram_code_ uint8_t EPD_BWR_296_Display(unsigned char *image, int size, EPD_WriteData(LUT_bwr_296_part[i]); } } - + // Display update control EPD_WriteCmd(0x22); EPD_WriteData(0xC7); - + // Master Activation EPD_WriteCmd(0x20); diff --git a/readme.md b/readme.md index 329b413..06ff78f 100644 --- a/readme.md +++ b/readme.md @@ -6,7 +6,7 @@ ![焊接图示](/USB_UART_Flashing_connection.jpg) -- 2. 焊接 GND, VCC, RX, TX四根线。 RST 可不焊。 +- 2. 焊接 GND, VCC, RX, RTS四根线。 RTS 可不焊。 - 3. 使用usb2ttl模块(CH340)链接焊接的四根线。其中rx 链接 tx, tx链接 rx, vcc链接3.3v, GND链接 GND - 4. 打开https://atc1441.github.io/ATC_TLSR_Paper_UART_Flasher.html, 波特率选择默认 460800,Atime默认,文件选择Firmware/ATC_Paper.bin - 5. 先点击unlock,再点击write to flush,等待完成。成功后,屏幕会自动刷新。 @@ -42,9 +42,15 @@ Firmware CRC32: 0xe62d501e ``` ### 蓝牙链接和OTA升级 -- 1. 必须先断开TTL,不然蓝牙链接不上。 +- 1. 必须先断开TTL TX线,不然蓝牙链接不上。 - 2. OTA升级: https://atc1441.github.io/ATC_TLSR_Paper_OTA_writing.html -- 3. 上传图片: https://atc1441.github.io/ATC_TLSR_Paper_Image_Upload.html + +### 上传图片 +- 1. 运行 `cd web_tools && python -m http.server` +- 2. 打开 http://127.0.0.1:8000 后在页面上链接蓝牙 +- 3. 使用 tools/scripts/image2hex.py 生成图片的16进制字符串,复制到上面页面的输入框里 +- 4. 发送到设备,等待屏幕刷新 + ### 已解决/未解决问题 - [x] 编译报错 @@ -52,6 +58,9 @@ Firmware CRC32: 0xe62d501e - [x] 屏幕区域不对/异常 - [x] 蓝牙无法链接/蓝牙OTA升级 - [ ] 自动识别型号 +- [x] python 图片生成脚本 +- [x] 蓝牙发送图片, 显示大小不对问题解决 +- [x] 添加蓝牙上传图片后notify ### 计划新增 - [ ] 安卓端控制器 diff --git a/tools/data/images/test-01.bmp b/tools/data/images/test-01.bmp new file mode 100644 index 0000000..8e64869 Binary files /dev/null and b/tools/data/images/test-01.bmp differ diff --git a/tools/requriments.txt b/tools/requriments.txt new file mode 100644 index 0000000..e69de29 diff --git a/tools/scripts/__init__.py b/tools/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/scripts/hex2image.py b/tools/scripts/hex2image.py new file mode 100644 index 0000000..356bcbc --- /dev/null +++ b/tools/scripts/hex2image.py @@ -0,0 +1,5 @@ +from tools.utils import hex2image + +if __name__ == '__main__': + s = '0000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007ffffffe07ffffffffc00000000000007ffffffc03ffffffffc00000000000007ffffff803ffffffffc00000000000007ffffff803ffffffffc00000000000007ffffff807ffffffffc00000000000007ffffff83fffffffffc00000000000007ffffff83fffffffffc00000000000007ffffffc1fffffffffc00000000000007ffffffc0fffffffffc00000000000007ffffffe07ffffffffc00000000000007ffffffc0001ffffffc00000000000007ffffff80000ffffffc00000000000007ffffff80000ffffffc00000000000007ffffff80000ffffffc00000000000007ffffffc0001ffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffff87ffffffc00000000000007fffffff0f83ffffffc00000000000007ffffffe0781ffffffc00000000000007ffffffc03c1ffffffc000000001bc007ffffffc03c1ffffffc0000000033e007ffffff801e0ffffffc00000000376007ffffff821e0ffffffc00000000366007ffffff820e0ffffffc000000003e6007ffffff830e0ffffffc000000001ce007ffffff830e0ffffffc00000000000007ffffff83860ffffffc00000000000007ffffff81860ffffffc00000001bfe007ffffffc0401ffffffc00000001bfe007ffffffc0001ffffffc00000001bfe007ffffffe0003ffffffc00000000000007fffffff0003ffffffc00000000000007fffffffc007ffffffc00000000000007ffffffff01fffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffc03fffffffc000000001ec007fffffff0007ffffffc000000003ee007ffffffe0003ffffffc00000000366007ffffffc0001ffffffc00000000366007ffffff80001ffffffc00000000366007ffffff81f80ffffffc000000003ee007ffffff83fe0ffffffc000000001fc007ffffff83fe0ffffffc000000000fc007ffffff83fe0ffffffc00000000000007ffffffc1fe0ffffffc00000000000007ffffffc1fe0ffffffc000000001fe007ffffff8000000ffffc000000003fe007ffffff00000007fffc00000000380007ffffff00000007fffc00000000300007ffffff00000007fffc00000000300007ffffff0000000ffffc000000001fe007ffffffc1fffffffffc000000003fe007fffffffffffffffffc000000003fe007fffffffffffffffffc00000000300007fffffffffffffffffc00000000300007ffffffffff1ffffffc000000001fe007ffffffe0000ffffffc000000003fe007ffffffc0000ffffffc000000003fe007ffffffc0001ffffffc00000000000007ffffff80001ffffffc00000000000007ffffff80001ffffffc000000001fe007ffffff83fc0ffffffc000000003fe007ffffff83fe0ffffffc000000003ee007ffffff83fe0ffffffc00000000366007ffffff81fe0ffffffc00000000366007ffffffc07c0ffffffc0000000037e007ffffffc0000ffffffc000000001bc007ffffffe0001ffffffc00000000000007fffffff0003ffffffc00000000000007fffffffc007ffffffc000000001fe007ffffffff01fffffffc000000003fe007fffffffffffffffffc00000000380007fffffffffffffffffc00000000300007fffff81ffffffffffc00000000300007fffff007fffffffffc000000001fe007ffffe003fffffffffc000000003fe007ffffc001fffffffffc000000003fe007ffff8001fffffffffc00000000000007ffff81c0fffffffffc00000000000007ffff83e0fffffffffc00000000000007ffff03e07ffffffffc00000000000007ffff07f07ffffffffc00000000000007ffff07f07ffffffffc00000000300007ffff07f07ffffffffc000000003e0007ffff07f07ffffffffc000000003fc007ffff0000001ffffffc0000000007f807ffff0000000ffffffc0000000001fc07ffff0000000ffffffc0000000007fc07ffff8000000ffffffc000000003f8407ffffc000001ffffffc000000003c0007fffffffffffffffffc00000000300007fffffffffffffffffc00000000000007fffffffffffffffffc000000001fe007fffffffffffffffffc000000003fe007ffffffffdffffffffc00000000380007ffffffff8ffffffffc00000000300007ffffffff8ffffffffc00000000300007ffffffff8ffffffffc000000001fe007ffffffff8ffffffffc000000003fe007ffffffff8ffffffffc000000003fe007ffffffff8ffffffffc00000000300007ffffffff8ffffffffc00000000300007ffffffff8ffffffffc000000001fe007ffffffff8ffffffffc000000003fe007ffffffff8ffffffffc000000003fe007ffffffff8ffffffffc00000000000007ffffffff8ffffffffc00000000000007ffffffffdffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc000000001fc007fffffffffffffffffc000000003fc007ffff8ffffffffffffc0000000038e007ffff07f8ff8ffffffc00000000306007ffff07f07f07fffffc00000000306007ffff07f07f07fffffc0000000038e007ffff07f07f07fffffc000000001fe007ffff07f07f07fffffc000000001fc007ffff07f07f07fffffc00000000000007ffff07f07f07fffffc00000000000007ffff07f07f07fffffc00000003ffe007ffff07f07f07fffffc00000003ffe007ffff07f07f07fffffc00000003ffe007ffff07f07f07fffffc00000000000007ffff07f07f07fffffc00000000000007ffff07f07f07fffffc00000003ffe007ffff00000007fffffc00000003ffe007ffff0000000ffffffc00000003ffe007ffff0000000ffffffc00000000000007ffff0000001ffffffc00000000000007ffff8000007ffffffc000000001ec007fffffffffffffffffc000000003ee007fffffffffffffffffc00000000366007fffffffffc7ffffffc00000000366007fffffffff83ffffffc00000000366007fffffffff83ffffffc000000003ee007fffffffff81ffffffc000000001fc007fffffffffc1ffffffc000000000fc007fffffffffc1ffffffc00000000000007fffffffffc1ffffffc00000000000007fffffffffc1ffffffc00000001ffe007fffffffffe0ffffffc00000001ffe007fffffffffe0ffffffc00000001ffe007fffffffffe0ffffffc000000000c0007fffffffffe0ffffffc000000000c0007ffff8000000ffffffc000000000c0007ffff0000000ffffffc000000000c0007ffff0000000ffffffc00000001ffe007ffff0000001ffffffc00000001ffe007ffff8000003ffffffc00000001ffe007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007ffffffffc3fffffffc00000000000007ffffffff80fffffffc00000000000007fffffc1f00fffffffc00000000000007fffff006007ffffffc00000000000007ffffe000003ffffffc00000000000007ffffc000183ffffffc00000000000007ffff8000381ffffffc00000000000007ffff81c03c1ffffffc00000000000007ffff83e07c1ffffffc00000000000007ffff07f07c1ffffffc00000000000007ffff07f07e0ffffffc00000000000007ffff07f07e0ffffffc00000000000007ffff07f07e0ffffffc00000000000007ffff07f07e0ffffffc00000000000007ffff0000000ffffffc00000000000007ffff0000000ffffffc00000000000007ffff0000000ffffffc00000000000007ffff8000000ffffffc00000000000007ffff8000001ffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc00000000000007fffffffffffffffffc0000' + hex2image(s, 200, 213) diff --git a/tools/scripts/image2hex.py b/tools/scripts/image2hex.py new file mode 100644 index 0000000..7497d94 --- /dev/null +++ b/tools/scripts/image2hex.py @@ -0,0 +1,8 @@ +from PIL import Image + +from tools.utils import image2hex, load_test_image + + +if __name__ == '__main__': + # print(image2hex(load_test_image('test-01.bmp'))) + print(image2hex(load_test_image('mao.bmp'), steinberg=True)) diff --git a/tools/utils.py b/tools/utils.py new file mode 100644 index 0000000..06e435b --- /dev/null +++ b/tools/utils.py @@ -0,0 +1,46 @@ +import os + +from PIL import Image + + +def hex2bytes(hex_string): + return bytes([int(hex_string[index:index+2], 16) for index in range(0,len(hex_string), 2)]) + + +def hex2bits(hex_string): + _bytes = [] + for index in range(0, len(hex_string), 2): + for char in hex_string[index:index+2]: + for c in bin(int(char, 16))[2:].zfill(8): + _bytes.append(int(c)) + + return bytes(_bytes) + + +def bytes2hex(_bytes): + return ''.join(hex(item)[2:].zfill(2) for item in _bytes) + + +def hex2image(hex_string, width, height): + data = hex2bits(hex_string) + image = Image.new('1', (width, height), (1)) + image.frombytes(data[:width*height], ) + + image.show('test') + + +def image2hex(image, width=296, height=128, steinberg=False): + if isinstance(image, str): + image = Image.open(image) + + mode = None + if steinberg: + mode = Image.FLOYDSTEINBERG + + return bytes2hex(image.resize((width, height)).rotate(90, expand=True).resize((height, width)).convert('1', dither=mode).tobytes()) + + +def load_test_image(name): + path = os.path.join(os.path.dirname(__file__), 'data', 'images', name) + print(f'open image: {path}') + return Image.open(path) diff --git a/web_tools/index.html b/web_tools/index.html new file mode 100644 index 0000000..bd85d89 --- /dev/null +++ b/web_tools/index.html @@ -0,0 +1,295 @@ + + + + + + 电子价签蓝牙控制器 + + + + +

电子价签蓝牙控制器

+ + + + +

+ + + + + + + + + +

+ + +
+
+ +
+ 上传tiff到屏幕 +
+ +
+
+
+
+ 偏移+小时 + + +
+ 日志: +
+
+ +
+
+ + + \ No newline at end of file