Santek EZ Door Sign: Difference between revisions
| Line 153: | Line 153: | ||
|site+1 | |site+1 | ||
|0x7E | |0x7E | ||
|Redraws the slide | |Redraws the slide (0 ~ 4) | ||
|- | |- | ||
|0xBB | |0xBB | ||
|0x01 | |||
|0x00 | |0x00 | ||
|0x01 | |||
|site | |||
| | |||
| | |||
|Redrew the slide ok. | |||
|- | |||
|0xBB | |||
|0x00 | |||
|0x01 | |||
|0x01 | |||
|site | |||
|variable | |||
|0x7E | |||
|Check if site is blank. if returned 4th byte is 254, then isBlank is false | |||
|- | |||
|0xBB | |||
|0x01 | |||
|0x01 | |0x01 | ||
|0x01 | |0x01 | ||
| Line 162: | Line 180: | ||
|variable | |variable | ||
|0x7E | |0x7E | ||
|site is blank. | |site given bacak is 0xFE, meaning slide is not blank. | ||
|} | |} | ||
The checksum is calculated by summing everything | The checksum is calculated by summing everything | ||
Revision as of 07:05, 27 March 2025
The Santek EZ Door Sign is cordless e-ink display intended to be mounted outside of offices or rooms. It is capable of storing 5 custom images that can be displayed and rotated with the side button.
The 2.9" variant which I obtained has a resolution of 296 x 128 pixels and is capable of displaying black, white, and red.
Serial protocol
Background
Santek provides a Windows based app written in C# that is able to interact with the door signs. My goal is to have some Linux based device that can periodically update these displays (such as the weather or calendar events on an hourly basis). In order to do that, I will need to figure out how exactly this device talks via the USB port.
There are some GitHub projects that try to interface with this device already including https://github.com/m3m0r7/ez-door-sign in PHP and https://github.com/kenichi884/ezsign.py in Python. However, the documentation on the serial protocol is a bit lacking. Fortunately, the protocol doesn't seem too complicated.
Serial configuration
Use 9600 baud. No parity.
The display has to be on. Ensure that the blue LED is lit before trying to talk to it via serial.
Commands
Here are some of the supported commands by the display.
Command Type is 0 if it's a command that's sent to the display. It will be a 1 if it's data that's a response to a command made by the display.
| Header | Command
Type |
Command
ID |
Data
Length |
Data | Chksum | Ending | Notes |
|---|---|---|---|---|---|---|---|
| 0xBB | 0x00 | 0x03 | 0x02 | site-canvas | variable | 0x7E | set image head data. This specifies which canvas you are overwriting.
Data is always 2 bytes long, containing:
|
| 0xBB | 0x01 | 0x03 | 0x01 | 0x01 | 0x7E | did set image head data succeed? Data should be 0x01 | |
| 0xBB | 0x00 | 0x04 | 0x12 | column-bitmap | variable | 0x7E | send image bitmap data by column.
Data is always 18 bytes long. 2 for column number, 16 for bitmap data. Bitmap data here is based on the canvas setting in order to get that extra bit for color.
This is how you can retrieve data for the 296x128 pixel display. |
| 0xBB | 0x01 | 0x04 | 0x01 | 0x01 | 0x7E | did send image row data succeed? Data should be 0x01 | |
| 0xBB | 0x00 | 0x05 | 0x04 | site-canvas-column | variable | 0x7E | Get image bitmap from display memory.
Data is always 4 bytes long.
To retrieve the actual color, you have to read both canvas See the response payload below. |
| 0xBB | 0x01 | 0x05 | 0x12 | column-bitmap | variable | 0x7E | Bitmap data received from a get command. The response message is always 24 bytes long.
There are 18 bytes of payload data and is the same format as the send-image-column command.
|
| 0xBB | 0x06 | 0x7E | iap model | ||||
| 0xBB | 0x00 | 0x07 | 0x01 | 0x00 | 0x08 | 0x7E | power off |
| 0xBB | 0x00 | 0x00 | 0x01 | 0xFE | 0xFF | 0x7E | next slide |
| 0xBB | 0x00 | 0x00 | 0x01 | 0xFF | 0x00 | 0x7E | previous slide (called 'up' in C# code) |
| 0xBB | 0x00 | 0x00 | 0x01 | site | site+1 | 0x7E | Redraws the slide (0 ~ 4) |
| 0xBB | 0x01 | 0x00 | 0x01 | site | Redrew the slide ok. | ||
| 0xBB | 0x00 | 0x01 | 0x01 | site | variable | 0x7E | Check if site is blank. if returned 4th byte is 254, then isBlank is false |
| 0xBB | 0x01 | 0x01 | 0x01 | site | variable | 0x7E | site given bacak is 0xFE, meaning slide is not blank. |
The checksum is calculated by summing everything
When reading data...
- read and discard until you see 187
- ???
Color data
The site-canvas-row data that you read/write using the commands above determine the color. Because we only use one bit per canvas, the canvas is pretty much how you define an additional bit per pixel.
| Canvas = 0 | Canvas = 1 | Color | |
|---|---|---|---|
| Pixel bit value | 0 | 0 | Black |
| 1 | 0 | White | |
| 0 | 1 | Red |
For black and white only pictures, you can effectively ignore setting canvas=1.