using ProjectBase.Data.Logs;
using ProjectBase.Data.Redis;
using SIASUN.Autopilot.Device.Common;
using SIASUN.Autopilot.Device.Message;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIASUN.Autopilot.BLL.Controler
{
   
    public class BlControler
    {
        // 控制器命令值
        private string power = "1";

        /// <summary>
        /// 定时器
        /// </summary>
        private static MTimer mTime;

        private RedisHelper redis = new RedisHelper(0);

        /// <summary>
        /// 控制上电命令 ICU-》RCU 
        /// </summary>
        /// <param name="power">0=Power Off;1=Power ON;2=无效命令</param>
        /// <returns></returns>
        public int RCUPowerOnRequest(PowerStatus power)
        {
            LogHelper.log.Info("发送RCU控制上电命令请求");
            控制器上电命令 sMsg = new 控制器上电命令()
            {
                RCU上电 = power.ToString(),
                油门电机控制器上电 = power.ToString(),
                制动电机控制器上电 = power.ToString(),
                离合电机控制器上电 = power.ToString(),
                转向电机控制器上电 = power.ToString(),
                换挡臂X电机控制器上电 = power.ToString(),
                换挡臂Y电机控制器上电 = power.ToString()

            };
            SimpleCommand<控制器上电命令> cmd = new SimpleCommand<控制器上电命令>();
            int r = cmd.Execute(sMsg, sMsg.GetId);
            LogHelper.log.Info(string.Format("发送控制器上电命令，返回值{0}", r));
            if (r > 0)
            {
                mTime = new MTimer(100, 500, 1, CirculateSend);
                mTime.Open();
            }
            return r;
        }

        /// <summary>
        /// 执行机构使能请求
        /// </summary>
        /// <param name="common">0=Disable;1=Enable</param>
        /// <param name="throttleClutch">油门离合器控制:0=Joint;1=Release;2=无效命令</param>
        /// <param name="actuallySysControl">实际系统控制模式请求:0=自动学习模式;1=手动学习模式;3=人工驾驶模式;4=机器人自检模式;5=机器人调试模式</param>
        /// <returns></returns>
        public int RCUEnableRequest()
        {
            LogHelper.log.Info("发送RCU使能命令请求");
            执行机构使能请求 sMsg = new 执行机构使能请求()
            {
                实际系统控制模式请求 = redis.GetString("实际系统控制模式请求"),
                机器人Estop使能 = redis.GetString("机器人Estop使能"),
                制动急停气泵使能 = redis.GetString("制动急停气泵使能"),
                系统软急停使能 = redis.GetString("系统软急停使能"),
                换挡臂Y电机使能 = redis.GetString("换挡臂Y电机使能"),
                离合电机使能 = redis.GetString("离合电机使能"),
                油门离合器控制 = redis.GetString("油门离合器控制"),
                油门电机使能 = redis.GetString("油门电机使能"),
                制动电机使能 = redis.GetString("制动电机使能"),
                转向电机使能 = redis.GetString("转向电机使能"),
                换挡臂X电机使能 = redis.GetString("换挡臂X电机使能")

            };
            SimpleCommand<执行机构使能请求> cmd = new SimpleCommand<执行机构使能请求>();
            int r = cmd.Execute(sMsg, sMsg.GetId);
            LogHelper.log.Info(string.Format("发送执行机构使能请求，返回值{0}", r));
            return r;
        }

        /// <summary>
        /// 循环发送命令
        /// </summary>
        private static void CirculateSend(object sender, long JumpPeriod, long interval)
        {

        }

        /// <summary>
        /// 学习模式请求确认
        /// </summary>
        /// <param name="sMg"></param>
        /// <returns></returns>
        public int RCULearnModeRequest()
        {
            LogHelper.log.Info("发送RCU学习模式请求确认命令");
            学习模式请求确认 sMg = new 学习模式请求确认()
            {
                档位自动学习完成确认 = redis.GetString("档位自动学习完成确认"),
                清空挡位学习表 = redis.GetString("清空挡位学习表"),
                终止自动学习 = redis.GetString("终止自动学习"),
                清空油门学习表 = redis.GetString("清空油门学习表"),
                清空制动学习表 = redis.GetString("清空制动学习表"),
                清空离合学习表 = redis.GetString("清空离合学习表"),
                清空转向学习表 = redis.GetString("清空转向学习表"),
                挡位位置学习请求确认 = redis.GetString("挡位位置学习请求确认"),
                位置学习请求确认 = redis.GetString("位置学习请求确认"),
                系统学习请求 = redis.GetString("系统学习请求")
            };
            SimpleCommand<学习模式请求确认> cmd = new SimpleCommand<学习模式请求确认>();
            int r = cmd.Execute(sMg,sMg.GetId);
            LogHelper.log.Info(string.Format("发送学习模式请求确认命令，返回值{0}", r));
            return r;
        }

        /// <summary>
        /// 踏板执行机构控制命令
        /// </summary>
        /// <returns></returns>
        public int PedalControlCommand()
        {
            LogHelper.log.Info("发送踏板执行机构控制命令");
            踏板执行机构控制命令 sMg = new 踏板执行机构控制命令()
            {
                制动踏板力控制请求 = redis.GetString("制动踏板力控制请求"),
                制动踏板速度控制请求 = redis.GetString("制动踏板速度控制请求"),
                制动踏板控制模式请求 = redis.GetString("制动踏板控制模式请求"),
                制动踏板位置控制请求 = redis.GetString("制动踏板位置控制请求"),
                油门踏板速度控制请求 = redis.GetString("油门踏板速度控制请求"),
                油门踏板位置控制请求 = redis.GetString("油门踏板位置控制请求")
            };
            SimpleCommand<踏板执行机构控制命令> cmd = new SimpleCommand<踏板执行机构控制命令>();
            int r = cmd.Execute(sMg, sMg.GetId);
            LogHelper.log.Info(string.Format("发送踏板执行机构控制命令，返回值{0}", r));
            return r;
        }

        /// <summary>
        /// 转向执行机构控制命令
        /// </summary>
        /// <returns></returns>
        public int TurnControlCommand()
        {
            LogHelper.log.Info("发送转向执行机构控制命令");
            转向执行机构控制命令 sMg = new 转向执行机构控制命令()
            {
                方向盘转矩控制请求 = redis.GetString("方向盘转矩控制请求"),
                方向盘转速控制请求 = redis.GetString("方向盘转速控制请求"),
                方向盘控制模式请求 = redis.GetString("方向盘控制模式请求"),
                方向盘转角控制请求 = redis.GetString("方向盘转角控制请求")
            };
            SimpleCommand<转向执行机构控制命令> cmd = new SimpleCommand<转向执行机构控制命令>();
            int r = cmd.Execute(sMg, sMg.GetId);
            LogHelper.log.Info(string.Format("发送转向执行机构控制命令，返回值{0}", r));
            return r;
        }

        /// <summary>
        /// 挡位执行机构控制命令
        /// </summary>
        /// <returns></returns>
        public int GearControlCommand()
        {
            LogHelper.log.Info("发送挡位执行机构控制命令");
            挡位执行机构控制命令 sMg = new 挡位执行机构控制命令()
            {
                离合踏板速度控制请求 = redis.GetString("离合踏板速度控制请求"),
                离合踏板位置控制请求 = redis.GetString("离合踏板位置控制请求"),
                换挡模式请求 = redis.GetString("换挡模式请求"),
                挡位控制请求 = redis.GetString("挡位控制请求")
            };
            SimpleCommand<挡位执行机构控制命令> cmd = new SimpleCommand<挡位执行机构控制命令>();
            int r = cmd.Execute(sMg, sMg.GetId);
            LogHelper.log.Info(string.Format("发送挡位执行机构控制命令，返回值{0}", r));
            return r;
        }
    }
}
