Duet3D Logo Duet3D
    • Tags
    • Documentation
    • Order
    • Register
    • Login

    PanelDue Image Display

    Scheduled Pinned Locked Moved
    PanelDue
    4
    14
    1.3k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • botundefined
      bot
      last edited by

      @dc42, have you seen the way Prusa encodes thumbnails for their mini printer? PrusaSlicer can generate a thumbnail and include it in the gcode, like so:

      ; thumbnail begin 220x124 3228
      ; iVBORw0KGgoAAAANSUhEUgAAANwAAAB8CAYAAAACRt5vAAAJPElEQVR4Ae2d2ZoTVRSF60FsWiFewP
      ; dxi4iI2iL3voIiIorzPADP5ouFTneHLkINZ9jD2uesi32TpM5ZWbX+pFKpU3vYbDbXD+vGjRsn+5p6
      ; XqKk57DQHFU3vcbxeljbSEOcxviHY0bVTc16+xLB68FaHAM2P/7/T25vNYpe4+R6sBKobaTWXFq6te
      ; BKrZ681pwrd5xBY1BPI6Xm1Tis8YZMC75aryLmo3T7oXTwlAk0QmthiqRmVMg04PP2WkKzdq6Tgcs1
      ; yNvIEoMkPyAiQSYJnofXGhmpfd1cZQOXYhaSkam6CJoueBpee+ajVHcRcEsiEI1cM1VCdySIrMDT8t
      ; o6I5Kaq4Abi7t58+bn6EYe6t5pHusuGScSNJ7gRcyHhm4CVwFcJFA8oWslH+7AtXBIeWhoiu5IcHiC
      ; t5YPHlJWCEp5Ds3I1OcIWz50El5750Mj1138LZCqZ+01kUDwhE7Ca8R8SOjOAi53MgRTSzRMbRMJAC
      ; /opLxGz0iNZl7albBtpOB7loTXUfJRun0XFy+XzkfYyqDz3GfWecwdJ3l5joQBFqZKjh8p6EiFsv8Q
      ; c80FqIQNHjqtjEiMmTv+YC1KYx5pzZGC3Sp06BkpnWewFiRthIbuSKFuGTjUfNTMO3iKqjFFS3OkQP
      ; cCHVpGajQP3qLmxC1pIWyELicfSLkevAXlmKptZKQQ9whcSgZQQJvTPSCJWjLVwshIIe4VOO+M1Goe
      ; NpvNddTaG2extCNSgAmdfT6kCh44iUWiBK5N4MYZIXACRlodLkQKLqGzz4cocOgnTcbaeHaSwC3lAB
      ; m8N85SIohLMUvD1Eih7Rm41H2PBt3k3wLeAnM1SGqOFNpegfPMh5Tm185SegmsmVdKc6TQ9ggcQkak
      ; NA+e4qTmqx0nUmh7Ag4lH5LzQSzPkZijZrxIoe0FOO18WOR66jVN9YcrNTVSaFsHThsM71wPVm/e4h
      ; Om1NRIoW0ZOK98WOa62ZsI5RgRKbQtAmf5Yeyd6+L+cFZvysLUSKFtDbgI+ZDcrsv+cAQOA7hIGZHS
      ; LHKrc2lR1qZGCm0LwEXLh6Tu4ouXp467vY7Fa0199tkmVHAj1te3j4rvzuyZD+lcd9muaqx5VwTOBj
      ; h02CxyLbI8R6OPloWhBM4PuEj5kNTcXX+4Q9174J4TOrV6/P6VUN9wmrkW+w239jiikfvHCZwNcJEz
      ; 4vYbLpV4NFOX9OyBe/GA0GnAdghctHzkZl8MuNzJEExNMWkM3IsH74YKdATYpoBL3TcosNW8Phu4Gm
      ; M8TU2dl8D5AJe7n7TzYZHrJvvD5c53CByhq69vRrCtAYeeD8lxBsnBrN6k9BxTwPH3XB1sucChZ0Rq
      ; vGb6w9WMS+BwgEPMh+T4TfaHyx1vDrjnhK4YthrgJPYpaq4HrTdoZaqE5iXg+P9cej0ewVYLnNT+Rc
      ; t1M/3hanSvAUfo0mDTAK5mXyPmmv3hEoF7dlGRILAETRO43P3u8a2WqiVUf7iU57WB++8+oZuDTRs4
      ; r3xI6g7RH27uManKBY7Q7a7+v+ICnFdGpDSzP1whcP/ev7b959NroSCRAe3oDDZv4CzzIVnsD1cJXE
      ; /QncOGA9yuoq3FDNEf7tBQhEPKMXB/n9ZfJ+2C9+gUlkevYMMAburESATo4E6aTJm59jgKcH+eXD2r
      ; SDAt1VfvHZ0VGnDW+ZDUHL4/nMS80sD98cnV7e+n9dvH8eB7eOto+/ACNETgvDIipRn2fzjp13sBty
      ; 900L689dZZoQLnmQ9J3XD94XLmltJsAdxlvXNW3oDtQNqBtYPsiwvYUIGTyodnrvePh+8PJ2GqB3D7
      ; +nVXH+kDeB768+Dv4IkAnBQwSLleXS2gIVBjjprxEIAb1y+j+vneea0B9fTu8fbpB8fb7y7q2zvH2y
      ; d3ToN/5zL8kYDTzodXrpvuD9cScD/de/usfvzwsn44re/v7uq4KeAQMyI1bnMrvkvmIXAYwKHmQ3K8
      ; bvrDEThs4NAzIrV90/3hUo/bCZwfcKn7CA260u2q7ku5NJG3kTnmEDgf4FDzoZnrbvrDLRlF4GyBQ/
      ; owts51V70F5vQRODvgIuZDUnfX/eH2ugmcDXDosFnkWqU/nJUptYaO+8MROFvgImQEuj+c9po1adj4
      ; DcdvOI9cd90fjr/h/H/DoWdk7XET4HLP5iCYuqSHwNn/LYCej5RcqwOXOyGKqWs6CBz/h7PKdVdXms
      ; y9jsD5XtoVISNS22X3hys1xNrUnPkIXH/XUmpkOmWc5vvDpcxD4DBXC1hlxHK8pP5wkm/ccuzU7Qhc
      ; H+vhEHLdRH+42vEIXH8rvmvHK52nuXualIxB4HBvIoSSEan5wvaHk9RN4Pq4a1fp/JK6Q96XUvpYnM
      ; BhA1eyz1FzDX3n5SlNGkYSOHzgUve/9IextOaw/eEkdRO4OMAtZQENtCndIbvnSM9F4GIBd5iRSCtV
      ; oPvD7SpCfzgC5wOcVT66AI7fcAQuJyNhvuGi/IZbepzA9f0bTjsfkrp5lpLA8SylYa75PxyB4/9whr
      ; keNAKsCZvEdgSOV5pYZ3o/P6+lJHC8ltIw11wtcFEEThe46PmQmse9P5zm2AQuJnAtZ48rvkdF4HSA
      ; s9h3njnMGc/kniZWRtaaSuD8gPPOh1Wu2R+OwLkC5/Fh7Jlr3pfyDegInCRwreWjVne3/eGWXkPgZI
      ; BL8TpSRiQ0sz/cxGMETha4Ja8j5ENSN7vnzKxEIHB1wM0FNXo+anV32x9ur3lJN4ErA24tH9EyIqlZ
      ; rQNq9G+4V9ARuCzglrxuMR9mwGkf61qYmfq7gsClASfhNWI+JHXzLGXiawjcMnCSXqNmREJz1f9wa5
      ; OimCqlmcBNA6fhdZR85OrmlSaZ2xG414HT9BoNNontBs3BPU2VmG8JOgI3D5vX/rLOZMn2za0WkJ5n
      ; aaxegfPwGjUfueO5r4eTGtdr7N6Aa3U/Wo27uuJb65Mm4rfn0hytA4fkdZR8TM3T3D1NtHWvzdcacM
      ; heW+ZMaj73u3bVzO2lOWXu6MBF8lojW1q5DnlfypLXW5o6rmjAlbxH5iNdB/Sdl0tfg6obFbgWvUbN
      ; NXsLOGn2Bq4nr5F0h+yeg2jm3E7P0awFXI3XEX1G1g3dH24fgKhr7SIEgF7bFnxDxsNPXXS9UTXTa5
      ; t6CT7Sg5eV9vIgAAAAAElFTkSuQmCC
      ; thumbnail end
      

      That equates to about 4 KB if I'm not mistaken, at 220x124 resolution.

      *not actually a robot

      1 Reply Last reply Reply Quote 0
      • dc42undefined
        dc42 administrators
        last edited by

        @bot, that would be entirely doable.

        Duet WiFi hardware designer and firmware engineer
        Please do not ask me for Duet support via PM or email, use the forum
        http://www.escher3d.com, https://miscsolutions.wordpress.com

        1 Reply Last reply Reply Quote 0
        • botundefined
          bot
          last edited by

          Cool! The PrusaSlicer fork SuperSlicer has added the functionality to put the thumbnail on non-mini printer profiles. Perhaps a different resolution is possible, as well. We could check the PrusaSlicer/SuperSlicer source.

          If another resolution is possible, what would be ideal for the paneldue? I guess we should ensure the smallest paneldues can see the thumbnails. This could be included into the "RepRapFirmware" G-Code flavour that is seemingly soon to be added to PrusaSlicer.

          Perhaps DWC could grab these tumbnails, too.

          *not actually a robot

          1 Reply Last reply Reply Quote 0
          • MartinNYHCundefined
            MartinNYHC
            last edited by

            Very nice. +1 😉

            1 Reply Last reply Reply Quote 0
            • dc42undefined
              dc42 administrators
              last edited by

              Do you have a link to the specification for the image encoding?

              Duet WiFi hardware designer and firmware engineer
              Please do not ask me for Duet support via PM or email, use the forum
              http://www.escher3d.com, https://miscsolutions.wordpress.com

              1 Reply Last reply Reply Quote 0
              • botundefined
                bot
                last edited by bot

                I do not think any public documentation of this exists, but here is the first most obvious reference to it that I can find in the source:

                Prusa3D/PrusaSlicer/src/libslic3r/GCode.cpp#L981

                	static void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, const std::vector<Vec2d> &sizes, WriteToOutput output, ThrowIfCanceledCallback throw_if_canceled)
                	{
                	    // Write thumbnails using base64 encoding
                	    if (thumbnail_cb != nullptr)
                	    {
                	        const size_t max_row_length = 78;
                	        ThumbnailsList thumbnails;
                	        thumbnail_cb(thumbnails, sizes, true, true, true, true);
                	        for (const ThumbnailData& data : thumbnails)
                	        {
                	            if (data.is_valid())
                	            {
                	                size_t png_size = 0;
                	                void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)data.pixels.data(), data.width, data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1);
                	                if (png_data != nullptr)
                	                {
                	                    std::string encoded;
                	                    encoded.resize(boost::beast::detail::base64::encoded_size(png_size));
                	                    encoded.resize(boost::beast::detail::base64::encode((void*)&encoded[0], (const void*)png_data, png_size));
                
                	                    output((boost::format("\n;\n; thumbnail begin %dx%d %d\n") % data.width % data.height % encoded.size()).str().c_str());
                
                	                    unsigned int row_count = 0;
                	                    while (encoded.size() > max_row_length)
                	                    {
                	                        output((boost::format("; %s\n") % encoded.substr(0, max_row_length)).str().c_str());
                	                        encoded = encoded.substr(max_row_length);
                	                        ++row_count;
                	                    }
                
                	                    if (encoded.size() > 0)
                	                    	output((boost::format("; %s\n") % encoded).str().c_str());
                
                	                    output("; thumbnail end\n;\n");
                
                	                    mz_free(png_data);
                	                }
                	            }
                	            throw_if_canceled();
                	        }
                	    }
                	}
                

                So the thumbnail seems to be encoded in 'base64' by the boost library. The start of the thumbnail says ; thumbnail begin followed by the pixel resolution and the encoded size. I suppose it's an encoding of a PNG file of some format.

                *not actually a robot

                1 Reply Last reply Reply Quote 0
                • botundefined
                  bot
                  last edited by bot

                  @dc42 I found this website which can directly decode the image that I posted above, which was merely an example I found on the internet from someone's publicly posted gcode.

                  https://base64.guru/converter/decode/image/png

                  Encoded PNG with added information removed:

                  iVBORw0KGgoAAAANSUhEUgAAANwAAAB8CAYAAAACRt5vAAAJPElEQVR4Ae2d2ZoTVRSF60FsWiFewP
                  dxi4iI2iL3voIiIorzPADP5ouFTneHLkINZ9jD2uesi32TpM5ZWbX+pFKpU3vYbDbXD+vGjRsn+5p6
                  XqKk57DQHFU3vcbxeljbSEOcxviHY0bVTc16+xLB68FaHAM2P/7/T25vNYpe4+R6sBKobaTWXFq6te
                  BKrZ681pwrd5xBY1BPI6Xm1Tis8YZMC75aryLmo3T7oXTwlAk0QmthiqRmVMg04PP2WkKzdq6Tgcs1
                  yNvIEoMkPyAiQSYJnofXGhmpfd1cZQOXYhaSkam6CJoueBpee+ajVHcRcEsiEI1cM1VCdySIrMDT8t
                  o6I5Kaq4Abi7t58+bn6EYe6t5pHusuGScSNJ7gRcyHhm4CVwFcJFA8oWslH+7AtXBIeWhoiu5IcHiC
                  t5YPHlJWCEp5Ds3I1OcIWz50El5750Mj1138LZCqZ+01kUDwhE7Ca8R8SOjOAi53MgRTSzRMbRMJAC
                  /opLxGz0iNZl7albBtpOB7loTXUfJRun0XFy+XzkfYyqDz3GfWecwdJ3l5joQBFqZKjh8p6EiFsv8Q
                  c80FqIQNHjqtjEiMmTv+YC1KYx5pzZGC3Sp06BkpnWewFiRthIbuSKFuGTjUfNTMO3iKqjFFS3OkQP
                  cCHVpGajQP3qLmxC1pIWyELicfSLkevAXlmKptZKQQ9whcSgZQQJvTPSCJWjLVwshIIe4VOO+M1Goe
                  NpvNddTaG2extCNSgAmdfT6kCh44iUWiBK5N4MYZIXACRlodLkQKLqGzz4cocOgnTcbaeHaSwC3lAB
                  m8N85SIohLMUvD1Eih7Rm41H2PBt3k3wLeAnM1SGqOFNpegfPMh5Tm185SegmsmVdKc6TQ9ggcQkak
                  NA+e4qTmqx0nUmh7Ag4lH5LzQSzPkZijZrxIoe0FOO18WOR66jVN9YcrNTVSaFsHThsM71wPVm/e4h
                  Om1NRIoW0ZOK98WOa62ZsI5RgRKbQtAmf5Yeyd6+L+cFZvysLUSKFtDbgI+ZDcrsv+cAQOA7hIGZHS
                  LHKrc2lR1qZGCm0LwEXLh6Tu4ouXp467vY7Fa0199tkmVHAj1te3j4rvzuyZD+lcd9muaqx5VwTOBj
                  h02CxyLbI8R6OPloWhBM4PuEj5kNTcXX+4Q9174J4TOrV6/P6VUN9wmrkW+w239jiikfvHCZwNcJEz
                  4vYbLpV4NFOX9OyBe/GA0GnAdghctHzkZl8MuNzJEExNMWkM3IsH74YKdATYpoBL3TcosNW8Phu4Gm
                  M8TU2dl8D5AJe7n7TzYZHrJvvD5c53CByhq69vRrCtAYeeD8lxBsnBrN6k9BxTwPH3XB1sucChZ0Rq
                  vGb6w9WMS+BwgEPMh+T4TfaHyx1vDrjnhK4YthrgJPYpaq4HrTdoZaqE5iXg+P9cej0ewVYLnNT+Rc
                  t1M/3hanSvAUfo0mDTAK5mXyPmmv3hEoF7dlGRILAETRO43P3u8a2WqiVUf7iU57WB++8+oZuDTRs4
                  r3xI6g7RH27uManKBY7Q7a7+v+ICnFdGpDSzP1whcP/ev7b959NroSCRAe3oDDZv4CzzIVnsD1cJXE
                  /QncOGA9yuoq3FDNEf7tBQhEPKMXB/n9ZfJ+2C9+gUlkevYMMAburESATo4E6aTJm59jgKcH+eXD2r
                  SDAt1VfvHZ0VGnDW+ZDUHL4/nMS80sD98cnV7e+n9dvH8eB7eOto+/ACNETgvDIipRn2fzjp13sBty
                  900L689dZZoQLnmQ9J3XD94XLmltJsAdxlvXNW3oDtQNqBtYPsiwvYUIGTyodnrvePh+8PJ2GqB3D7
                  +nVXH+kDeB768+Dv4IkAnBQwSLleXS2gIVBjjprxEIAb1y+j+vneea0B9fTu8fbpB8fb7y7q2zvH2y
                  d3ToN/5zL8kYDTzodXrpvuD9cScD/de/usfvzwsn44re/v7uq4KeAQMyI1bnMrvkvmIXAYwKHmQ3K8
                  bvrDEThs4NAzIrV90/3hUo/bCZwfcKn7CA260u2q7ku5NJG3kTnmEDgf4FDzoZnrbvrDLRlF4GyBQ/
                  owts51V70F5vQRODvgIuZDUnfX/eH2ugmcDXDosFnkWqU/nJUptYaO+8MROFvgImQEuj+c9po1adj4
                  DcdvOI9cd90fjr/h/H/DoWdk7XET4HLP5iCYuqSHwNn/LYCej5RcqwOXOyGKqWs6CBz/h7PKdVdXms
                  y9jsD5XtoVISNS22X3hys1xNrUnPkIXH/XUmpkOmWc5vvDpcxD4DBXC1hlxHK8pP5wkm/ccuzU7Qhc
                  H+vhEHLdRH+42vEIXH8rvmvHK52nuXualIxB4HBvIoSSEan5wvaHk9RN4Pq4a1fp/JK6Q96XUvpYnM
                  BhA1eyz1FzDX3n5SlNGkYSOHzgUve/9IextOaw/eEkdRO4OMAtZQENtCndIbvnSM9F4GIBd5iRSCtV
                  oPvD7SpCfzgC5wOcVT66AI7fcAQuJyNhvuGi/IZbepzA9f0bTjsfkrp5lpLA8SylYa75PxyB4/9whr
                  keNAKsCZvEdgSOV5pYZ3o/P6+lJHC8ltIw11wtcFEEThe46PmQmse9P5zm2AQuJnAtZ48rvkdF4HSA
                  s9h3njnMGc/kniZWRtaaSuD8gPPOh1Wu2R+OwLkC5/Fh7Jlr3pfyDegInCRwreWjVne3/eGWXkPgZI
                  BL8TpSRiQ0sz/cxGMETha4Ja8j5ENSN7vnzKxEIHB1wM0FNXo+anV32x9ur3lJN4ErA24tH9EyIqlZ
                  rQNq9G+4V9ARuCzglrxuMR9mwGkf61qYmfq7gsClASfhNWI+JHXzLGXiawjcMnCSXqNmREJz1f9wa5
                  OimCqlmcBNA6fhdZR85OrmlSaZ2xG414HT9BoNNontBs3BPU2VmG8JOgI3D5vX/rLOZMn2za0WkJ5n
                  aaxegfPwGjUfueO5r4eTGtdr7N6Aa3U/Wo27uuJb65Mm4rfn0hytA4fkdZR8TM3T3D1NtHWvzdcacM
                  heW+ZMaj73u3bVzO2lOWXu6MBF8lojW1q5DnlfypLXW5o6rmjAlbxH5iNdB/Sdl0tfg6obFbgWvUbN
                  NXsLOGn2Bq4nr5F0h+yeg2jm3E7P0awFXI3XEX1G1g3dH24fgKhr7SIEgF7bFnxDxsNPXXS9UTXTa5
                  t6CT7Sg5eV9vIgAAAAAElFTkSuQmCC
                  

                  Produces this image:

                  download.png

                  Note that the background uses alpha transparency.

                  *not actually a robot

                  1 Reply Last reply Reply Quote 0
                  • wilrikerundefined
                    wilriker
                    last edited by

                    Support for the thumbnail included by PrusaSlicer is planned for the version PanelDueFirmware 3.3 (i.e. after the current 3.2 is finished).

                    Manuel
                    Duet 3 6HC (v0.6) with RPi 4B on a custom Cartesian
                    with probably always latest firmware/DWC (incl. betas or self-compiled)
                    My Tool Collection

                    botundefined 1 Reply Last reply Reply Quote 2
                    • botundefined
                      bot @wilriker
                      last edited by

                      @wilriker FYI the newest versions of PrusaSlicer include the ability to embed a thumbnail of an arbitrary size. No modifications necessary to get a thumbnail encoded now.

                      *not actually a robot

                      1 Reply Last reply Reply Quote 0
                      • wilrikerundefined
                        wilriker
                        last edited by

                        I was looking into this for the past week and unfortunately I have to report failure to get it done. The problem is that we just have way to few RAM available on PanelDue. Maybe in future version of PanelDue with much more RAM this could be done for but for now it is technically impossible.

                        Manuel
                        Duet 3 6HC (v0.6) with RPi 4B on a custom Cartesian
                        with probably always latest firmware/DWC (incl. betas or self-compiled)
                        My Tool Collection

                        MartinNYHCundefined 1 Reply Last reply Reply Quote 0
                        • MartinNYHCundefined
                          MartinNYHC @wilriker
                          last edited by

                          @wilriker Unfortunately that makes sense. Thanks for looking into it.

                          If we're just "together" 🙂 I would like to see the current pinting speed on PanelDue.

                          1 Reply Last reply Reply Quote 1
                          • mfs12undefined mfs12 referenced this topic
                          • First post
                            Last post
                          Unless otherwise noted, all forum content is licensed under CC-BY-SA