using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Threading; namespace TinyFPGA_VisualProgrammer { public partial class Programmer : Form { SerialController sController = null; TinyProg TProg = null; public Programmer() { InitializeComponent(); fileSelectDialog.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath); this.AllowDrop = true; this.DragEnter += new DragEventHandler(Programmer_DragEnter); this.DragDrop += new DragEventHandler(Programmer_DragDrop); sController = new SerialController(); TProg = new TinyProg(sController, statusLabel, bgWorker); if (sController.sPortsList != null && sController.sPortsList.Count > 0) { foreach (string s in sController.sPortsList) serialPortList.Items.Add(s); serialPortList.SelectedIndex = serialPortList.Items.Count - 1; } } void Programmer_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; } void Programmer_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); fileLocationTextBox.Text = files.First(); fileSelectDialog.FileName = files.First(); RefreshProgramBtnStatus(); } private void fileExpSelect_Click(object sender, EventArgs e) { fileSelectDialog.ShowDialog(); } private void fileSelectDialog_FileOk(object sender, CancelEventArgs e) { fileLocationTextBox.Text = fileSelectDialog.FileName; RefreshProgramBtnStatus(); } private void connectBtn_Click(object sender, EventArgs e) { connectBtn.Enabled = false; UseWaitCursor = true; if (sController.GetPortOpened()) { sController.ClosePort(); connectBtn.Text = "Connect"; statusLabel.Text = "--"; } else { sController.comPortName = serialPortList.SelectedItem.ToString(); sController.OpenPort(); if (sController.GetPortOpened()) TProg.CheckTinyPresence(); if (TProg.TinyFPGAIsConnected) { statusLabel.Text = TProg.GetBoardData().Name + " v" + TProg.GetBoardData().HVer + " found."; ResetBtn.Enabled = true; } else { statusLabel.Text = "No TinyFPGA found."; ResetBtn.Enabled = false; } connectBtn.Text = "Disconnect"; } connectBtn.Enabled = true; UseWaitCursor = false; RefreshProgramBtnStatus(); } private void serialPortList_SelectedIndexChanged(object sender, EventArgs e) { if (serialPortList.SelectedItem.ToString().Length > 0) connectBtn.Enabled = true; else connectBtn.Enabled = false; } private void Programmer_Load(object sender, EventArgs e) { modeList.SelectedIndex = 0; } private void ResetBtn_Click(object sender, EventArgs e) { if (TProg.TinyFPGAIsConnected) { TProg.ResetCmd(); statusLabel.Text = "Board has been reset."; connectBtn.PerformClick(); } } private void RefreshProgramBtnStatus() { if (TProg.TinyFPGAIsConnected && (fileLocationTextBox.Text.Length > 0)) launchProgramBtn.Enabled = true; else launchProgramBtn.Enabled = false; } private void launchProgramBtn_Click(object sender, EventArgs e) { launchProgramBtn.Enabled = false; ResetBtn.Enabled = false; bgWorker.RunWorkerAsync(); } private void bgWorker_DoWork(object sender, DoWorkEventArgs e) { byte[] bitstream = null; // Read bitstream file - unknown extensions will be considered as binary using (FileStream fs = new FileStream(fileLocationTextBox.Text, FileMode.Open, FileAccess.Read)) { bitstream = new byte[fs.Length]; fs.Read(bitstream, 0, (int)fs.Length); } if (fileLocationTextBox.Text.EndsWith(".hex")) { string hexString = System.Text.Encoding.ASCII.GetString(bitstream); bitstream = hexString.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(i => (byte)Convert.ToInt32(i, 16)) .ToArray(); } // Do the programming statusLabel.Invoke((MethodInvoker)(() => statusLabel.Text = bitstream.Length.ToString() + " bytes to program.")); if (TProg.Program(ref bitstream, ref bgWorker)) statusLabel.Invoke((MethodInvoker)(() => statusLabel.Text = "SUCCESS!")); } private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { programStatusBar.Value = e.ProgressPercentage; } private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { launchProgramBtn.Enabled = true; ResetBtn.Enabled = true; } } }