#!/bin/bash
#
# OpenIPC.org | v.20220515
#

MAX_KERNEL_SIZE=0x200000               #    2MiB,  2097152
MAX_KERNEL_SIZE_ULTIMATE=0x300000      #    3MiB,  3145728
MAX_KERNEL_SIZE_EXPERIMENTAL=0x3E8480  # ~3.9MiB,  4097152
MAX_ROOTFS_SIZE=0x500000               #    5MiB,  5242880
MAX_ROOTFS_SIZE_ULTIMATE=0xA00000      #   10MiB,  10485760

clone() {
  sudo apt-get update -y ; apt-get install -y bc build-essential git unzip rsync autotools-dev automake libtool
  git clone --depth=1 https://github.com/OpenIPC/firmware.git
}

fresh() {
  date >/tmp/openipc_buildtime.txt
  [ -d buildroot-2020.02.12/dl ] && mv buildroot-2020.02.12/dl .
  make distclean #clean
  [ -d buildroot* ] && echo -e "\nBuildroot found, OK\n" || make prepare
  [ -d dl ] && mv dl buildroot-2020.02.12/dl || return 0
}

should_fit() {
  filename=$1
  maxsize=$2
  filesize=$(stat --printf="%s" ./output/images/$filename)
  if [[ $filesize -gt $maxsize ]]; then
    export TG_NOTIFY="Warning: $filename is too large: $filesize vs $maxsize"
    exit 1
  fi
}

rename() {
  if grep -q ultimate_defconfig ./output/.config; then
      should_fit uImage $MAX_KERNEL_SIZE_ULTIMATE
      should_fit rootfs.squashfs $MAX_ROOTFS_SIZE_ULTIMATE
  else
      should_fit uImage $MAX_KERNEL_SIZE
      should_fit rootfs.squashfs $MAX_ROOTFS_SIZE
  fi
  mv -v ./output/images/uImage ./output/images/uImage.${soc}
  mv -v ./output/images/rootfs.squashfs ./output/images/rootfs.squashfs.${soc}
  mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${soc}.cpio
  mv -v ./output/images/rootfs.tar ./output/images/rootfs.${soc}.tar
  date >>/tmp/openipc_buildtime.txt
  echo -e "\n\n$(cat /tmp/openipc_buildtime.txt)"
}

rename_initramfs() {
  should_fit uImage $MAX_KERNEL_SIZE_EXPERIMENTAL
  mv -v ./output/images/uImage ./output/images/uImage.initramfs.${soc}
  mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${soc}.cpio
  mv -v ./output/images/rootfs.tar ./output/images/rootfs.${soc}.tar
  date >>/tmp/openipc_buildtime.txt
  echo -e "\n\n$(cat /tmp/openipc_buildtime.txt)"
}

autoup_rootfs() {
  echo -e "\n\n"
  # cp -v ./output/images/uImage.initramfs.${soc} ./output/images/autoupdate-kernel.img
  cp -v ./output/images/uImage.${soc} ./output/images/autoupdate-kernel.img
  ./output/host/bin/mkimage -A arm -O linux -T filesystem -n 'OpenIPC firmware' -a 0x000000250000 -e 0x000000750000 -d ./output/images/rootfs.squashfs.${soc} ./output/images/autoupdate-rootfs.img
}

upload() {
  server="zig@172.28.200.74:/sync/Archive/Incoming/Tftp/"
  echo -e "\n\nStart transferring files to the TFTP server...\n"
  scp -P 22 -r ./output/images/rootfs.squashfs.* ./output/images/uImage.* ${server}
  echo -e "\n"
  date
}

sdk() {
  make br-sdk
}

#################################################################################

ambarella-s3l() {
  soc="s3l"
  fresh && make PLATFORM=ambarella BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

ak3918ev200() {
  soc="ak3918ev200"
  fresh && make PLATFORM=anyka BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

fh8833v100() {
  soc="fh8833v100"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8852v100() {
  soc="fh8852v100"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8852v200() {
  soc="fh8852v200"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8852v210() {
  soc="fh8852v210"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8856v100() {
  soc="fh8856v100"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8856v200() {
  soc="fh8856v200"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8856v210() {
  soc="fh8856v210"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8858v200() {
  soc="fh8858v200"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

fh8858v210() {
  soc="fh8858v210"
  fresh && make PLATFORM=fullhan BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

gk7101() {
  soc="gk7101"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7101s() {
  soc="gk7101s"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7102() {
  soc="gk7102"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7102s() {
  soc="gk7102s"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7205v200() {
  soc="gk7205v200"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7205v200_fpv() {
  soc="gk7205v200"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_fpv all && rename
}

gk7205v200_iscom() {
  soc="gk7205v200"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_iscom all && rename
}

gk7205v200_ufanet() {
  soc="gk7205v200"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_ufanet all && rename
}

gk7205v300() {
  soc="gk7205v300"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_openipc all && rename
}

gk7205v300_ultimate() {
  soc="gk7205v300"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_ultimate all && rename
}

gk7205v300_fpv() {
  soc="gk7205v300"
  fresh && make PLATFORM=goke BOARD=unknown_unknown_${soc}_fpv all && rename
}

#################################################################################

gm8135() {
  soc="gm8135"
  fresh && make PLATFORM=grainmedia BOARD=unknown_unknown_${soc}_openipc all && rename
}

gm8136() {
  soc="gm8136"
  fresh && make PLATFORM=grainmedia BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

hi3516cv100() {
  soc="hi3516cv100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516cv200() {
  soc="hi3516cv200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3518ev200() {
  soc="hi3518ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3518ev200_domsip() {
  soc="hi3518ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_domsip all && rename
}

hi3518ev200_hs303v1() {
  soc="hi3518ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename && autoup_rootfs
}

hi3518ev200_hs303v2() {
  soc="hi3518ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename && autoup_rootfs
}

hi3518ev200_hs303v3() {
  soc="hi3518ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename && autoup_rootfs
  #PLATFORM=hisilicon  make br-linux-{dirclean,rebuild}
  #PLATFORM=hisilicon  make br-hisilicon-osdrv-hi3516cv300-{dirclean,rebuild}
  #PLATFORM=hisilicon  make br-majestic-hi3516cv300-{dirclean,rebuild}
  #PLATFORM=hisilicon  make br-mbedtls-openipc-{dirclean,rebuild}
}

#################################################################################

hi3516cv300() {
  soc="hi3516cv300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516cv300_ultimate() {
  soc="hi3516cv300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_ultimate all && rename
}

hi3516ev100() {
  soc="hi3516ev100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}
#################################################################################
hi3516av100() {
  soc="hi3516av100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516dv100() {
  soc="hi3516dv100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

hi3519v101() {
  soc="hi3519v101"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516av200() {
  soc="hi3516av200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

hi3516av300() {
  soc="hi3516av300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516cv500() {
  soc="hi3516cv500"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516dv300() {
  soc="hi3516dv300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

hi3516dv200() {
  soc="hi3516dv200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516ev200() {
  soc="hi3516ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516ev200_dozor() {
  soc="hi3516ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_dozor all && rename
}

hi3516ev200_eltis() {
  soc="hi3516ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_eltis all && rename
}

hi3516ev200_vixand() {
  soc="hi3516ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_vixand all && rename
}

hi3516ev200_ultimate() {
  soc="hi3516ev200"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_ultimate all && rename
}

hi3516ev300() {
  soc="hi3516ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3516ev300_dev() {
  soc="hi3516ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_dev all && rename
}

hi3516ev300_glibc() {
  soc="hi3516ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_glibc all && rename
}

hi3516ev300_tehshield() {
  soc="hi3516ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_tehshield all && rename
}

hi3516ev300_ultimate() {
  soc="hi3516ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_ultimate all && rename
}

hi3518ev300() {
  soc="hi3518ev300"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3536cv100() {
  soc="hi3536cv100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

hi3536dv100() {
  soc="hi3536dv100"
  fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

t31() {
  soc="t31"
  fresh && make PLATFORM=ingenic BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

nt98562() {
  soc="nt98562"
  fresh && make PLATFORM=novatek BOARD=unknown_unknown_${soc}_openipc all && rename
  #PLATFORM=novatek make br-linux-{dirclean,rebuild}
}

nt98566() {
  soc="nt98566"
  fresh && make PLATFORM=novatek BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

msc313e() {
  soc="msc313e"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

ssc325() {
  soc="ssc325"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

ssc333() {
  soc="ssc333"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

ssc335() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

ssc335_blackbird() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_blackbird all && rename
}

ssc335_goodcam() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_goodcam all && rename
}

ssc335_initramfs() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_initramfs all && rename_initramfs
}

ssc335_musl() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_musl all && rename
}

ssc335_portal() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_portal all && rename
}

ssc335_rotek() {
  soc="ssc335"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_rotek all && rename
}

ssc337() {
  soc="ssc337"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

ssc337_kama() {
  soc="ssc337"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_kama all && rename
}

#################################################################################

ssc335de() {
  soc="ssc335de"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

ssc337de() {
  soc="ssc337de"
  fresh && make PLATFORM=sigmastar BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

t10() {
  soc="t10"
  fresh && make PLATFORM=ingenic BOARD=unknown_unknown_${soc}_openipc all && rename
}

t20() {
  soc="t20"
  fresh && make PLATFORM=ingenic BOARD=unknown_unknown_${soc}_openipc all && rename
}

t30() {
  soc="t30"
  fresh && make PLATFORM=ingenic BOARD=unknown_unknown_${soc}_openipc all && rename
}

t31() {
  soc="t31"
  fresh && make PLATFORM=ingenic BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

xm510() {
  soc="xm510"
  fresh && make PLATFORM=xiongmai BOARD=unknown_unknown_${soc}_openipc all && rename
}

xm530() {
  soc="xm530"
  fresh && make PLATFORM=xiongmai BOARD=unknown_unknown_${soc}_openipc all && rename
}

xm550() {
  soc="xm550"
  fresh && make PLATFORM=xiongmai BOARD=unknown_unknown_${soc}_openipc all && rename
}

#################################################################################

#################################################################################

# Build firmware
#######
#
# ambarella-s3l                   # testing..
#
#######
#
# ak3918ev200                   # testing..
#
#######
#
# fh8833v100                    # testing..
# fh8852v100                    # testing..
# fh8852v200                    # testing..
# fh8852v210                    # testing..
# fh8856v100                    # testing..
# fh8856v200                    # testing..
# fh8856v210                    # testing..
# fh8858v200                    # testing..
# fh8858v210                    # testing..
#
#######
#
# gm8135                        # testing..
# gm8136                        # testing..
#
#######
#
# gk7101                        # testing..
# gk7101s                       # testing..
# gk7102                        # testing..
# gk7102s                       # testing..
#
#######
#
# gk7202v300                    # testing..
# gk7205v200                    # OpenIPC
# gk7205v200_fpv                # FPV
# gk7205v200_iscom              # Iscom test
# gk7205v200_ufanet             # Ufanet
# gk7205v300                    # OpenIPC
# gk7205v300_ultimate           # OpenIPC_ultimate version
# gk7205v300_fpv                # FPV
# gk7605v100                    # testing..
#
#######
#
# hi3516cv100                   # OpenIPC
#
# hi3516cv200                   # testing..
# hi3518ev200                   # testing..
# hi3516cv200                   # testing..
# hi3518ev200                   # testing..
# hi3518ev200_domsip            # DomSip
# hi3518ev200_hs303v1           # OpenIPC
# hi3518ev200_hs303v2           # OpenIPC
# hi3518ev200_hs303v3           # OpenIPC
#
# hi3516av100                   # OpenIPC
# hi3516dv100                   # OpenIPC
#
# hi3516cv300                   # OpenIPC
# hi3516cv300_ultimate          # OpenIPC_ultimate version
# hi3516ev100                   # OpenIPC
#
# hi3516dv200                   # OpenIPC
# hi3516ev200                   # OpenIPC
# hi3516ev200_dozor             # Dozor
# hi3516ev200_eltis             # Eltis
# hi3516ev200_vixand            # Vixand
# hi3516ev200_ultimate          # OpenIPC_ultimate version
# hi3516ev300                   # OpenIPC
# hi3516ev300_dev               # OpenIPC development
# hi3516ev300_glibc             # testing..
# hi3516ev300_tehshield         # Tehshield
# hi3516ev300_ultimate          # OpenIPC_ultimate version
# hi3518ev300                   # OpenIPC
#
# hi3519v101                    # OpenIPC
# hi3516av200                   # OpenIPC
#
# hi3516av300                   # testing..
# hi3516cv500                   # testing..
# hi3516dv300                   # testing..
#
# hi3536dv100                   # OpenIPC
#
#######
#
# nt98562                       # OpenIPC
# nt98566                       # OpenIPC
#
#######
#
# msc313e                       # OpenIPC
#
# ssc325                        # OpenIPC
#
# ssc333                        # OpenIPC
#
# ssc335                        # OpenIPC
# ssc335_blackbird              # BlackBird
# ssc335_goodcam                # GoodCam
# ssc335_initramfs              # Initramfs
# ssc335_musl                   # Musl
# ssc335_portal                 # Portal (partner)
# ssc335_rotek                  # Rotek
#
# ssc335de                      # OpenIPC
#
# ssc337                        # OpenIPC => musl
# ssc337_kama                   # uClibc
#
# ssc337de                      # OpenIPC
#
#######
#
# t10                           # testing..
# t20                           # testing..
# t30                           # testing..
# t31                           # testing..
#
#######
#
# xm510                         # testing
# xm530                         # OK
# xm550                         # OK
#
#######
#
# More examples see here: https://openipc.github.io/wiki/
#