Giter VIP home page Giter VIP logo

digiview-sbc's Introduction

Any Screen, Any Time.

DigiView SBC

DigiView SBC is a linux image that allow you to get a Live preview from your DJI FPV goggles (V1 & V2) on a single board computer.

This is currently an alpha release with minimal features for the Raspberry Pi. It runs on Pi 2B or better, and can also be modified to run on Pi Zero (expect significant latency on the Pi Zero).

Download

You can download the Alpha Release here

Instructions

To get the best results :

  • Power on our Raspberry Pi and wait for it to boot fully.
  • You must have a monitor of some kind connected to the SBC before booting the Pi.
  • Power on your googles.
  • Power your drone.
  • Wait for the link to be established.
  • Plug the USB cable into a USB port your Raspberry Pi.
  • Streaming is triggered when the Goggles are connected to the Pi via USB, so you should see video shortly after plugging in.
  • If video latency is poor or image quality is bad, try replugging the USB.
  • It is strongly recommended that you plug/unplug the Pi end of the cable: you would rather wear out the connector on the Pi than your goggles!

Pi Zero Instructions

In order for the Pi Zero to boot, you must change the amount of RAM dedicated to the GPU:

  • Connect the SD card to your PC.

In the Boot partition, open config.txt and change this:

gpu_mem=512

To this:

gpu_mem=384

Advanced User Instructions

  • If you want to log into the pi, you can connect a mouse and keyboard. Right-click on the desktop and open the terminal emulator.
  • The default username is fpvout. The default password is fpvout.
  • The pi user is not being used, but does exist. It's password is also fpvout.
  • SSH is enabled by default, but you will need to add a wpa supplicant file to the boot partition to connect to Wi-Fi.
  • There is no desktop environment on the image - this is intended to turn your SBC into an appliance that requires no user input for normal operation.

If there is any issue, please check on our Discord server, some people might help you there. You can also consult the DigiView Wiki.

Known Issues

  • Do not plug into the Pi until after video is showing in your goggles.
  • If you need to power cycle the air unit, you may need to replug the USB cable in order to re-establish the stream.
  • You might need to set Autotemp off on your Vista/Air unit to get it to work.
  • It may work best in 50mbps mode.
  • Some small monitors have squeezed/stretched video on Pi 3B+.
  • Need to disable hibernate/sleep so the display doesn't shutdown during flight.

Development

We will add more info here later, but broad strokes are:

  • The Pi image is based on Raspbian Lite.
  • The core components that make DigiView SBC are fpv-c, Gstreamer and Hello_Video (Pi version only).
  • Auto-start on USB is accomplished via a UDEV rule that triggers the GoggleConnect service, which starts a bash script that initiates the stream.
  • A tutorial for building your own version from scratch is planned for a future date.
  • Jetson Nano 2gb, and RockPi 4 images are also in development.

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Credits

Please make sure to check theses guys out ! And feel free to donate ;)

License

GPL 3.0

“Raspberry Pi is a trademark of the Raspberry Pi Foundation”.

digiview-sbc's People

Contributors

lavachemist avatar squshy7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

digiview-sbc's Issues

Support OSD Using Open TX Telemetry

Feature Request

Since the DJI goggle do not support sending OSD data live while using video out, telemetry data from an Open TX could be used instead to get this information. The transmitter would either be plugged in or connected with Bluetooth.

GPIO Monitor with touchscreen not working

Hi,

I'm trying to make it working on my RPi 4B with a 4" touchscreen monitor connnected with GPIO.

I'm using your .img , I need to install monitor drivers after the first power up to see something in the display but after that I cannot see any Digiview background image on screen , only the prompt of the fpvout user.
Maybe something in the drivers broke Digiview ?

My display is a 4" and the drivers I installed are here:

git clone https://github.com/goodtft/LCD-show.git

and I used :

./MHS40-show

after that and one reboot the display started working but I got only a prompt and if I try to start even manually fpvout-start.sh it says:

fpvout@FPVOut:~ $ /home/fpvout/fpvout-start.sh
unable to open device, or device not found
try running as root (with sudo)

strace:

fpvout@FPVOut:~ $ strace /home/fpvout/fpvout-start.sh 
execve("/home/fpvout/fpvout-start.sh", ["/home/fpvout/fpvout-start.sh"], 0xbeef2690 /* 21 vars */) = 0
brk(NULL)                               = 0x1dc6000
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f30000
access("/etc/ld.so.preload", R_OK)      = 0
openat(AT_FDCWD, "/etc/ld.so.preload", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=54, ...}) = 0
mmap2(NULL, 54, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0xb6f2f000
close(3)                                = 0
readlink("/proc/self/exe", "/usr/bin/bash", 4096) = 13
openat(AT_FDCWD, "/usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\254\3\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=17708, ...}) = 0
mmap2(NULL, 81964, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6eed000
mprotect(0xb6ef1000, 61440, PROT_NONE)  = 0
mmap2(0xb6f00000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xb6f00000
close(3)                                = 0
munmap(0xb6f2f000, 54)                  = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=65760, ...}) = 0
mmap2(NULL, 65760, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6edc000
close(3)                                = 0
openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libtinfo.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0pn\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=133216, ...}) = 0
mmap2(NULL, 198300, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6eab000
mprotect(0xb6ec9000, 65536, PROT_NONE)  = 0
mmap2(0xb6ed9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0xb6ed9000
close(3)                                = 0
openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libdl.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \n\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=9768, ...}) = 0
mmap2(NULL, 73924, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6e98000
mprotect(0xb6e9a000, 61440, PROT_NONE)  = 0
mmap2(0xb6ea9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0xb6ea9000
close(3)                                = 0
openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\274x\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1296004, ...}) = 0
mmap2(NULL, 1364764, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6d4a000
mprotect(0xb6e82000, 65536, PROT_NONE)  = 0
mmap2(0xb6e92000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x138000) = 0xb6e92000
mmap2(0xb6e95000, 8988, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6e95000
close(3)                                = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f2e000
set_tls(0xb6f2e500)                     = 0
mprotect(0xb6e92000, 8192, PROT_READ)   = 0
mprotect(0xb6ea9000, 4096, PROT_READ)   = 0
mprotect(0xb6ed9000, 8192, PROT_READ)   = 0
mprotect(0xb6f00000, 4096, PROT_READ)   = 0
mprotect(0xfc000, 4096, PROT_READ)      = 0
mprotect(0xb6f32000, 4096, PROT_READ)   = 0
munmap(0xb6edc000, 65760)               = 0
openat(AT_FDCWD, "/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
close(3)                                = 0
brk(NULL)                               = 0x1dc6000
brk(0x1de7000)                          = 0x1de7000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=3031632, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6b4a000
mmap2(NULL, 2596864, PROT_READ, MAP_PRIVATE, 3, 0x6b000) = 0xb68d0000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/arm-linux-gnueabihf/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=26406, ...}) = 0
mmap2(NULL, 26406, PROT_READ, MAP_SHARED, 3, 0) = 0xb6f27000
close(3)                                = 0
getuid32()                              = 1001
getgid32()                              = 1001
geteuid32()                             = 1001
getegid32()                             = 1001
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
gettimeofday({tv_sec=1633702995, tv_usec=759028}, NULL) = 0
ioctl(-1, TIOCGPGRP, 0xbeeb93f0)        = -1 EBADF (Bad file descriptor)
sysinfo({uptime=676, loads=[60576, 52864, 30368], totalram=4025724928, freeram=3710840832, sharedram=8851456, bufferram=26619904, totalswap=104853504, freeswap=104853504, procs=141, totalhigh=3342860288, freehigh=3103133696, mem_unit=1}) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6d77110}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
uname({sysname="Linux", nodename="FPVOut", ...}) = 0
stat64("/home/fpvout", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat64(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("/home/fpvout", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getpid()                                = 1415
getppid()                               = 1412
gettimeofday({tv_sec=1633702995, tv_usec=768833}, NULL) = 0
getpid()                                = 1415
getpgrp()                               = 1412
ioctl(2, TIOCGPGRP, [1412])             = 0
rt_sigaction(SIGCHLD, {sa_handler=0x55a6c, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6d77110}, 8) = 0
ugetrlimit(RLIMIT_NPROC, {rlim_cur=30185, rlim_max=30185}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
openat(AT_FDCWD, "/home/fpvout/fpvout-start.sh", O_RDONLY|O_LARGEFILE) = 3
stat64("/home/fpvout/fpvout-start.sh", {st_mode=S_IFREG|0775, st_size=126, ...}) = 0
ioctl(3, TCGETS, 0xbeeb9390)            = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR)            = 0
read(3, "#!/bin/bash \n\nexport DISPLAY=:0;"..., 80) = 80
_llseek(3, 0, [0], SEEK_SET)            = 0
ugetrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024*1024}) = 0
fcntl64(255, F_GETFD)                   = -1 EBADF (Bad file descriptor)
dup2(3, 255)                            = 255
close(3)                                = 0
fcntl64(255, F_SETFD, FD_CLOEXEC)       = 0
fcntl64(255, F_GETFL)                   = 0x20000 (flags O_RDONLY|O_LARGEFILE)
fstat64(255, {st_mode=S_IFREG|0775, st_size=126, ...}) = 0
_llseek(255, 0, [0], SEEK_CUR)          = 0
read(255, "#!/bin/bash \n\nexport DISPLAY=:0;"..., 126) = 126
stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("/home/fpvout", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat64("/home/fpvout/fpv-c", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
chdir("/home/fpvout/fpv-c")             = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
pipe([3, 4])                            = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [CHLD], 8) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb6f2e0a8) = 1416
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
close(4)                                = 0
close(4)                                = -1 EBADF (Bad file descriptor)
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [CHLD], 8) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb6f2e0a8) = 1417
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
close(3)                                = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x526b4, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
wait4(-1, unable to open device, or device not found
try running as root (with sudo)
[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 1416
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 1417
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, {sa_handler=0x526b4, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0xb6d77110}, 8) = 0
ioctl(2, TIOCGWINSZ, {ws_row=30, ws_col=191, ws_xpixel=2101, ws_ypixel=690}) = 0
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
stat64("/home/fpvout/.terminfo", 0x1dcfa90) = -1 ENOENT (No such file or directory)
stat64("/etc/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("/lib/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64("/usr/share/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
gettimeofday({tv_sec=1633703015, tv_usec=821832}, NULL) = 0
access("/etc/terminfo/x/xterm", R_OK)   = -1 ENOENT (No such file or directory)
access("/lib/terminfo/x/xterm", R_OK)   = 0
openat(AT_FDCWD, "/lib/terminfo/x/xterm", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=3435, ...}) = 0
read(3, "\32\1)\0&\0\17\0\235\1\244\5xterm|xterm-debian|X"..., 32768) = 3435
read(3, "", 28672)                      = 0
close(3)                                = 0
gettimeofday({tv_sec=1633703015, tv_usec=824613}, NULL) = 0
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=30, ws_col=191, ws_xpixel=2101, ws_ypixel=690}) = 0
ioctl(0, TIOCGWINSZ, {ws_row=30, ws_col=191, ws_xpixel=2101, ws_ypixel=690}) = 0
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
close(3)                                = -1 EBADF (Bad file descriptor)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1416, si_uid=1001, si_status=1, si_utime=0, si_stime=1} ---
wait4(-1, 0xbeeb8dec, WNOHANG, NULL)    = -1 ECHILD (No child processes)
sigreturn({mask=[]})                    = 0
read(255, "", 126)                      = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(0)                           = ?
+++ exited with 0 +++

And this is what GitHub display installation script MHS40-show is doing :

#!/bin/bash

sudo ./system_backup.sh

if [ -f /etc/X11/xorg.conf.d/40-libinput.conf ]; then
sudo rm -rf /etc/X11/xorg.conf.d/40-libinput.conf
fi
if [ ! -d /etc/X11/xorg.conf.d ]; then
sudo mkdir -p /etc/X11/xorg.conf.d
fi
sudo cp ./usr/mhs395-overlay.dtb /boot/overlays/
sudo cp ./usr/mhs395-overlay.dtb /boot/overlays/mhs395.dtbo
root_dev=`grep -oPr "root=[^\s]*" /boot/cmdline.txt | awk -F= '{printf $NF}'`
if test "$root_dev" = "/dev/mmcblk0p7";then
sudo cp -rf ./boot/config-noobs-nomal.txt ./boot/config.txt.bak
else
sudo cp -rf ./boot/config-nomal.txt ./boot/config.txt.bak
sudo echo "hdmi_force_hotplug=1" >> ./boot/config.txt.bak
fi
sudo echo "dtparam=i2c_arm=on" >> ./boot/config.txt.bak
sudo echo "dtparam=spi=on" >> ./boot/config.txt.bak
sudo echo "enable_uart=1" >> ./boot/config.txt.bak
sudo echo "dtoverlay=mhs395:rotate=90" >> ./boot/config.txt.bak
sudo echo "hdmi_group=2" >> ./boot/config.txt.bak
sudo echo "hdmi_mode=1" >> ./boot/config.txt.bak
sudo echo "hdmi_mode=87" >> ./boot/config.txt.bak
sudo echo "hdmi_cvt 480 320 60 6 0 0 0" >> ./boot/config.txt.bak
sudo echo "hdmi_drive=2" >> ./boot/config.txt.bak
sudo cp -rf ./boot/config.txt.bak /boot/config.txt
sudo cp -rf ./usr/99-calibration.conf-mhs395-90  /etc/X11/xorg.conf.d/99-calibration.conf
sudo cp -rf ./usr/99-fbturbo.conf  /usr/share/X11/xorg.conf.d/99-fbturbo.conf
#if test "$root_dev" = "/dev/mmcblk0p7";then
#sudo cp ./usr/cmdline.txt-noobs /boot/cmdline.txt
#else
#sudo cp ./usr/cmdline.txt /boot/
#fi
sudo cp ./usr/inittab /etc/
#sudo cp ./boot/config-mhs395.txt /boot/config.txt
sudo touch ./.have_installed
echo "gpio:resistance:mhs395:90:480:320" > ./.have_installed

#FBCP install
wget --spider -q -o /dev/null --tries=1 -T 10 https://github.com
if [ $? -eq 0 ]; then
sudo apt-get install git cmake -y 2> error_output.txt
result=`cat ./error_output.txt`
echo -e "\033[31m$result\033[0m"
grep -q "^E:" ./error_output.txt && exit
sudo rm -rf rpi-fbcp
sudo git clone https://github.com/tasanakorn/rpi-fbcp
sudo mkdir ./rpi-fbcp/build
cd ./rpi-fbcp/build/
sudo cmake ..
sudo make
sudo install fbcp /usr/local/bin/fbcp
cd - > /dev/null
type fbcp > /dev/null 2>&1
if [ $? -eq 0 ]; then
sudo cp -rf ./usr/99-fbturbo-fbcp.conf  /usr/share/X11/xorg.conf.d/99-fbturbo.conf
sudo cp -rf ./etc/rc.local /etc/rc.local
fi
fi
#evdev install
#nodeplatform=`uname -n`
#kernel=`uname -r`
version=`uname -v`
#if test "$nodeplatform" = "raspberrypi";then
#echo "this is raspberrypi kernel"
version=${version##* }
#version=${version#*#}
echo $version
if test $version -lt 2017;then
echo "reboot"
else
echo "need to update touch configuration"
sudo dpkg -i -B ./xserver-xorg-input-evdev_1%3a2.10.6-1+b1_armhf.deb 2> error_output.txt
#sudo apt-get install xserver-xorg-input-evdev  2> error_output.txt
result=`cat ./error_output.txt`
echo -e "\033[31m$result\033[0m"
grep -q "error:" ./error_output.txt && exit
sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
#echo "reboot"
fi
#else
#echo "this is not raspberrypi kernel, no need to update touch configure, reboot"
#fi

sudo sync
sudo sync
sleep 1
if [ $# -eq 1 ]; then
sudo ./rotate.sh $1
elif [ $# -gt 1 ]; then
echo "Too many parameters"
fi

echo "reboot now"
sudo reboot

feature: dvr

Has anyone considered a basic dvr function? It looks like there is a spot in the (literal) pipeline where it has effectively standard mp4 video that could be diverted to a file as well as playback.

  • Connect USB storage, allow system to automatically mount it
  • When goggles attached, if usb storage is present, send it to a file as well as the player: | tee /storage/dvr-2220.mp4 |
  • During streaming, automatically run sync to flush the write cache periodically

Alternately:

  • OUTFILE=/dev/null
    • When storage is detected, OUTFILE=/storage/dvr-2221.mp4
  • Include | tee ${OUTFILE} | in the pipeline. This has a very minor performance cost for non-dvr playback, extraneously sending the stream to /dev/null
  • Still run the periodic syncs during streaming, which shouldn't impact except in dvr mode. (Ideally few/no writes should be going to the system device.)

In both approaches, closing the stream will automatically close the file. The periodic sync should defend (barely) against corruption on power-off, while still allowing a reasonable write cache. Corruption risks are primarily to the DVR storage, rather than the system volume.

I might hack something together if there is any interest. Having a second screen is huge for outreach where we fly but I don't want to lose my dvr

Composite video out

I had enabled composite video out (via 2.5mm jack) on Raspberry Pi OS and it worked just well

After installation of DigiView-SBC image I can't enable the composite video out now.

Please tell me is it in theory possible to use raspberry as a digital to analogue converter using composite video out or there is some limitation?

dual hdmi out pi4

hi! I am using this with a pi4 and only one hdmi output is showing the feed at once, the other just shows "digiview" is there a way to have them mirrored?

preblem to shut down, and sd card corrupted.

Hello,

first of all, thank you for your work it's great. on the other hand I have a problem: when I turn off the Pie with the mouse, or with a command, the sd card and the image are corrupted. I have to redo the image. however I turn off the Pie well, only the red LED remains lit when I cut the power. I don't understand why, I tried everything, and I have to redo the image every time I turn off.. please help me!
thank you in advance,
AureL

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.