periph / devices

Go·Hardware·Lean - Device drivers
https://periph.io
Apache License 2.0
83 stars 37 forks source link

Display driver viewable via HTTP #26

Closed hansmi closed 2 years ago

hansmi commented 2 years ago

What kind of new feature are you looking for?

In the interest of simplifying development on a host machine I implemented a display.Drawer which is also an HTTP request handler. All client requests get an initial snapshot of the graphics buffer and are updated further on every change.

The protocol used is "MJPEG" (multipart/x-mixed-replace with images) which is often also used by IP cameras. Because of its better suitability for computer-drawn graphics the PNG image format is used by default, but JPEG can be selected as a default or using a URL parameter.

The only dependencies are the standard library and periph.io/display.

A snapshot of the source code is available at https://github.com/hansmi/periph-webdisplay with an example clock implementation at https://github.com/hansmi/periph-webdisplay/tree/main/example/clock. Go documentation is at https://pkg.go.dev/github.com/hansmi/periph-webdisplay (still a bit underpolished). Unit tests ensure that everything works.

I think such a driver would be useful to have in periph.io itself. I'm filing this feature request to see whether there's interest for opening a pull request and to discuss a few things before I finalize the documentation and API.

If a target device has a network interface (e.g. a Raspberry Pi), the proposed driver can also be used to access the display content remotely. I intend to write another driver combining multiple displays into one interface, distributing updates to all.

Questions:

I'm currently naming the driver webdisplay. Does anyone have a better name in mind?

Is github.com/periph/devices the most suitable repository?

Do you plan to:

maruel commented 2 years ago

Yes github.com/periph/devices for the generic implementation and github.com/periph/cmd for an executable sounds good. Thanks!

If I were to implement it personally, I would probably name it something like "VideoSink" or the "VideoServing" but I don't have a strong opinion.