/// <summary>
        /// たぶんこれでFLASHのダンプが返ってくる
        /// </summary>
        /// <param name="page"></param>
        public void RequestFlashRomDump(int page)
        {
            string flashDump = "05 1C 00 " + string.Format("{0:X2}", page) + " FF";

            Debug.Log("リクエスト:" + flashDump);
            sendingQueue.Enqueue(PreMaidUtility.RewriteXorString(flashDump)); //FLASHの中身を教えてもらう?
        }
        /// <summary>
        /// 指定されたサーボ値を適用してシリアル通信でプリメイドAI実機に送る
        /// </summary>
        public void ApplyPoseFromServos(IEnumerable <PreMaidServo> servos, int speed = 10)
        {
            if (SerialPortOpen == false)
            {
                Debug.LogWarning("ポーズ指定されたときにシリアルポートが開いていません");
                return;
            }

            speed = Mathf.Clamp(speed, 1, 255);

            int servoNum = servos.Count();
            int orderLen = servoNum * 3 + 5; //命令長はサーボ個数が1個だったら0x08, サーボ個数が25個だったら0x50(80)になる

            //決め打ちのポーズ命令+スピード(小さい方が速くて、255が最大に遅い)
            string ret = orderLen.ToString("X2") + " 18 00 " + speed.ToString("X2");

            //そして各サーボぼ値を入れる
            foreach (var VARIABLE in servos)
            {
                ret += " " + VARIABLE.GetServoIdAndValueString();
            }

            ret += " FF"; //パリティビットを仮で挿入する;

            //パリティビットを計算し直した値にして、文字列を返す
            ret = PreMaidUtility.RewriteXorString(ret);
            sendingQueue.Enqueue(ret); //対象のモーション、今回は1個だけ;
        }
        /// <summary>
        /// バッテリー残量の問い合わせ、ハンドリングはPreMaidReceiver.csで行っています
        /// </summary>
        public void RequestBatteryRemain()
        {
            string batteryRequestOrder = "07 01 00 02 00 02 06";

            //Debug.Log("リクエスト:"+ batteryRequestOrder);
            sendingQueue.Enqueue(PreMaidUtility.RewriteXorString(batteryRequestOrder)); //バッテリー残量を教えてもらう
        }
        /// <summary>
        /// 現在のサーボ値を適用する1フレームだけのモーションを送る
        /// </summary>
        /// <returns></returns>
        string BuildPoseString(int speed = 50)
        {
            if (speed > 255)
            {
                speed = 255;
            }

            if (speed < 1)
            {
                speed = 1;
            }

            //決め打ちのポーズ命令+スピード(小さい方が速くて、255が最大に遅い)
            string ret = "50 18 00 " + speed.ToString("X2");

            //そして各サーボぼ値を入れる
            foreach (var VARIABLE in Servos)
            {
                ret += " " + VARIABLE.GetServoIdAndValueString();
            }

            ret += " FF"; //パリティビットを仮で挿入する;

            //パリティビットを計算し直した値にして、文字列を返す
            return(PreMaidUtility.RewriteXorString(ret));
        }
        /// <summary>
        /// 全サーボの強制脱力命令
        /// </summary>
        public void ForceAllServoStop()
        {
            //ここで連続送信モードを停止しないと、脱力後の急なサーボ命令で一気にプリメイドAIが暴れて死ぬ
            SetContinuousMode(false);

            string allStop = "50 18 00 06 02 00 00 03 00 00 04 00 00 05 00 00 06 00 00 07 00 00 08 00 00 09 00 00 0A 00 00 0B 00 00 0C 00 00 0D 00 00 0E 00 00 0F 00 00 10 00 00 11 00 00 12 00 00 13 00 00 14 00 00 15 00 00 16 00 00 17 00 00 18 00 00 1A 00 00 1C 00 00 FF";

            byte[] allServoStopOrder = PreMaidUtility.BuildByteDataFromStringOrder(PreMaidUtility.RewriteXorString(allStop));
            _serialPort.Write(allServoStopOrder, 0, allServoStopOrder.Length);
        }
        /// <summary>
        /// 全サーボの強制脱力命令
        /// </summary>
        public void ForceAllServoStop(bool disconnect = true)
        {
            //ここで連続送信モードを停止しないと、脱力後の急なサーボ命令で一気にプリメイドAIが暴れて死ぬ
            //なので、普段はついでにシリアルポートも切る

            string allStop =
                "50 18 00 06 02 00 00 03 00 00 04 00 00 05 00 00 06 00 00 07 00 00 08 00 00 09 00 00 0A 00 00 0B 00 00 0C 00 00 0D 00 00 0E 00 00 0F 00 00 10 00 00 11 00 00 12 00 00 13 00 00 14 00 00 15 00 00 16 00 00 17 00 00 18 00 00 1A 00 00 1C 00 00 FF";

            sendingQueue.Enqueue(PreMaidUtility.RewriteXorString(allStop)); //ストップ命令を送る

            if (disconnect)
            {
                CloseSerialPort();
            }
        }
        /// <summary>
        /// 現在のサーボ値を適用する1フレームだけのモーションを送る
        /// </summary>
        /// <returns></returns>
        string BuildPoseString(int speed = 10)
        {
            speed = Mathf.Clamp(speed, 1, 255);

            //決め打ちのポーズ命令+スピード(小さい方が速くて、255が最大に遅い)
            string ret = "08 18 00 " + speed.ToString("X2");
            //そして各サーボぼ値を入れる

            var index = _servos.FindIndex(x => x.GetServoId() == 2);

            ret += " " + _servos[index].GetServoIdAndValueString();


            ret += " FF"; //パリティビットを仮で挿入する;

            //パリティビットを計算し直した値にして、文字列を返す
            return(PreMaidUtility.RewriteXorString(ret));
        }
        /// <summary>
        /// 全サーボのスピードパラメータ指定命令
        /// 18 19 10 10 3C 18 3C 1C 3C 14 3C 0C 3C 0E 3C 16 3C 1A 3C 12 3C 0A 3C 07
        /// </summary>
        public void ForceAllServoSpeedProperty(int speed)
        {
            var targetSpeed = Mathf.Clamp(speed, 1, 127);

            string speedProp = string.Format("{0:X2}", targetSpeed);

            //0x36=54個なので
            //最初の3個+ 25サーボ*2パラメータ+ チェックバイト
            string allServo =
                "36 19 00";

            foreach (var VARIABLE in Servos)
            {
                allServo += " " + VARIABLE.GetServoIdString() + " " + speedProp;
            }

            allServo += "FF";
            sendingQueue.Enqueue(PreMaidUtility.RewriteXorString(allServo)); //ストレッチ命令を送る
        }