diff --git a/README.md b/README.md index 895abd8..b137458 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Collection of tools, their source code and design files for communicating with * See http://furrtek.free.fr/index.php?a=esl for more details. +Thanks to @david4599 for infos about color tags. + ## Hardware * ir_tx_serial: Simple DIY serial port transmitter, using an USB-serial cable. diff --git a/images/color.png b/images/color.png new file mode 100644 index 0000000..82ef7a6 Binary files /dev/null and b/images/color.png differ diff --git a/tools_python/img2dm.py b/tools_python/img2dm.py index 454a1d1..623c6b2 100644 --- a/tools_python/img2dm.py +++ b/tools_python/img2dm.py @@ -7,6 +7,21 @@ import tx from imageio import imread import sys +bytes_per_frame = 20 +bits_per_frame = bytes_per_frame * 8 + +def image_convert(image, color_pass): + pixels = [] + for row in image: + for rgb in row: + luma = 0.21 * rgb[0] + 0.72 * rgb[1] + 0.07 * rgb[2] + if color_pass: + pixels.append(0 if luma >= 0.33 and luma < 0.66 else 1) # 0 codes color (anything mid grey) + else: + pixels.append(0 if luma < 0.5 else 1) # 0 codes black + + return pixels + def record_run(run_count): # Convert to binary del bits[:] @@ -22,18 +37,27 @@ def record_run(run_count): def usage(): print("img2dm - Transmits image to Dot Matrix ESL\n") print("Usage:") - print("img2dm.py port image barcode page (x y)\n") + print("img2dm.py port image barcode (page color x y)\n") print(" port: serial port name (0 for ESL Blaster)") print(" image: image file") print(" barcode: 17-character barcode data") - print(" page: page number to update (0~15)") + print(" page: page number to update (0~15), default: 0") + print(" color: 0:Black and white only, 1:Color-capable ESL, default: 0") print(" x y: top-left position of image, default: 0 0") exit() arg_count = len(sys.argv) -if arg_count < 5: +if arg_count < 4: usage() +if arg_count >= 5: + page = int(sys.argv[4]) + if page < 0 or page > 15: + print("Page must be between 0 and 15.") + exit() +else: + page = 0 + port = sys.argv[1] # Search for connected ESL Blaster if required @@ -46,39 +70,28 @@ if (port == "0"): image = imread(sys.argv[2]) width = image.shape[1] height = image.shape[0] -if width > 208 or height > 112: - print("Image should be 208*112 pixels or less.") - exit() +# Medium size is 208*112 +print("Image is %i*%i, please make sure that this is equal or less than the ESL's display size." % (width, height)) # Get PLID from barcode string PLID = pr.get_plid(sys.argv[3]) -page = int(sys.argv[4]) -if page < 0 or page > 15: - print("Page can only be between 0 and 15.") - exit() +color_mode = int(sys.argv[5]) if arg_count >= 6 else 0 +pos_x = int(sys.argv[6]) if arg_count >= 7 else 0 +pos_y = int(sys.argv[7]) if arg_count >= 8 else 0 -if arg_count > 5: - pos_x = int(sys.argv[5]) -else: - pos_x = 0 -if arg_count > 6: - pos_y = int(sys.argv[6]) -else: - pos_y = 0 +# First pass for black and white +pixels = image_convert(image, 0) -bits = [] -size_raw = width * height +if color_mode: + # Append second pass for color if needed + pixels += image_convert(image, 1) -# Convert image to 1-bit -pixels = [] -for row in image: - for rgb in row: - pixels.append(int(round((0.21 * rgb[0] + 0.72 * rgb[1] + 0.07 * rgb[2]) / 255))) - -print("Compressing %i pixels..." % size_raw) +size_raw = len(pixels) +print("Compressing %i bits..." % size_raw) # First pixel +bits = [] compressed = [] run_pixel = pixels[0] run_count = 1 @@ -100,6 +113,7 @@ if run_count > 1: size_compressed = len(compressed) # Decide on compression or not +# size_compressed = size_raw # Disable compression if size_compressed < size_raw: print("Compression ratio: %.1f%%" % (100 - ((size_compressed * 100) / float(size_raw)))) data = compressed @@ -110,7 +124,6 @@ else: compression_type = 0 # Pad data to multiple of bits_per_frame -bits_per_frame = 20 * 8 data_size = len(data) padding = bits_per_frame - (data_size % bits_per_frame) for b in range(0, padding): @@ -119,17 +132,19 @@ for b in range(0, padding): padded_data_size = len(data) frame_count = padded_data_size // bits_per_frame +print("Data size: %i (%i frames)" % (data_size, frame_count)) + frames = [] -# Ping frame +# Wake-up ping frame frames.append(pr.make_ping_frame(PLID, 400)) -print("Generating %i data frames..." % frame_count) +print("Generating frames...") # Parameters frame frame = pr.make_mcu_frame(PLID, 0x05) -pr.append_word(frame, data_size // 8) # Byte count -frame.append(0x00) # Unused +pr.append_word(frame, data_size // 8) # Total byte count for group +frame.append(0x00) # Unused frame.append(compression_type) frame.append(page) pr.append_word(frame, width) @@ -148,7 +163,7 @@ i = 0 for fr in range(0, frame_count): frame = pr.make_mcu_frame(PLID, 0x20) pr.append_word(frame, fr) - for by in range(0, 20): + for by in range(0, bytes_per_frame): v = 0 # Bit string to byte for bi in range(0, 8): @@ -163,12 +178,13 @@ for fr in range(0, frame_count): frames.append(pr.make_refresh_frame(PLID)) # DEBUG -#f = open("out.txt", "w") -#for fr in frames: -# for b in fr: -# f.write(format(b, '02X') + " ") -# f.write("\n") -#exit() +f = open("frames.txt", "w") +for fr in frames: + for b in fr: + f.write(format(b, '02X') + " ") + f.write("\n") + +input("Place ESL in front of transmitter and press any key.") # Send data to IR transmitter if (port == "0"): diff --git a/tools_python/pr.py b/tools_python/pr.py index 0f8e1f2..6be92dd 100644 --- a/tools_python/pr.py +++ b/tools_python/pr.py @@ -48,7 +48,7 @@ def get_plid(barcode): return PLID def make_ping_frame(PLID, repeats): - frame = make_raw_frame(0x85, PLID, 0x17) + frame = make_raw_frame(0x85, PLID, 0x17) # 0x97 ? frame.append(0x01) frame.append(0x00) frame.append(0x00)