Good Dispay ePaper for Arduino

Oups
Attaching the serial output to you.
Jean-Claude

outpout serial monitor.pdf (16 KB)

@claudius310, Good Morning Jean-Claude,

thank you for the feedback and the diagnostic output.

I don't understand why your test with one display didn't work before and now does work. But this is not important, if it works now.

The diagnostic output shows that garbage has been read from the controller. Most likely you didn't connect the MISO line. The IT8951 board has a MISO line. This has no influence on working or not, as the values read are not used. But it is helpful to verify that SPI communication with the controller works correctly.

Short diagnostic output could be added to the post in a code window. For copying from Serial Monitor click on the begin and shift-click on the end, to select, then ctrl-C to copy.

Remark on use of common RST line: GxEPD2 doesn't initialize any controller registers in the init() method. All controller initializations are done when needed before writing to the controller, or before refresh(). This is important, e.g. for controller deep sleep handling. Thanks to this, common RST line handling can be used in practice as simple as you do. But the example GxEPD2_MultiDisplayExample.ino shows how it should be done in theory. The init() call for the second display resets the controller of the first display, when done without this measure. Any initialization of the first controller would be lost. Therefore in theory the activation of the common RST should be done separately, and -1 used for the RST parameter. Unfortunately any hibernate() call would then be ignored. For most TFT libraries this is important, as controller registers are usually set in init() or begin().

Jean-Marc

Dear Jean-Marc,
First of all thank you for your great library that I’ve been using for quiet some time now.

I am trying to make Gxepd2 work with a GDEH0154D67 display (bare from good display )and custom esp32 board.
The driver circuit is the same as in figure 1.6 from the datasheet, with a 68uH inductor instead of 10uH. I was using this board with the older version GDEP015OC1 and gxepd2, which worked fine.

I’m using the following constructor with pins 15 and 14 as MOSI and SCK. MISO isnt connected.

GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 19, /*RST=*/ 32, /*BUSY=*/ 34)); // GDEH0154D67

The symptoms are the following with the notPaged_example or gxepd_example :

  • full display updates work but do not flicker. I can see all the images as if they were partial updates, even after powerOn
  • partial update won’t work.

The serial output doesn’t say much besides the normal activity and timing. There is no busy timeout.

I tested the code from good display here, which works fine for both partial and full update.

I was wondering if you could give me hints to understand the difference between GxEpd2 and Good display’s code? I saw different designs for the reset circuit and saw that waveshare has also changed it. Could it be the cause of the problem?

Thank you and best wishes for 2021!

@emde34,

thank you for the wishes; Good New Year to you, too.

Please post diagnostic output in a code window, so I can get a first idea. Thanks.

Added: what RESE resistor value do you use? There was one report about an issue with wrong value.

Jean-Marc

I use 3ohm for RESE. Here is the output from notPaged example of GxEPD2.

setup
_PowerOn : 95003
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95003
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95003
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95003
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
setup done

Thank you.

@emde34,

your RESE value is correct. See page 9 of https://www.good-display.com/public/html/pdfjs/viewer/viewernew.html?file=https://v4.cecdn.yun300.cn/100001_1909185148/GDEH0154D67.pdf your too high inductance value could cause issues with big e-paper panels that need higher power for refresh.

There is something wrong with your refresh times. At what temperature do you use your panel?

full refresh: e.g. 2509602us / 781001 -> factor 3.2 too fast partial refresh: e.g. 457282us / 95001 -> factor 4.8 too fast

as the factors are different, it is not just a wrong clock rate, e.g. PLL parameter.

Both full and partial waveform tables of this panel are in OTP and are temperature dependent. Maybe the temperature sensor of your panel is broken. Or the wavetables are wrong (e.g. for a different panel).

Jean-Marc

Added: please report the inking on the flex connector, so I can compare, and the sticker on the back if there is one.

@emde34,

I read your first post again. I had forgotten this line:

I tested the code from good display here, which works fine for both partial and full update.

I assume you used the Arduino code.

It is possible that the newer versions of the panel have different waveform tables and use a different clock rate. Therefore my addition for differential update may no longer work; I would need to read some parameters from the OTP of a current panel.

You could check by commenting out the following lines in GxEPD2_154_D67.cpp from line 336 on:

  // PingPong for mode 2 doesn't work with GxEPD2
  // not available for mode 1, and has some "quirks"
  // values as read from OTP (0x2d) 2.1.2020, except F[6]
  _writeCommand(0x37); //Write Register for Display Option
  _writeData(0x00); // A
  _writeData(0x00); // B
  _writeData(0x00); // C
  _writeData(0x00); // D
  _writeData(0xff); // E
  _writeData(0x00); // F F[6]=0 : disable PingPong
  _writeData(0x00); // G
  _writeData(0x00); // H
  _writeData(0x00); // I
  _writeData(0x01); // J

without this, partial update will not work correctly in all cases. But you could see if refresh times are normal with this change.

Jean-Marc

Added: maybe the first byte (// A) would need to be 0x80 to select the alternate waveform set. I can't verify. Added as reminder for me. I should ask for an actual panel with my next order.

Hello Jean Marc,

I assume you used the Arduino code.

No, I used the esp32 code but they are nearly the same.

So here are the results of your suggestions. 1. commenting out line 340 to 350:

  • Full update: The screen now does flicker but the content is either not updated or load the previous/same content.
  • Partial updates work but the content is a bit mixed up. For example the hello world with black box alternates between hello word/black box and with good display image/black box
setup
helloWorld
_PowerOn : 96003
_Update_Full : 1990001
_PowerOff : 141001
helloWorld done
helloFullScreenPartialMode
_PowerOn : 96001
_Update_Part : 781001
helloFullScreenPartialMode done
helloArduino
_Update_Part : 781001
helloArduino done
helloEpaper
_Update_Part : 781001
helloEpaper done
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96003
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781003
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781003
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781000
_Update_Part : 781001
helloWorld
_Update_Full : 1990001
_PowerOff : 141001
helloWorld done
_PowerOn : 96001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_PowerOff : 141001
deepSleepTest
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
deepSleepTest done
setup done
  1. Changing line A to 0x80 (keeping the other lines uncommented): no effect.

Let me know if you want me to try other things. Thank you for your support! Emde.

@emde34, yes, again I would like to see diagnostic output (with the commented out version), to know refresh times.

Sorry I didn't see you posted 2 messages in a row. I updated my previous message with the serial output for the commented lines. Here is the one for 0x80 parameter.

setup
helloWorld
_PowerOn : 96003
_Update_Full : 1990001
_PowerOff : 141001
helloWorld done
helloFullScreenPartialMode
_PowerOn : 96001
_Update_Part : 781001
helloFullScreenPartialMode done
helloArduino
_Update_Part : 781001
helloArduino done
helloEpaper
_Update_Part : 781001
helloEpaper done
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96003
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
_PowerOn : 96001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781003
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781003
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781000
_Update_Part : 781001
helloWorld
_Update_Full : 1990001
_PowerOff : 141001
helloWorld done
_PowerOn : 96001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_Update_Part : 781001
_PowerOff : 141001
deepSleepTest
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1990001
_PowerOff : 141001
_PowerOn : 96001
_Update_Full : 1991001
_PowerOff : 141001
deepSleepTest done
setup done

setup
helloWorld
_PowerOn : 95003
_Update_Full : 781001
_PowerOff : 141001
helloWorld done
helloFullScreenPartialMode
_PowerOn : 95001
_Update_Part : 95001
helloFullScreenPartialMode done
helloArduino
_Update_Part : 95001
helloArduino done
helloEpaper
_Update_Part : 95001
helloEpaper done
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95003
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95003
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95003
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
helloWorld
_Update_Full : 781001
_PowerOff : 141001
helloWorld done
_PowerOn : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_Update_Part : 95001
_PowerOff : 141001
deepSleepTest
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
_PowerOn : 95001
_Update_Full : 781001
_PowerOff : 141001
deepSleepTest done
setup done

I use the display at room temperature, probably slightly below 20°C. I am on vacation this week and only brought one display, so I will test this week end with another display to see if the problem is the same. Also I dont have my screwdrivers with me so I can't access the ffc cable. I will report as soon as I can.

@emde34,

thank you for the diagnostic output.

Comparison of the refresh times with my display makes it clear that your display has a different waveform table.
Full refresh times are similar, I have either ~2509602us (early morning) or ~1986670us, depending on temperature.
But differential refresh times are considerably different, I have ~456740us.

From some distance (in time) I found an obvious alternative solution to the refresh mode dependent buffer switching of this controller:

void GxEPD2_154_D67::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
{
  // this controller switches buffers (ping-pong) after differential refresh (display mode 2), but not after full refresh (display mode 1)
  // the easy solution is to update both buffers. both buffers need be set equal and equal to the display after refresh.
  _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
  _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm);
}

But for some unknown reason this doesn’t work completely with my display. It still works with ping-pong disabled.

The symptoms are a white screen instead Hello World!, grey Hello World on the second screenful, and some remains on the 200x200 partial refresh screens.

I attach the modified GxEPD2_154_D67.cpp file, so you could check the behavior with your screen and report.

Jean-Marc

GxEPD2_154_D67.cpp (13.4 KB)

I think I get the same behavior as your display. But it's definitely better than before. Full updates work ok (except first hello world). Partial updates kinda work but as your said, the previous ram content still remains and slowly fades out as partial updates go on.

I'm currently working on my own subclass of Adafruit GFX inspired from Good display's code, your library and Adafruit EPD. So far I got the full update and partial update (in full window) to work. I still need to rework the ram settings for partial update in a partial window but it looks promising. I'll post the code when done.

Using the panel settings from good display code: For full updates: I write either the buffer to the black ram (0x24) or both black and red ram (0x24+0x26) . Both seems to work. For partial update. I write both rams in a full update first, and then do only black ram 0x24 writings before triggering a partial update.

@emde34

thank you for providing the information I had asked for.

Hi Jean Marc,
I’m trying to wrap my head around the partial window ram settings (0x44, 0x45, 0x4e 0x4f) but my brain is about to get fried.
I got the full update and partial update in full window working but I just can’t find the good RAM settings for partial window partial updates!

I got it to kind of work by writing the full buffer instead of just the partial buffer window but it’s far from great.
I just can’t find good documentation on these controllers and need to take a break before I throw my display through the window.

Attached is my code if you want to test how it does with your display. Full and partial updates work on mine.
I’ll post cleaner code in the next days.

AFEPD.zip (4.16 KB)

@emde34,

you don't need to throw away your e-paper display.

The controller of this display needs both previous and current buffer to be written with the same data before a full refresh, if the ping-pong enable bit is set, because of an undocumented feature of the controller.

You can either wait for the next version of GxEPD2.

Or you can take a look at the controller specs for command 0x2d and 0x37 for read or write Display Option Registers. Use 0x2d to read the option registers of your display, and adapt the parameters of the 0x37 command in _InitDisplay(). Clear the ping-pong enable bit (F[6]). To read from the controller with GxEPD2, you can use the SW SPI option, see extras/sw_spi/README.MD

Jean-Marc

Version 1.2.16 of library GxEPD2 is available through Library Manager.

  • fix for GDEH0154D67, to work independent of OTP version (ping-pong issue)

Jean-Marc

Thank you Jean-Marc for the fix, works well now.

Cheers from canton de Vaud ;)

spirou91: Hi @ZinggJM ,

Thank you for the impressive work you have done in setting up this library.

I owe a screen that I guess to be refered as GDEH029Z13.

I did a test with your library (GxEPD2) using GDEW029Z10 (b/w/r) and GDEW029T5 (b/w) references.

Both of them are almost working using the HelloWorld example, except for a small strip at the top of the screen that does not refresh at all. (see attached picture)

I would have liked to know if you can give me some indications on what to adapt in the library to make it work?

Thank you for your help,

Thank you for the panel you sent.

It is a 2.6" 3-color e-paper display of unknown provenience.

It has a 24 pin flex connector with marks for pin 1 and pin 24.

I connected it to a DESPI-C02 with pin 1 to pin 1, pin 24 to pin 24, bottom connection. Maybe this was wrong. It didn't survive. Connecting the other way didn't work either. I should have asked you how you connected, or a link to information.

Neither Good Display nor Waveshare have this display, so I would not have added it to GxEPD2 anyway. They have a 2.66" 3-color display with a different controller.

Never send ESD sensible devices without ESD protection bag. It may have been dead on arrival.

Jean-Marc

I need to learn how to deal with devices of unknown provenience and improper ESD protection. Jean-Marc

Hello, I have a little problem writing using the library: U8g2_for_Adafruit_GFX.h. in GxPD2 with an epaper screen: https://www.waveshare.com/6inch-e-Paper-HAT.htm (800 x 600) I would like to write with a character size larger than u8g2_font_logisoso92_tn, but I can't find a solution. Any ideas?

Thank you Jean-Claude

hello, To adapt the font size to different screens, I found a small application on the internet that makes libraries that can be used in Adafruit GFX Font format. You simply have to position the writing with a certain offset because the library produced is suitable for smaller screens http://oleddisplay.squix.ch/#/home

Jean-Claude