package main

import (
	"fmt"
	"os"
	"time"

	gps "hnyfkj.com.cn/rtu/linux/air530z"
	baseapp "hnyfkj.com.cn/rtu/linux/baseapp"
	camera1 "hnyfkj.com.cn/rtu/linux/mvs_u_takephoto" // 海康U口相机
	netmgrd "hnyfkj.com.cn/rtu/linux/netmgrd"
	mcu "hnyfkj.com.cn/rtu/xy_v/mcu_ctrl_board"
	"hnyfkj.com.cn/rtu/xy_v/reporter"
)

const (
	rcLocalTxt = `
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

#设置系统主频
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 528000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

#设置一秒落盘
echo 100 > /proc/sys/vm/dirty_writeback_centisecs
echo 100 > /proc/sys/vm/dirty_expire_centisecs

#启动运行程序
/home/root/rtu_xy_v/script/stop
/home/root/rtu_xy_v/script/start

exit 0
`
	rcLocalFile = "/etc/rc.local"
)

func enableAutoStartOnBoot() error {
	if _, err := os.Stat(rcLocalFile); err == nil {
		bakFile := rcLocalFile + "." + time.Now().Format("20060102150405")
		err = os.Rename(rcLocalFile, bakFile)
		if err != nil {
			return err
		}
	}

	f, err := os.OpenFile(rcLocalFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
	if err != nil {
		return err
	}
	defer f.Close()

	_, err = f.WriteString(rcLocalTxt)
	if err != nil {
		return err
	}

	err = os.Chmod(rcLocalFile, 0755)
	if err != nil {
		return err
	}

	return nil
}

func main() {
	if baseapp.IsArgsParam("-h") {
		help()
		return
	}

	if baseapp.IsArgsParam("-v") {
		fmt.Println("程序版本:", baseapp.Version, "\n构建时间:", baseapp.BuildTime)
		return
	}

	if baseapp.GetArgsParamStr("-install", "") == "boot" {
		err := enableAutoStartOnBoot()
		if err != nil {
			fmt.Printf("设置开机自启动失败: %v", err)
		} else {
			fmt.Println("设置开机自启动成功")
		}
		return
	}

	baseapp.ModuleInit()
	baseapp.SingleInstanceRun() // 异步非阻塞
	baseapp.Logger.Infof("程序版本: %s 构建时间: %s\n程序开始运行...",
		baseapp.Version, baseapp.BuildTime)

	// 01, 初始化卫星定位模块
	gps.ModuleInit()

	// 02, 初始化4G调制解调器
	if !netmgrd.ModemInit() {
		goto end_p
	}

	// 03, 初始化网络管理模块
	netmgrd.ModuleInit()
	netmgrd.WaitAllOK(time.Duration(10) * time.Second) // 等待联网成功和NTP时间同步成功

	// 04, 初始化相机拍照模块
	if !camera1.ModuleInit() {
		goto end_p
	}

	// 05, 初始化单片机控制板
	if !mcu.ModuleInit() {
		goto end_p
	}

	// 06, 后台服务器业务交互
	if !reporter.ModuleInit() {
		goto end_p
	}

	// 07, 阻塞等待退出信号量
	select {
	case <-baseapp.IsExit2():
	case <-mcu.NotifyPwrWillOff():
	}

	// 08, 退出程序并释放资源
end_p:
	reporter.ModuleExit()
	mcu.ModuleExit()
	netmgrd.ModemExit()
	gps.ModuleExit()

	baseapp.Logger.Info("程序退出")
	baseapp.ExitLogger() // 安全的关闭日志模块
	baseapp.SafeExit()   // 安全的关闭退出程序
}

func help() {
	h := `
-h 显示帮助提示
-v 当前程序版本
-install boot 设置程序开机自启动
`

	fmt.Println(h)
}
