176 lines
6.0 KiB
C#
176 lines
6.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|