You are not logged in.
I've had a Wanhao D7 version 1.4 for a few months driven by a Pi3 with nanodlp. I've had some great prints from the setup but have not been able to resolve a very annoying intermittent problem. On any plate with a substantial number of layers i.e. not a trivial print, nanodlp locks up at random points. It's not on the same layer but seems arbitrary but it always happens mid exposure. Te UV source is on but communication with the web interface is dropped. The only way out of the problem is to power off the pi and restart it. As the UV source has been on for a while the print is a write off.
I read elsewhere on the forum that this might be a USB connection problem so I have tried different USB cables and using different USB ports on the pi. Today I stripped down the Wanhao D7 and reseated all the connections. Still no joy, the first decent print job I gave it failed with the UV source on after around 90 layers.
Any help to find a solution would be greatly appreciated. Generally I think nanodlp is great but this is driving me mad. Debug zip attached.
forum/uploads/3f4eeabff4a9362e2533e42d3800d8ce.zip
Cheers
Dave
Last edited by ElDavo (2019-01-24 16:00:15)
Offline
It could be power related as well. Try to get a stronger power supply for the nano. I picked up a 3amp phone charger at a local store. I also picked up a UPS battery backup and plug both the printer and the Pi into it.
It may also be heat related.
good luck
Offline
Thanks for the suggestion. The pi is powered by a kosha pi power brick and is mounted in a case with a fan. Temperature seems to sit at around 36/37C max even when slicing. I guess it could be a power issue with the Wanhao D7 itself but it seems strange that nanodlp locks up.
Cheers
Dave
Offline
Check usb cables too I had issues with even the slightest touch the printer and pi would loose communication. I added a spacer on the pi to make sure the cable will not move once it is inserted.
You could also check the cd card in the Pi.
Other than that I'm running out of ideas.
Offline
Is the print progress hangs or whole system become unresponsive? If it is the second issue as TomTuko mentioned the most probably it is power related. If it is first one, there is communication issue between RAMPS and Pi it could be a USB dongle or cable issue
Offline
Thanks for the suggestions. When the system stops it is only nanodlp that has crashed. I can still connect to the pi and login from my Windows box using Putty and SSH.
Looking at the printer.log file there is a suspicious looking SIGABRT which looks to be something to do with image handling. Here is the tail of the log...
2019/01/06 15:20:56.067631 {"Layer":"284","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Fanspeed:255↵"}
2019/01/06 15:20:57.560434 {"Layer":"284","module":"Image","level":"Warning","msg":"Display layer public/plates/32/284.png"}
2019/01/06 15:21:02.866032 {"Layer":"284","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:02.866758 {"Layer":"284","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Fanspeed:0↵"}
2019/01/06 15:21:02.889952 {"Layer":"284","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:08.891870 {"Layer":"284","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Z_move_comp↵"}
2019/01/06 15:21:08.892023 {"Layer":"284","module":"Gcode","level":"Notice","msg":"Position set to 9.94"}
2019/01/06 15:21:10.799254 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:12.302283 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Z_move_comp↵"}
2019/01/06 15:21:12.302910 {"Layer":"285","module":"Gcode","level":"Notice","msg":"Position set to 9.975"}
2019/01/06 15:21:12.311306 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:12.311933 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Fanspeed:255↵"}
2019/01/06 15:21:13.803384 {"Layer":"285","module":"Image","level":"Warning","msg":"Display layer public/plates/32/285.png"}
2019/01/06 15:21:19.093116 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:19.098139 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Fanspeed:0↵"}
2019/01/06 15:21:19.114302 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:25.115123 {"Layer":"285","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Z_move_comp↵"}
2019/01/06 15:21:25.116380 {"Layer":"285","module":"Gcode","level":"Notice","msg":"Position set to 9.975"}
2019/01/06 15:21:27.022435 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:28.526695 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Z_move_comp↵"}
2019/01/06 15:21:28.526895 {"Layer":"286","module":"Gcode","level":"Notice","msg":"Position set to 10.01"}
2019/01/06 15:21:28.534106 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
2019/01/06 15:21:28.534722 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Fanspeed:255↵"}
2019/01/06 15:21:30.027405 {"Layer":"286","module":"Image","level":"Warning","msg":"Display layer public/plates/32/286.png"}
printer: imageLayer.c:81: createResourceImageLayer: Assertion `result == 0' failed.
SIGABRT: abort
PC=0x76c3245c m=10 sigcode=4294967290
goroutine 0 [idle]:
runtime: unknown pc 0x76c3245c
stack: frame={sp:0x603feb58, fp:0x0} stack=[0x5fbff224,0x603fee24)
603fead8: 00000000 00000000 00000000 00000000
603feae8: 00000000 00000000 00000000 00000000
603feaf8: 00000000 00000000 00000000 00000000
603feb08: 76ef32d0 603feb80 76c09110 000001ea
603feb18: 603feb84 76ed9624 00000001 76c0caf4
603feb28: 000001ea 76c13804 76ef32d0 603feb84
603feb38: 603feb80 76d43078 603ff460 00000001
603feb48: 603fec6c 603febd8 00000006 76c323e0
603feb58: <00000000 00000000 76effcf0 603febf0
603feb68: 76f00888 76eec2bc 76f00000 00000000
603feb78: 76ef4318 0000000f 00000000 00000000
603feb88: 00000000 3de00ec7 76ef3488 00000000
603feb98: 603febf0 603febf8 603fec64 76c18141
603feba8: 603fec4c 76ed9bfc 603febf8 76f00abc
603febb8: 00000009 76ef4730 00000005 00000000
603febc8: 00000001 76ef32d0 00831000 01226eb4
runtime: unknown pc 0x76c3245c
stack: frame={sp:0x603feb58, fp:0x0} stack=[0x5fbff224,0x603fee24)
603fead8: 00000000 00000000 00000000 00000000
603feae8: 00000000 00000000 00000000 00000000
603feaf8: 00000000 00000000 00000000 00000000
603feb08: 76ef32d0 603feb80 76c09110 000001ea
603feb18: 603feb84 76ed9624 00000001 76c0caf4
603feb28: 000001ea 76c13804 76ef32d0 603feb84
603feb38: 603feb80 76d43078 603ff460 00000001
603feb48: 603fec6c 603febd8 00000006 76c323e0
603feb58: <00000000 00000000 76effcf0 603febf0
603feb68: 76f00888 76eec2bc 76f00000 00000000
603feb78: 76ef4318 0000000f 00000000 00000000
603feb88: 00000000 3de00ec7 76ef3488 00000000
603feb98: 603febf0 603febf8 603fec64 76c18141
603feba8: 603fec4c 76ed9bfc 603febf8 76f00abc
603febb8: 00000009 76ef4730 00000005 00000000
603febc8: 00000001 76ef32d0 00831000 01226eb4
goroutine 1147 [syscall]:
runtime.cgocall(0x40c5c8, 0x1226eb4, 0x18)
/usr/local/go/src/runtime/cgocall.go:128 +0x5c fp=0x1226e9c sp=0x1226e84 pc=0x149b4
projects/printer/app/viewer/manx._Cfunc_image_display(0x5f200518, 0x0)
_cgo_gotypes.go:96 +0x38 fp=0x1226eb0 sp=0x1226e9c pc=0x393bd4
projects/printer/app/viewer/manx.DisplayImage(0x101c980, 0x18, 0x0)
/home/pi/go/src/projects/printer/app/viewer/manx/manx_rpi.go:30 +0x94 fp=0x1226ec4 sp=0x1226eb0 pc=0x393df8
main.showFrame(0x101c980, 0x18, 0x1)
/home/pi/printer/app/hardware.go:102 +0x124 fp=0x1226eec sp=0x1226ec4 pc=0x3e6208
main.cureWithLCD(0x11e, 0x101c980, 0x18)
/home/pi/printer/app/printing-lcd.go:13 +0xc0 fp=0x1226f18 sp=0x1226eec pc=0x3f19e8
main.cureLayer(0x11e, 0x101c980, 0x18)
/home/pi/printer/app/printing.go:289 +0x40 fp=0x1226f28 sp=0x1226f18 pc=0x3f3b54
main.printLayer(0x11e, 0x11e)
/home/pi/printer/app/printing.go:259 +0x31c fp=0x1226f60 sp=0x1226f28 pc=0x3f38dc
main.startPlate(0x20, 0x1)
/home/pi/printer/app/printing.go:123 +0x238 fp=0x1226fe4 sp=0x1226f60 pc=0x3f25c4
runtime.goexit()
/usr/local/go/src/runtime/asm_arm.s:867 +0x4 fp=0x1226fe4 sp=0x1226fe4 pc=0x68364
created by main.printerStart
/home/pi/printer/app/web.go:757 +0x118
goroutine 1 [IO wait, 13 minutes]:
internal/poll.runtime_pollWait(0x63fc4e40, 0x72, 0x0)
/usr/local/go/src/runtime/netpoll.go:173 +0x44
internal/poll.(*pollDesc).wait(0x11c0064, 0x72, 0x1124000, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0x7c
internal/poll.(*pollDesc).waitRead(0x11c0064, 0xffffff00, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:90 +0x2c
internal/poll.(*FD).Accept(0x11c0050, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:384 +0x17c
net.(*netFD).accept(0x11c0050, 0x0, 0x2795f4, 0x5c321a1b)
/usr/local/go/src/net/fd_unix.go:238 +0x20
net.(*TCPListener).accept(0x112ea20, 0xf8950fe9, 0x534, 0xc1865628)
/usr/local/go/src/net/tcpsock_posix.go:139 +0x20
net.(*TCPListener).AcceptTCP(0x112ea20, 0x133bc, 0x876fd8, 0x0)
/usr/local/go/src/net/tcpsock.go:247 +0x3c
github.com/labstack/echo.tcpKeepAliveListener.Accept(0x112ea20, 0x321a1b00, 0x4645c, 0x27d668, 0x1039e74)
/home/pi/go/src/github.com/labstack/echo/echo.go:713 +0x1c
net/http.(*Server).Serve(0x1126300, 0x559d18, 0x112ea28, 0x0, 0x0)
/usr/local/go/src/net/http/server.go:2826 +0x1e0
github.com/labstack/echo.(*Echo).StartServer(0x105ce00, 0x1126300, 0x1, 0x4e18fb)
/home/pi/go/src/github.com/labstack/echo/echo.go:646 +0x2b8
main.webInit()
/home/pi/printer/app/routes.go:25 +0x204
main.main()
/home/pi/printer/app/server.go:86 +0x3a8
goroutine 19 [chan receive, 107 minutes]:
projects/printer/app/move.(*speedStruct).calc(0x864fd8, 0x10a60c0)
/home/pi/go/src/projects/printer/app/move/speed.go:94 +0x3c
created by projects/printer/app/move.init.0
/home/pi/go/src/projects/printer/app/move/speed.go:31 +0x60
goroutine 34 [chan receive]:
projects/printer/app/machine.(*StatusStruct).FindIP(0x8651b8)
/home/pi/go/src/projects/printer/app/machine/status.go:133 +0x54
created by projects/printer/app/machine.(*StatusStruct).Load
/home/pi/go/src/projects/printer/app/machine/status.go:113 +0x70
goroutine 5 [IO wait]:
internal/poll.runtime_pollWait(0x63fc4f40, 0x72, 0x0)
/usr/local/go/src/runtime/netpoll.go:173 +0x44
internal/poll.(*pollDesc).wait(0x109a294, 0x72, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0x7c
internal/poll.(*pollDesc).waitRead(0x109a294, 0x1038b00, 0x400, 0x400)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:90 +0x2c
internal/poll.(*FD).ReadFrom(0x109a280, 0x1038b50, 0x400, 0x400, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:219 +0x138
net.(*netFD).readFrom(0x109a280, 0x1038b50, 0x400, 0x400, 0x1590100, 0x0, 0x1959c0, 0x197228, 0x14a6000)
/usr/local/go/src/net/fd_unix.go:208 +0x38
net.(*UDPConn).readFrom(0x11c6058, 0x1038b50, 0x400, 0x400, 0x101d8a4, 0x4, 0x4, 0x10)
/usr/local/go/src/net/udpsock_posix.go:47 +0x38
net.(*UDPConn).ReadFromUDP(0x11c6058, 0x1038b50, 0x400, 0x400, 0x149a300, 0xde, 0x0, 0x0)
/usr/local/go/src/net/udpsock.go:109 +0x58
projects/printer/app/ssdp.Server(0x4e18fb, 0x2, 0x1158467, 0x8, 0x5544a0, 0x4)
/home/pi/go/src/projects/printer/app/ssdp/ssdp.go:58 +0x180
created by main.afterIP
/home/pi/printer/app/server.go:115 +0xac
goroutine 38 [chan receive]:
main.buttonsInit()
/home/pi/printer/app/hardware_arm.go:75 +0x100
created by main.hwInit
/home/pi/printer/app/hardware_arm.go:33 +0x150
goroutine 40 [chan receive]:
projects/printer/app/hw/monitor.FreeMem()
/home/pi/go/src/projects/printer/app/hw/monitor/memfree.go:11 +0x54
created by main.main
/home/pi/printer/app/server.go:63 +0x25c
goroutine 41 [syscall]:
syscall.Syscall6(0x8e, 0x7, 0x100b080, 0x0, 0x100b100, 0x0, 0x0, 0x1cbb4, 0x1d41c, 0x100b100)
/usr/local/go/src/syscall/asm_linux_arm.s:45 +0x8
syscall.Select(0x7, 0x100b080, 0x0, 0x100b100, 0x0, 0x0, 0x100b100, 0x0)
/usr/local/go/src/syscall/zsyscall_linux_arm.go:1470 +0x6c
github.com/creack/goselect.sysSelect(0x7, 0x100b080, 0x0, 0x100b100, 0x0, 0x7ffff, 0x96e27e0)
/home/pi/go/src/github.com/creack/goselect/select_linux.go:8 +0x3c
github.com/creack/goselect.Select(0x7, 0x100b080, 0x0, 0x100b100, 0xffffffff, 0xffffffff, 0x1, 0x3886cc)
/home/pi/go/src/github.com/creack/goselect/select.go:16 +0x74
go.bug.st/serial.v1/unixutils.Select(0x96e27e0, 0x0, 0x96e27e0, 0xffffffff, 0xffffffff, 0x1, 0x1981, 0x1576000)
/home/pi/go/src/go.bug.st/serial.v1/unixutils/select.go:99 +0x80
go.bug.st/serial%2ev1.(*unixPort).Read(0x11320f0, 0x1411784, 0x1, 0x1, 0x0, 0x0, 0x0)
/home/pi/go/src/go.bug.st/serial.v1/serial_unix.go:63 +0xe0
projects/printer/app/shield.(*Conf).Read(0x864db0, 0x1411784, 0x1, 0x1, 0x1, 0x1, 0x3fd334)
/home/pi/go/src/projects/printer/app/shield/shield.go:88 +0x180
main.(*termStruct).readLine(0x864ca8, 0x1411790, 0xe, 0x10)
/home/pi/printer/app/term.go:52 +0xbc
main.(*termStruct).Reader(0x864ca8)
/home/pi/printer/app/term.go:39 +0x78
created by main.main
/home/pi/printer/app/server.go:64 +0x278
goroutine 42 [chan receive]:
projects/printer/app/slicer.(*MonitorStruct).Watch(0x864d28)
/home/pi/go/src/projects/printer/app/slicer/slicer.go:84 +0x70
created by main.main
/home/pi/printer/app/server.go:65 +0x298
goroutine 44 [chan receive]:
projects/printer/app/hw/monitor.Monitor()
/home/pi/go/src/projects/printer/app/hw/monitor/monitor_linux.go:34 +0xac
created by main.main
/home/pi/printer/app/server.go:71 +0x3c0
goroutine 49 [chan receive]:
main.wifiStatus()
/home/pi/printer/app/wireless.go:78 +0xbc
created by main.wifiConnect
/home/pi/printer/app/wireless.go:23 +0xc0
goroutine 7 [chan receive]:
main.updateControlPanel()
/home/pi/printer/app/server.go:214 +0x58
created by main.afterIP
/home/pi/printer/app/server.go:117 +0x10c
goroutine 117 [IO wait]:
internal/poll.runtime_pollWait(0x63fc4dc0, 0x72, 0xc5a20)
/usr/local/go/src/runtime/netpoll.go:173 +0x44
internal/poll.(*pollDesc).wait(0x14001a4, 0x72, 0xffffff00, 0x558c78, 0x8373b0)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:85 +0x7c
internal/poll.(*pollDesc).waitRead(0x14001a4, 0x1364000, 0x1000, 0x1000)
/usr/local/go/src/internal/poll/fd_poll_runtime.go:90 +0x2c
internal/poll.(*FD).Read(0x1400190, 0x1364000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/internal/poll/fd_unix.go:169 +0x14c
net.(*netFD).Read(0x1400190, 0x1364000, 0x1000, 0x1000, 0xffffffff, 0x0, 0x27550c)
/usr/local/go/src/net/fd_unix.go:202 +0x38
net.(*conn).Read(0x1464050, 0x1364000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:177 +0x58
net/http.(*connReader).Read(0x13ec8c0, 0x1364000, 0x1000, 0x1000, 0x66b, 0x864ed0, 0x0)
/usr/local/go/src/net/http/server.go:786 +0x14c
bufio.(*Reader).fill(0x1526000)
/usr/local/go/src/bufio/bufio.go:100 +0x10c
bufio.(*Reader).Peek(0x1526000, 0x4, 0xbf04a5b4, 0xcfeb0e11, 0x66b, 0x864ed0, 0x0)
/usr/local/go/src/bufio/bufio.go:132 +0x2c
net/http.(*conn).serve(0x11343c0, 0x55a278, 0x13ec8a0)
/usr/local/go/src/net/http/server.go:1872 +0x71c
created by net/http.(*Server).Serve
/usr/local/go/src/net/http/server.go:2851 +0x290
trap 0x0
error 0x0
oldmask 0x0
r0 0x0
r1 0x603feb58
r2 0x0
r3 0x8
r4 0x0
r5 0x603feb58
r6 0x603ff460
r7 0xaf
r8 0x603fec6c
r9 0x51
r10 0x10010a0
fp 0x8
ip 0x20
sp 0x603feb58
lr 0xffffffff
pc 0x76c3245c
cpsr 0x10
fault 0x0
2019/01/06 15:50:24.309986 {"Layer":"286","module":"Hardware","level":"Notice","msg":"Initializing build # 1932 - generic"}
2019/01/06 15:50:24.322143 {"Layer":"286","module":"Gcode","level":"Error","msg":"Could not access LCD write /dev/i2c-1: remote I/O error"}
2019/01/06 15:50:24.331737 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Terminal Reader Activated"}
2019/01/06 15:50:24.475516 {"Layer":"286","module":"WIFI","level":"Warning","msg":"WIFI interface wlan0 detected"}
2019/01/06 15:50:25.236622 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: –þü–þÿü’ü-þÿstart↵"}
2019/01/06 15:50:25.240931 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Detected EEPROM version:17↵"}
2019/01/06 15:50:25.241447 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: Free RAM:4958↵"}
2019/01/06 15:50:25.244698 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: SelectExtruder:0↵"}
2019/01/06 15:50:25.245275 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: FlowMultiply:100↵"}
2019/01/06 15:50:29.339637 {"Layer":"286","module":"Terminal","level":"Notice","msg":"Received Data From RAMPS: ok 0↵"}
Any help greatly appreciated.
Cheers
Dave
Offline
My first guess is power issue, again! Second possible source of the issue could be SD card problems.
Offline
My first guess is power issue, again! Second possible source of the issue could be SD card problems.
Thanks for the response Shahin. I'm no expert on the pi but power seems a bit unlikely given that the pi keeps running. After nanodlp has crashed I can still login to the pi so the operating system is still up and running. Surely if the pi had lost voltage the whole lot would shutdown.
I can scroll through and preview all the slides of the plate successfully and the failure doesn't occur in the same layer of any plate twice. If the SD card is faulty then it's very intermittent. I've used utilities to check for errors on the card but no signs of problems. A bit baffling.
Excuse an old programmer but what is the assertion failure in the printer.log caused by? Is there some kind of resource shortage going on?
Thanks for your help.
Cheers
Dave
Offline
Dave,
It is unexpected behavior, and crash does not indicate any error on software side, It panics when it could not communicate with GPU.
The most of unexpected behavior issues reported until now, caused by insufficient power or voltage fluctuation.
Which build you are using?
Offline
Hi Shahin,
I'm running build 1932 and the pi is powered by an official pi power brick. Measuring the voltage on the pi I see a steady 5.18 volts.
Obviously it's possible that this could fluctuate when the GPU or other bits get particularly busy but the assertion failure seems to suggest something amiss in a call to the graphics subsystem particularly a call to vc_dispmanx_resource_write_data in the method createResourceImageLayer in imageLayer.c. Unfortunately the assert function/macro is a bit of blunt instrument and doesn't actually tell you what the value of 'result' is rather than simply saying it's not 0! Similarly there aren't assert calls in the lower layers so you can't see where the non-zero return code has come from. Bit frustrating really.
Cheers
Dave
Offline
Try update firmware blob on pi. Maybe there is a issue on your firmware build.
Offline
Try update firmware blob on pi. Maybe there is a issue on your firmware build.
Hi Shahin,
I don't want to speak too soon but I think that's the answer. I did a "sudo apt-get update" followed by "sudo apt-get dist-upgrade" via a terminal session and since then I have not had a print failure! Even managed to print a couple of things with 700-800 layers something I have not managed before.
Looks like something further down the stack was out of step causing the intermittent failures in the upper levels and causing the nanodlp process to be aborted. Why didn't I think to look at that, Doh! Thanks for your help and hopefully I can now enjoy using your exremely useful bit of software.
Cheers
Dave
Offline