private void WriteBinaryFile(byte[] bin, USARTBootloader loader, int count, int reminder)
 {
     ToolStripStatusLabel.Text = "ファームウェアの書き込み中。。。";
     this.Update();
     ProgressBar.Value  = 0;
     ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
     for (byte i = 0; i < count; i++)
     {
         int offset     = i * READ_WRITE_BLOCK_SIZE;
         int buffersize = READ_WRITE_BLOCK_SIZE;
         if (i == count - 1)
         {
             buffersize = reminder;
         }
         byte[] tmp = new byte[buffersize];
         Buffer.BlockCopy(bin, offset, tmp, 0, buffersize);
         loader.WriteMemory(
             (uint)(BASE_ADDRESS + offset),
             tmp);
         ProgressBar.Value  = i * 100 / count;
         ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
     }
     ProgressBar.Value  = 100;
     ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
 }
        /// <summary>
        /// FT232RのCBUSを操作するサンプルコード
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TestButton_Click(object sender, EventArgs e)
        {
            if (loader == null)
            {
                loader = CreateBootLoader();
            }
            loader.Open();

            if (!(loader is FT232RUSARTBootloader))
            {
                MessageBox.Show("FT232RUSARTBootloader のインスタンスを生成してください。");
            }

            FT232RUSARTBootloader ftLoader = (FT232RUSARTBootloader)loader;

            FT232RUSARTBootloader.CBUSConfig conf = new FT232RUSARTBootloader.CBUSConfig();
            conf.cbus0 = FT_CBUS_OPTIONS.FT_CBUS_IOMODE;
            conf.cbus1 = FT_CBUS_OPTIONS.FT_CBUS_IOMODE;
            ftLoader.SetCBusConfig(conf);

            FT232RUSARTBootloader.CBUSBit bits = new FT232RUSARTBootloader.CBUSBit();
            if (i == 0)
            {
                bits.cbus0 = false;
                bits.cbus1 = false;
                i++;
            }
            else if (i == 1)
            {
                bits.cbus0 = true;
                bits.cbus1 = false;
                i++;
            }
            else if (i == 2)
            {
                bits.cbus0 = false;
                bits.cbus1 = true;
                i++;
            }
            else if (i == 3)
            {
                bits.cbus0 = true;
                bits.cbus1 = true;
                i          = 0;
            }
            ftLoader.SetCBusBit(bits);
        }
        private void VerifyCheckBinaryFile(byte[] bin, USARTBootloader loader, int count, int reminder)
        {
            ToolStripStatusLabel.Text = "ベリファイチェック中。。。";
            this.Update();
            ProgressBar.Value  = 0;
            ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
            for (byte i = 0; i < count; i++)
            {
                // バッファサイズ計算
                int offset     = i * READ_WRITE_BLOCK_SIZE;
                int buffersize = READ_WRITE_BLOCK_SIZE;
                if (i == count - 1)
                {
                    buffersize = reminder;
                }

                // リード&チェック
                for (var j = 0; j < 5; j++)
                {
                    try {
                        bool   isFailed = true;
                        byte[] tmp      = loader.ReadMemory((uint)(BASE_ADDRESS + offset), buffersize);
                        for (var k = 0; k < buffersize; k++)
                        {
                            if (tmp[k] != bin[offset + k])
                            {
                                break;
                            }
                            if (k == buffersize - 1)
                            {
                                isFailed = false;
                            }
                        }
                        if (!isFailed)
                        {
                            break;
                        }
                    } catch (Exception ee) {
                    }
                }

                ProgressBar.Value  = i * 100 / count;
                ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
            }
            ProgressBar.Value  = 100;
            ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
        }
        private USARTBootloader CreateBootLoader()
        {
            SerialPort port = new SerialPort();

            port.PortName     = PortCombo.SelectedItem.ToString();
            port.BaudRate     = int.Parse(BaudrateCombo.SelectedItem.ToString());
            port.DataBits     = 8;
            port.StopBits     = StopBits.One;
            port.Parity       = Parity.Even;
            port.ReadTimeout  = 250;
            port.WriteTimeout = 250;

            loader = new USARTBootloader(port);
            //loader = new FTDIUSARTBootloader(port);
            //loader = new FT232RUSARTBootloader(port);

            return(loader);
        }
        private int EraseFlash(byte[] bin, USARTBootloader loader)
        {
            ToolStripStatusLabel.Text = "フラッシュメモリの消去中。。。";
            this.Update();
            int count = bin.Length / FLASH_BLOCK_SIZE;

            if (count % FLASH_BLOCK_SIZE != 0)
            {
                count++;
            }
            for (byte i = 0; i < count; i++)
            {
                loader.EraseMemory(i);
                ProgressBar.Value  = i * 100 / count;
                ProgressLabel.Text = ProgressBar.Value.ToString() + "%";
            }

            return(count);
        }
        private void WriteButton_Click(object sender, EventArgs e)
        {
            // ポートチェック
            if (PortCombo.SelectedItem == null)
            {
                MessageBox.Show("ポートを選択してください。");
                return;
            }

            // ファイルチェック
            if (string.IsNullOrEmpty(FileNameText.Text))
            {
                MessageBox.Show("ファイルを選択してください。");
                return;
            }
            else if (!(FileNameText.Text.EndsWith(".bin") || FileNameText.Text.EndsWith(".hex")))
            {
                MessageBox.Show("バイナリファイルを選択してください。");
                return;
            }

            // プログレスバーの初期化
            ProgressBar.Value = 0;

            // バイナリファイルの取得
            byte[] bin = GetBinary(FileNameText.Text);

            try {
                // USARTBootloaderの初期化
                if (loader == null)
                {
                    loader = CreateBootLoader();
                }
                loader.Open();
                loader.Init();

                Stopwatch sw = new Stopwatch();
                sw.Start();

                // フラッシュメモリーの消去
                int count = EraseFlash(bin, loader);

                // リードライトの回数と、最後のバッファサイズの計算
                count = bin.Length / READ_WRITE_BLOCK_SIZE;
                int reminder = bin.Length % READ_WRITE_BLOCK_SIZE;
                if (reminder != 0)
                {
                    count++;
                }

                // バイナリファイルの書き込み
                WriteBinaryFile(bin, loader, count, reminder);

                // ベリファイチェック
                VerifyCheckBinaryFile(bin, loader, count, reminder);

                // 完了
                sw.Stop();
                ToolStripStatusLabel.Text = "完了!! Total " + (decimal)sw.ElapsedMilliseconds / 1000 + "[s]";
            } finally {
                if (loader != null)
                {
                    //loader.Close();
                }
            }
        }