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

    RepRapFirmware 3.6.0-alpha.2 for Duet main boards available

    Scheduled Pinned Locked Moved
    Beta Firmware
    14
    83
    6.1k
    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.
    • edspedundefined
      edsped
      last edited by

      Am I the only one having connection interrupted errors with the most recent build? I'm hard wired into a Ubiquiti network if that matters.

      Bed leveling is working as intended.

      Controller MB6HC using built in wired network.
      Jubilee toolchanger with (4) RRF-36's running the tools.

      M12 after a few "Connection Interrupted" errors

      m122
      === Diagnostics ===
      RepRapFirmware for Duet 3 MB6HC version 3.6.0-alpha.4 (2024-08-13 15:11:47) running on Duet 3 MB6HC v1.02 or 1.02a (standalone mode)
      Board ID: 08DJM-9P63L-DJ3T8-6J1F2-3SS6J-KA6VB
      Used output buffers: 1 of 40 (38 max)
      === RTOS ===
      Static ram: 133840
      Dynamic ram: 128256 of which 128 recycled
      Never used RAM 57328, free system stack 103 words
      Tasks: NETWORK(1,ready,35.9%,182) ETHERNET(5,nWait 7,0.1%,311) HEAT(3,nWait 6,0.0%,323) Move(4,nWait 6,0.3%,209) TMC(4,nWait 6,8.5%,53) CanReceiv(6,nWait 1,0.1%,767) CanSender(5,nWait 7,0.0%,327) CanClock(7,delaying,0.0%,348) MAIN(1,running,55.0%,103) IDLE(0,ready,0.0%,29), total 100.0%
      Owned mutexes:
      === Platform ===
      Last reset 00:39:59 ago, cause: power up
      Last software reset at 2024-08-02 12:23, reason: User, Gcodes spinning, available RAM 62628, slot 1
      Software reset code 0x0003 HFSR 0x00000000 CFSR 0x00000000 ICSR 0x0044a000 BFAR 0x00000000 SP 0x00000000 Task MAIN Freestk 0 n/a
      Error status: 0x00
      Aux0 errors 0,0,0
      MCU temperature: min 10.7, current 31.1, max 31.4
      Supply voltage: min 24.0, current 24.1, max 24.5, under voltage events: 0, over voltage events: 0, power good: yes
      12V rail voltage: min 12.0, current 12.2, max 12.5, under voltage events: 0
      Heap OK, handles allocated/used 99/4, heap memory allocated/used/recyclable 2048/312/264, gc cycles 0
      Events: 0 queued, 0 completed
      Date/time: 2024-08-16 07:22:24
      Slowest loop: 224.31ms; fastest: 0.05ms
      === Storage ===
      Free file entries: 19
      SD card 0 detected, interface speed: 25.0MBytes/sec
      SD card longest read time 3.0ms, write time 4.8ms, max retries 0
      === Move ===
      Segments created 381, maxWait 819860ms, bed comp in use: mesh, height map offset 0.000, hiccups added 0 (0.00ms), max steps late 1, ebfmin 0.00, ebfmax 0.00, mcet 0.087
      Pos req/act/dcf: 58485.00/66365/-0.04 15858.00/15858/0.04 1934.00/1938/-0.97 0.00/0/0.00
      next step interrupt due in 1 ticks, disabled
      Driver 0: ok, SG min 0, mspos 327, reads 49227, writes 26 timeouts 0
      Driver 1: standstill, SG min 0, mspos 276, reads 49227, writes 26 timeouts 0
      Driver 2: standstill, SG min 0, mspos 352, reads 49231, writes 22 timeouts 0
      Driver 3: ok, SG min 0, mspos 1007, reads 49228, writes 26 timeouts 0
      Driver 4: ok, SG min 0, mspos 255, reads 49228, writes 26 timeouts 0
      Driver 5: ok, SG min 0, mspos 271, reads 49228, writes 26 timeouts 0
      === DDARing 0 ===
      Scheduled moves 18403, completed 18344, LaErrors 0, Underruns [0, 0, 0]
      === DDARing 1 ===
      Scheduled moves 0, completed 0, LaErrors 0, Underruns [0, 0, 0]
      === Heat ===
      Bed heaters 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1, chamber heaters -1 -1 -1 -1, ordering errs 0
      Heater 0 is on, I-accum = 0.2
      Heater 1 is on, I-accum = 0.0
      === GCodes ===
      Movement locks held by null, null
      HTTP is idle in state(s) 0
      Telnet is idle in state(s) 0
      File is idle in state(s) 3
      USB is idle in state(s) 0
      Aux is idle in state(s) 0
      Trigger is idle in state(s) 0
      Queue is idle in state(s) 0
      LCD is idle in state(s) 0
      SBC is idle in state(s) 0
      Daemon is idle in state(s) 0
      Aux2 is idle in state(s) 0
      Autopause is idle in state(s) 0
      File2 is idle in state(s) 0
      Queue2 is idle in state(s) 0
      Q0 segments left 11, axes/extruders owned 0x80000007
      Code queue 0 is empty
      Q1 segments left 0, axes/extruders owned 0x0000000
      Code queue 1 is empty
      === CAN ===
      Messages queued 39620, received 192185, lost 0, ignored 0, errs 791, boc 0
      Longest wait 2ms for reply type 6031, peak Tx sync delay 61333, free buffers 50 (min 49), ts 11997/11996/0
      Tx timeouts 0,0,0,0,0,0
      === Network ===
      Slowest loop: 193.94ms; fastest: 0.03ms
      Responder states: MQTT(0) HTTP(0) HTTP(0) HTTP(0) HTTP(0) HTTP(0) HTTP(0) FTP(0) Telnet(0) Telnet(0)
      HTTP sessions: 2 of 8
      = Ethernet =
      Interface state: active
      Error counts: 0 0 0 1 0 0
      Socket states: 5 2 2 2 2 0 0 0
      === WiFi ===
      Interface state: disabled
      Module is disabled
      Failed messages: pending 0, notrdy 0, noresp 0
      Socket states: 0 0 0 0 0 0 0 0
      === Multicast handler ===
      Responder is inactive, messages received 0, responses 0
      
      edspedundefined 1 Reply Last reply Reply Quote 0
      • edspedundefined
        edsped @edsped
        last edited by

        @edsped said in RepRapFirmware 3.6.0-alpha.2 for Duet main boards available:

        Tasks: NETWORK(1,ready,35.9%,182) ETHERNET(5,nWait 7,0.1%,311) HEAT(3,nWait 6,0.0%,323) Move(4,nWait 6,0.3%,209) TMC(4,nWait 6,8.5%,53) CanReceiv(6,nWait 1,0.1%,767) CanSender(5,nWait 7,0.0%,327) CanClock(7,delaying,0.0%,348) MAIN(1,running,55.0%,103) IDLE(0,ready,0.0%,29), total 100.0%

        Not sure what's going on, I reverted back to 3.5.2 and the dropped connection persists.. All works well using the paneldue but the web interface is all but unusable and sometimes I'm unable to reconnect for several minutes. Not sure what got hosed but something is surely borked.

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

          @edsped I see connection errors too. Do your connections errors go away if you put the PanelDue on the Setup page so that it stops polling the 6HC?

          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

          edspedundefined 3 Replies Last reply Reply Quote 0
          • edspedundefined
            edsped @dc42
            last edited by

            @dc42 I'm working through it now. Some of my issues appear to be related to running the Jubilee on an IOT network... I've had ongoing connection issues with the paneldue and leave it disconnected unless I have issues with the web interface. I'll follow up once I get my network in order and run a few tests.

            1 Reply Last reply Reply Quote 0
            • edspedundefined
              edsped @dc42
              last edited by

              @dc42 Still getting connection errors. Paneldue is disconnected FWIW.

              1 Reply Last reply Reply Quote 0
              • edspedundefined
                edsped @dc42
                last edited by

                @dc42 Did a fair amount of reworking of my network and I'm 45 minutes into a print without a disconnect... I believe my issue was more networking than the alpha firmware. Next try, running DWC and the Paneldue together.

                1 Reply Last reply Reply Quote 0
                • DonStaufferundefined
                  DonStauffer @dc42
                  last edited by

                  @dc42 Thanks for the information.

                  1 Reply Last reply Reply Quote 0
                  • balajiramaniundefined
                    balajiramani
                    last edited by

                    Hi am seeing a new error today. A few minutes into a print, the printer stopped with the following error:

                    Error: Movement halted because a step timing error occurred (code 3). Please reset the controller.
                    

                    Here is the output of M122 after that:

                    8/18/2024, 5:05:27 PM   M122
                    === Diagnostics ===
                    RepRapFirmware for Duet 2 WiFi/Ethernet version 3.6.0-alpha.4 (2024-08-13 15:11:39) running on Duet WiFi 1.0 or 1.01
                    Board ID: 08DAM-999TL-MQ4SD-6JTDL-3SS6N-968BX
                    Used output buffers: 12 of 26 (21 max)
                    === RTOS ===
                    Static ram: 23368
                    Dynamic ram: 66976 of which 12 recycled
                    Never used RAM 16440, free system stack 112 words
                    Tasks: NETWORK(2,nWait 6,15.9%,195) HEAT(3,nWait 5,0.1%,328) Move(4,invalid,1.1%,272) MAIN(1,running,82.9%,744) IDLE(0,ready,0.0%,29), total 100.0%
                    Owned mutexes: WiFi(NETWORK)
                    === Platform ===
                    Last reset 01:00:54 ago, cause: power up
                    Last software reset at 2024-08-09 19:04, reason: User, Gcodes spinning, available RAM 13844, slot 2
                    Software reset code 0x0003 HFSR 0x00000000 CFSR 0x00000000 ICSR 0x00400000 BFAR 0xe000ed38 SP 0x00000000 Task MAIN Freestk 0 n/a
                    Error status: 0x00
                    Aux0 errors 0,0,0
                    MCU temperature: min 38.2, current 46.3, max 49.1
                    Supply voltage: min 23.5, current 24.2, max 24.6, under voltage events: 0, over voltage events: 0, power good: yes
                    Heap OK, handles allocated/used 99/3, heap memory allocated/used/recyclable 2048/1184/1096, gc cycles 1
                    Events: 0 queued, 0 completed
                    Date/time: 2024-08-18 17:05:26
                    Slowest loop: 226.73ms; fastest: 0.13ms
                    I2C nak errors 0, send timeouts 0, receive timeouts 0, finishTimeouts 0, resets 0
                    === Storage ===
                    Free file entries: 8
                    SD card 0 detected, interface speed: 20.0MBytes/sec
                    SD card longest read time 6.2ms, write time 4.3ms, max retries 0
                    === Move ===
                    Segments created 470, maxWait 2498505ms, bed comp in use: none, height map offset 0.000, hiccups added 1 (0.03ms), max steps late 0, ebfmin 0.00, ebfmax 0.00, mcet 0.085
                    Pos req/act/dcf: 68507.00/68479/0.99 65547.00/65566/-0.81 65391.00/65409/-0.99
                    no step interrupt scheduled
                    Driver 0: standstill, SG min 0
                    Driver 1: standstill, SG min 0
                    Driver 2: standstill, SG min 0
                    Driver 3: standstill, SG min 0
                    Driver 4: standstill, SG min n/a
                    Driver 5: 
                    Driver 6: 
                    Driver 7: 
                    Driver 8: 
                    Driver 9: 
                    Driver 10: 
                    Driver 11: 
                    === DDARing 0 ===
                    Scheduled moves 69133, completed 69131, LaErrors 0, Underruns [0, 0, 0]
                    === Heat ===
                    Bed heaters 0 -1 -1 -1, chamber heaters -1 -1 -1 -1, ordering errs 0
                    Heater 0 is on, I-accum = 0.0
                    Heater 1 is on, I-accum = 0.2
                    === GCodes ===
                    Movement locks held by null
                    HTTP is idle in state(s) 0
                    Telnet is idle in state(s) 0
                    File is doing "G1 X-13.401 Y-8.549" in state(s) 0
                    USB is idle in state(s) 0
                    Aux is idle in state(s) 0
                    Trigger is idle in state(s) 0
                    Queue is idle in state(s) 0
                    LCD is idle in state(s) 0
                    Daemon is idle in state(s) 0
                    Autopause is idle in state(s) 0
                    Q0 segments left 1
                    Code queue 0 is empty
                    === Network ===
                    Slowest loop: 208.96ms; fastest: 0.00ms
                    Responder states: HTTP(4) HTTP(0) HTTP(0) FTP(0) Telnet(0)
                    HTTP sessions: 1 of 8
                    === WiFi ===
                    Interface state: active
                    Module is connected to access point 
                    Failed messages: pending 0, notrdy 0, noresp 0
                    Firmware version 2.1.0
                    MAC address 5c:cf:7f:2c:25:00
                    Module reset reason: Turned on by main processor, Vcc 3.40, flash size 4194304, free heap 40988
                    WiFi IP address 192.168.1.61
                    Signal strength -36dBm, channel 6, mode 802.11n, reconnections 0
                    Clock register 00002002
                    Socket states: 0 0 0 0 0 0 0 0
                    
                    dc42undefined 1 Reply Last reply Reply Quote 0
                    • dc42undefined
                      dc42 administrators @balajiramani
                      last edited by

                      @balajiramani please share the GCode file that provoked that message and your config.g file.

                      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

                      balajiramaniundefined 1 Reply Last reply Reply Quote 0
                      • balajiramaniundefined
                        balajiramani @dc42
                        last edited by

                        @dc42 Here is the gcode - Uno_CNC_Back_0.2mm_PLA_BigDelta_28m.gcode

                        Here is config.g

                        ; Setup some global variables
                        global power_fail_retract = 2   ;  Retract 2mm when power fails
                        
                        ; Communication and general
                        M550 P"BigDelta"				        ; Machine name and Netbios name (can be anything you like)
                        M551 Preprap                        	; Machine password (used for FTP)
                        M552 S1					                ; Enable WiFi. Disabled for setup and testing. Enable once set up on your network.
                        
                        ; Enable telnet
                        M586 S1 P2
                        
                        ; Debugging
                        M111 S0                                 ; Debug off
                        M929 P"eventlog.txt" S1                 ; Start logging to file eventlog.txt
                        
                        M555 P2                           	    ; Set output to look like Marlin
                        G21                                 	; Work in millimetres
                        G90                                	    ; Send absolute coordinates...
                        M83                                 	; ...but relative extruder moves
                        
                        ; Axis and motor configuration
                        M569 P0 S0				; Drive 0 goes backwards
                        M569 P1 S0				; Drive 1 goes backwards
                        M569 P2 S0				; Drive 2 goes backwards
                        M569 P3 S0				; Drive 3 goes backwards
                        
                        ; Assign extruder drive
                        M584 E3
                        
                        
                        ; Set homing switch config
                        M574 X2 S1 P"!xstop"        ; Set homing switch configuration on S1 = high-end, active-low
                        M574 Y2 S1 P"!ystop"        ; Set homing switch configuration on S1 = high-end, active-low
                        M574 Z2 S1 P"!zstop"        ; Set homing switch configuration on S1 = high-end, active-low
                        
                        ; Set it as a linear delta
                        M669 K3
                        
                        ; Setup paneldue 5i
                        M575 P1 S1 B57600
                        
                        M665 R215.062 L395.317:395.475:395.433 B160 H374.050		; set delta radius, diagonal rod length, printable radius and homed height
                        M666 X0 Y0 Z0				; put your endstop adjustments here, or let auto calibration find them
                        M350 X16 Y16 Z16 E16 I1    	; Set 16x microstepping with interpolation
                        M92 X200 Y200 Z200			; Set axis steps/mm
                        
                        M906 X1400 Y1400 Z1400 E1400 I60	; Set motor currents (mA) and increase idle current to 60%
                        M84 S60                             ; Set idle timeout
                        M201 X12000 Y12000 Z2000 E10000     ; Accelerations (mm/s^2)
                        M203 X30000 Y30000 Z5000 E3600		; Maximum speeds (mm/min)
                        ;M566 X900 Y900 Z300 E1200 P1		; Maximum instant speed changes mm/minute
                        ;M566 X300 Y300 Z300 E450 P1        ; Maximum instant speed changes mm/minute
                        M566 X600 Y600 Z300 E900 P1		    ; Maximum instant speed changes mm/minute
                        M204 P9000 T9000                    ; Set acceleration for print and travel moves
                        
                        ; Configure Input shaping
                        M593 P"zvdd" F45
                        
                        ; Thermistors
                        M308 S0 P"bed_temp" Y"thermistor" T100000 B3950 R4700 H30 L0	; Put your own H and/or L values here to set the bed thermistor ADC correction
                        M308 S1 P"e0_temp" Y"thermistor" T100000 B3950 R4700 H30 L0	; 100K NTC 
                        ;M308 S1 P"e0_temp" Y"thermistor" T100000 B4658 C6.5338987554e-08 ; 104-NT Aliexpress thermistor
                        
                        M950 H0 C"bed_heat" T0      ; Set up H0 as the bed heater using T0 as the sensor
                        M950 H1 C"e0_heat" T1       ; Set up H1 as the extruder heater using T1 as the sensor
                        M140 H0                     ; Map H0 as the bed heater
                        
                        ; Set temperature excursion warnings
                        M570 H0 P20
                        M570 H1 P20
                        
                        M308 S3 Y"mcu-temp" A"MCU" ; configure sensor 3 as thermistor on pin e1temp for left stepper
                        M308 S4	Y"drivers"  A"Drivers"  ; configure sensor 4 as temperature warning and overheat flags on the TMC2660 on Duet
                        M912 P0 S-3.5               ; Calibrate MCU temp
                        
                        ; Fan definitions
                        M950 F0 C"fan0"
                        M950 F1 C"fan1"
                        M950 F2 C"fan2"
                        
                        ; Thermostatic fan on 1 for cooling the hotend
                        M106 P1 T50 H1
                        ; Thermostatic fan on 2 for cooling the board
                        M106 P2 H3:4 L.3 X1 B0.3 T35:70 ; set fan 2 value
                        
                        ; Tool definitions
                        M563 P0 D0 H1                       	; Define tool 0
                        G10 P0 S0 R0                        	; Set tool 0 operating and standby temperatures
                        ;M92 E1392								; Based on https://www.thingiverse.com/thing:1359717; 2023/01/06
                        M92 E1077.1646                          ; This is the new value for the hobb-goblin extruder.  03/07/2023
                        ;M92 E319.2005                           ; Set extruder steps per mm.  This is for the MK8 gear
                        
                        ; Z probe and compensation definition
                        M558 P8 C"^!zprobe.in" R0.4 H4 F1200 T6000 A5 S0.01	; Z probe is a piezo sensor
                        G31 X0 Y0 Z-0.08 P100			; Set the zprobe height and threshold
                        M557 R150 S20				; Probe within a radius of 150mm and mesh spacing of 20
                        M376 H5                     ; Taper off bed compensation after 5mm
                        
                        ; Configure power failure and resume
                        M911 S21.0 R23.0 P"G91 M83 G1 Z3 E{-global.power_fail_retract} F1000" ; Relative movement and extrusion.  Move head up and retract 2mm filament.
                        
                        M208 S1 Z-0.5				; set minimum Z
                        T0					        ; select first hot end
                        
                        M501					    ; Load any config overrides
                        
                        balajiramaniundefined 1 Reply Last reply Reply Quote 0
                        • DonStaufferundefined
                          DonStauffer @dc42
                          last edited by DonStauffer

                          This post is deleted!
                          1 Reply Last reply Reply Quote 0
                          • curieosundefined
                            curieos
                            last edited by

                            Does alpha 4 still work with toolboards running 3.5.2? I'd like to give this a try, but the toolboard on my Micron is a Fly RRF 36 and it doesn't look like team gloomy is releasing 3.6 alpha builds.

                            She/Her
                            I work at a local 3D printing shop.
                            Printers: Micron+ w/Duet 3 Mini, in-progress adaptation of the Jubilee REL onto an E3D MS, Prusa i3 MK3S.

                            Notepadundefined dc42undefined 2 Replies Last reply Reply Quote 0
                            • Notepadundefined
                              Notepad @curieos
                              last edited by

                              @curieos Looks like a question for @jay_s_uk @gloomyandy

                              The real bamboo printer manufacturer

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

                                @curieos said in RepRapFirmware 3.6.0-alpha.2 for Duet main boards available:

                                Does alpha 4 still work with toolboards running 3.5.2? I'd like to give this a try, but the toolboard on my Micron is a Fly RRF 36 and it doesn't look like team gloomy is releasing 3.6 alpha builds.

                                Yes it does.

                                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 1
                                • gloomyandyundefined
                                  gloomyandy @Notepad
                                  last edited by

                                  @Notepad I don't think there are any expansion builds publicly available for 3.6 yet. We did make a build of 3.6 for mainboards available here: https://discord.com/channels/711873626080804914/762765744278208512/1263573562090848286

                                  As DC42 confirmed existing 3.5.2 builds for expansion boards can be used with 3.6.

                                  1 Reply Last reply Reply Quote 1
                                  • balajiramaniundefined
                                    balajiramani @balajiramani
                                    last edited by

                                    @dc42 checking if there is any update on this issue?

                                    oliofundefined 1 Reply Last reply Reply Quote 0
                                    • oliofundefined
                                      oliof @balajiramani
                                      last edited by

                                      @balajiramani multiple issues have been discussed here, it helps if you're specific on which one you are asking about.

                                      <>RatRig V-Minion Fly Super5Pro RRF<> V-Core 3.1 IDEX k*****r <> RatRig V-Minion SKR 2 Marlin<>

                                      1 Reply Last reply Reply Quote 1
                                      • curieosundefined
                                        curieos
                                        last edited by

                                        I've done a couple prints now on my Micron, and input shaping is looking way better. There's a symptom I didn't realize was due to the old input shaping algorithm; large ringing artifacts on organic supports. My guess is it's due to the high segmentation of those moves, but I could hear the printer make an almost grinding noise. That's all gone now.

                                        The main quirk I'm noticing is slow probing. I'm running a klicky PBC and before, when the probe triggered, it would retract near instantly. Now it pauses after triggering for a brief moment. I have it set up to do multiple samples, and it seems like the first sample is always the slowest when retracting, but every sample has a brief pause.

                                        Pressure advance also seems kinda weird. I need to rerun the tuning pattern to be sure I'm using the correct value, but it looks like turning it on at all has a very negative effect on surface quality. It's most pronounced on the latest print, but that's still in progress.

                                        She/Her
                                        I work at a local 3D printing shop.
                                        Printers: Micron+ w/Duet 3 Mini, in-progress adaptation of the Jubilee REL onto an E3D MS, Prusa i3 MK3S.

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

                                          @curieos thanks for your feedback. Re the pressure advance, is the extruder driven by the main board, or by a tool or expansion board - and if so, is that board running 3.5 or 3.6 firmware?

                                          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

                                          curieosundefined 1 Reply Last reply Reply Quote 0
                                          • curieosundefined
                                            curieos @dc42
                                            last edited by

                                            @dc42 It's on the mellowfly toolboard running 3.5.2

                                            She/Her
                                            I work at a local 3D printing shop.
                                            Printers: Micron+ w/Duet 3 Mini, in-progress adaptation of the Jubilee REL onto an E3D MS, Prusa i3 MK3S.

                                            dc42undefined 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Unless otherwise noted, all forum content is licensed under CC-BY-SA