0,0 → 1,1381 |
using System; |
using System.Collections.Generic; |
using System.ComponentModel; |
using System.Data; |
using System.Drawing; |
using System.Linq; |
using System.Text; |
using System.Windows.Forms; |
using System.Runtime.InteropServices; |
using System.IO.Ports; |
using System.IO; |
using ArdupilotMega; |
using System.Xml; |
|
namespace OSD |
{ |
public partial class OSD : Form |
{ |
//max 7456 datasheet pg 10 |
//pal = 16r 30 char |
//ntsc = 13r 30 char |
Size basesize = new Size(30, 16); |
/// <summary> |
/// the un-scaled font render image |
/// </summary> |
Bitmap screen = new Bitmap(30 * 12, 16 * 18); |
/// <summary> |
/// the scaled to size background control |
/// </summary> |
Bitmap image = new Bitmap(30 * 12, 16 * 18); |
/// <summary> |
/// Bitmaps of all the chars created from the mcm |
/// </summary> |
Bitmap[] chars; |
/// <summary> |
/// record of what panel is using what squares |
/// </summary> |
string[][] usedPostion = new string[30][]; |
/// <summary> |
/// used to track currently selected panel across calls |
/// </summary> |
string currentlyselected = ""; |
/// <summary> |
/// used to track current processing panel across calls (because i maintained the original code for panel drawing) |
/// </summary> |
string processingpanel = ""; |
/// <summary> |
/// use to draw the red outline box is currentlyselected matchs |
/// </summary> |
bool selectedrectangle = false; |
/// <summary> |
/// use to as a invalidator |
/// </summary> |
bool startup = false; |
/// <summary> |
/// 328 eeprom memory |
/// </summary> |
byte[] eeprom = new byte[1024]; |
/// <summary> |
/// background image |
/// </summary> |
Image bgpicture; |
|
bool mousedown = false; |
|
SerialPort comPort = new SerialPort(); |
|
Panels pan; |
|
Tuple<string, Func<int, int, int>, int, int, int, int, int>[] panelItems = new Tuple<string, Func<int, int, int>, int, int, int, int, int>[30]; |
|
Graphics gr; |
|
// in pixels |
int x = 0, y = 0; |
|
public OSD() |
{ |
InitializeComponent(); |
|
// load default font |
chars = mcm.readMCM("OSD_SA_v5.mcm"); |
// load default bg picture |
try |
{ |
bgpicture = Image.FromFile("vlcsnap-2012-01-28-07h46m04s95.png"); |
} |
catch { } |
|
gr = Graphics.FromImage(screen); |
|
pan = new Panels(this); |
|
// setup all panel options |
setupFunctions(); |
} |
|
void changeToPal(bool pal) |
{ |
if (pal) |
{ |
basesize = new Size(30, 16); |
|
screen = new Bitmap(30 * 12, 16 * 18); |
image = new Bitmap(30 * 12, 16 * 18); |
|
NUM_X.Maximum = 29; |
NUM_Y.Maximum = 15; |
} |
else |
{ |
basesize = new Size(30, 13); |
|
screen = new Bitmap(30 * 12, 13 * 18); |
image = new Bitmap(30 * 12, 13 * 18); |
|
NUM_X.Maximum = 29; |
NUM_Y.Maximum = 15; |
} |
|
|
} |
|
void setupFunctions() |
{ |
currentlyselected = ""; |
processingpanel = ""; |
|
int a = 0; |
|
for (a = 0; a < usedPostion.Length; a++) |
{ |
usedPostion[a] = new string[16]; |
} |
|
a = 0; |
|
// first 8 |
// Display name,printfunction,X,Y,ENaddress,Xaddress,Yaddress |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Center", pan.panCenter, 13, 8, panCenter_en_ADDR, panCenter_x_ADDR, panCenter_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Pitch", pan.panPitch, 22, 9, panPitch_en_ADDR, panPitch_x_ADDR, panPitch_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Roll", pan.panRoll, 11, 1, panRoll_en_ADDR, panRoll_x_ADDR, panRoll_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Battery A", pan.panBatt_A, 21, 1, panBatt_A_en_ADDR, panBatt_A_x_ADDR, panBatt_A_y_ADDR); |
//items[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Battery B", pan.panBatt_B, 21, 3, panBatt_B_en_ADDR, panBatt_B_x_ADDR, panBatt_B_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Visible Sats", pan.panGPSats, 2, 13, panGPSats_en_ADDR, panGPSats_x_ADDR, panGPSats_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("GPS Lock", pan.panGPL, 5, 13, panGPL_en_ADDR, panGPL_x_ADDR, panGPL_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("GPS Coord", pan.panGPS, 2, 14, panGPS_en_ADDR, panGPS_x_ADDR, panGPS_y_ADDR); |
|
//second 8 |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Heading Rose", pan.panRose, 16, 14, panRose_en_ADDR, panRose_x_ADDR, panRose_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Heading", pan.panHeading, 24, 13, panHeading_en_ADDR, panHeading_x_ADDR, panHeading_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Heart Beat", pan.panMavBeat, 2, 9, panMavBeat_en_ADDR, panMavBeat_x_ADDR, panMavBeat_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Home Direction", pan.panHomeDir, 14, 3, panHomeDir_en_ADDR, panHomeDir_x_ADDR, panHomeDir_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Home Distance", pan.panHomeDis, 2, 1, panHomeDis_en_ADDR, panHomeDis_x_ADDR, panHomeDis_y_ADDR); |
//items[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("WP Dir", pan.panWPDir, 14, 4, panWPDir_en_ADDR, panWPDir_x_ADDR, panWPDir_y_ADDR); |
//items[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("WP Dir", pan.panWPDis, 14, 4, panWPDis_en_ADDR, panWPDis_x_ADDR, panWPDis_y_ADDR); |
// rssi |
|
// third 8 |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Altitude", pan.panAlt, 2, 2, panAlt_en_ADDR, panAlt_x_ADDR, panAlt_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Velocity", pan.panVel, 2, 3, panVel_en_ADDR, panVel_x_ADDR, panVel_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Throttle", pan.panThr, 2, 4, panThr_en_ADDR, panThr_x_ADDR, panThr_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Flight Mode", pan.panFlightMode, 17, 13, panFMod_en_ADDR, panFMod_x_ADDR, panFMod_y_ADDR); |
panelItems[a++] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>("Horizon", pan.panHorizon, 8, 7, panHorizon_en_ADDR, panHorizon_x_ADDR, panHorizon_y_ADDR); |
|
LIST_items.Items.Clear(); |
|
startup = true; |
|
foreach (var thing in panelItems) |
{ |
if (thing != null) |
{ |
if (thing.Item1 == "Center") |
{ |
LIST_items.Items.Add(thing.Item1, false); |
} |
else |
{ |
LIST_items.Items.Add(thing.Item1, true); |
} |
} |
} |
|
startup = false; |
|
osdDraw(); |
} |
|
private string[] GetPortNames() |
{ |
string[] devs = new string[0]; |
|
if (Directory.Exists("/dev/")) |
devs = Directory.GetFiles("/dev/", "*ACM*"); |
|
string[] ports = SerialPort.GetPortNames(); |
|
string[] all = new string[devs.Length + ports.Length]; |
|
devs.CopyTo(all, 0); |
ports.CopyTo(all, devs.Length); |
|
return all; |
} |
|
public void setPanel(int x, int y) |
{ |
this.x = x * 12; |
this.y = y * 18; |
} |
|
public void openPanel() |
{ |
d = 0; |
r = 0; |
} |
|
public void openSingle(int x, int y) |
{ |
setPanel(x, y); |
openPanel(); |
} |
|
public int getCenter() |
{ |
if (CHK_pal.Checked) |
return 8; |
return 6; |
} |
|
// used for printf tracking line and row |
int d = 0, r = 0; |
|
public void printf(string format, params object[] args) |
{ |
StringBuilder sb = new StringBuilder(); |
|
sb = new StringBuilder(AT.MIN.Tools.sprintf(format, args)); |
|
//sprintf(sb, format, __arglist(args)); |
|
//Console.WriteLine(sb.ToString()); |
|
foreach (char ch in sb.ToString().ToCharArray()) |
{ |
if (ch == '|') |
{ |
d += 1; |
r = 0; |
continue; |
} |
|
try |
{ |
// draw red boxs |
if (selectedrectangle) |
{ |
gr.DrawRectangle(Pens.Red, (this.x + r * 12) % screen.Width, (this.y + d * 18), 12, 18); |
} |
|
int w1 = (this.x / 12 + r) % basesize.Width; |
int h1 = (this.y / 18 + d); |
|
if (w1 < basesize.Width && h1 < basesize.Height) |
{ |
// check if this box has bene used |
if (usedPostion[w1][h1] != null) |
{ |
//System.Diagnostics.Debug.WriteLine("'" + used[this.x / 12 + r * 12 / 12][this.y / 18 + d * 18 / 18] + "'"); |
} |
else |
{ |
gr.DrawImage(chars[ch], (this.x + r * 12) % screen.Width, (this.y + d * 18), 12, 18); |
} |
|
usedPostion[w1][h1] = processingpanel; |
} |
} |
catch { System.Diagnostics.Debug.WriteLine("printf exception"); } |
r++; |
} |
} |
|
string getMouseOverItem(int x, int y) |
{ |
int ansW,ansH; |
|
getCharLoc(x, y, out ansW, out ansH); |
|
if (usedPostion[ansW][ansH] != null && usedPostion[ansW][ansH] != "") |
{ |
LIST_items.SelectedIndex = LIST_items.Items.IndexOf(usedPostion[ansW][ansH]); |
return usedPostion[ansW][ansH]; |
} |
|
return ""; |
} |
|
void getCharLoc(int x, int y,out int xpos, out int ypos) |
{ |
|
x = Constrain(x, 0, pictureBox1.Width - 1); |
y = Constrain(y, 0, pictureBox1.Height - 1); |
|
float scaleW = pictureBox1.Width / (float)screen.Width; |
float scaleH = pictureBox1.Height / (float)screen.Height; |
|
int ansW = (int)((x / scaleW / 12) % 30); |
int ansH = 0; |
if (CHK_pal.Checked) |
{ |
ansH = (int)((y / scaleH / 18) % 16); |
} |
else |
{ |
ansH = (int)((y / scaleH / 18) % 13); |
} |
|
xpos = Constrain(ansW,0,30 -1); |
ypos = Constrain(ansH,0,16 - 1); |
} |
|
public void printf_P(string format, params object[] args) |
{ |
printf(format, args); |
} |
|
public void closePanel() |
{ |
x = 0; |
y = 0; |
} |
|
void osdDraw() |
{ |
if (startup) |
return; |
|
for (int b = 0; b < usedPostion.Length; b++) |
{ |
usedPostion[b] = new string[16]; |
} |
|
image = new Bitmap(pictureBox1.Width, pictureBox1.Height); |
|
float scaleW = pictureBox1.Width / (float)screen.Width; |
float scaleH = pictureBox1.Height / (float)screen.Height; |
|
screen = new Bitmap(screen.Width, screen.Height); |
|
gr = Graphics.FromImage(screen); |
|
image = new Bitmap(image.Width, image.Height); |
|
Graphics grfull = Graphics.FromImage(image); |
|
try |
{ |
grfull.DrawImage(bgpicture, 0, 0, pictureBox1.Width, pictureBox1.Height); |
} |
catch { } |
|
if (checkBox1.Checked) |
{ |
for (int b = 1; b < 16; b++) |
{ |
for (int a = 1; a < 30; a++) |
{ |
grfull.DrawLine(new Pen(Color.Gray, 1), a * 12 * scaleW, 0, a * 12 * scaleW, pictureBox1.Height); |
grfull.DrawLine(new Pen(Color.Gray, 1), 0, b * 18 * scaleH, pictureBox1.Width, b * 18 * scaleH); |
} |
} |
} |
|
pan.setHeadingPatern(); |
pan.setBatteryPic(); |
|
List<string> list = new List<string>(); |
|
foreach (string it in LIST_items.CheckedItems) |
{ |
list.Add(it); |
} |
|
list.Reverse(); |
|
foreach (string it in list) |
{ |
foreach (var thing in panelItems) |
{ |
selectedrectangle = false; |
if (thing != null) |
{ |
if (thing.Item1 == it) |
{ |
if (thing.Item1 == currentlyselected) |
{ |
selectedrectangle = true; |
} |
|
processingpanel = thing.Item1; |
|
// ntsc and below the middle line |
if (thing.Item4 >= getCenter() && !CHK_pal.Checked) |
{ |
thing.Item2(thing.Item3, thing.Item4 - 3); |
} |
else // pal and no change |
{ |
thing.Item2(thing.Item3, thing.Item4); |
} |
|
} |
} |
} |
} |
|
grfull.DrawImage(screen, 0, 0, image.Width, image.Height); |
|
pictureBox1.Image = image; |
} |
|
int Constrain(double value, double min, double max) |
{ |
if (value < min) |
return (int)min; |
if (value > max) |
return (int)max; |
|
return (int)value; |
} |
|
private void OSD_Load(object sender, EventArgs e) |
{ |
|
string strVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); |
this.Text = this.Text + " " + strVersion; |
|
CMB_ComPort.Items.AddRange(GetPortNames()); |
|
if (CMB_ComPort.Items.Count > 0) |
CMB_ComPort.SelectedIndex = 0; |
|
xmlconfig(false); |
|
osdDraw(); |
} |
|
private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) |
{ |
string item = ((CheckedListBox)sender).SelectedItem.ToString(); |
|
currentlyselected = item; |
|
osdDraw(); |
|
foreach (var thing in panelItems) |
{ |
if (thing != null && thing.Item1 == item) |
{ |
NUM_X.Value = Constrain(thing.Item3,0,basesize.Width -1); |
NUM_Y.Value = Constrain(thing.Item4,0,16 -1); |
} |
} |
} |
|
private void checkedListBox1_SelectedValueChanged(object sender, EventArgs e) |
{ |
if (((CheckedListBox)sender).Text == "Horizon") |
{ |
//groupBox1.Enabled = false; |
} |
else |
{ |
//groupBox1.Enabled = true; |
} |
} |
|
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) |
{ |
// if (((CheckedListBox)sender).SelectedItem != null && ((CheckedListBox)sender).SelectedItem.ToString() == "Horizon") |
if (((CheckedListBox)sender).SelectedItem != null) |
{ |
if (((CheckedListBox)sender).SelectedItem.ToString() == "Horizon" && e.NewValue == CheckState.Checked) |
{ |
int index = LIST_items.Items.IndexOf("Center"); |
LIST_items.SetItemChecked(index, false); |
} |
else if (((CheckedListBox)sender).SelectedItem.ToString() == "Center" && e.NewValue == CheckState.Checked) |
{ |
int index = LIST_items.Items.IndexOf("Horizon"); |
LIST_items.SetItemChecked(index, false); |
} |
} |
|
// add a delay to this so it runs after the control value has been defined. |
if (this.IsHandleCreated) |
this.BeginInvoke((MethodInvoker)delegate { osdDraw(); }); |
} |
|
private void numericUpDown1_ValueChanged(object sender, EventArgs e) |
{ |
string item; |
try |
{ |
item = LIST_items.SelectedItem.ToString(); |
} |
catch { return; } |
|
for (int a = 0; a < panelItems.Length; a++) |
{ |
if (panelItems[a] != null && panelItems[a].Item1 == item) |
{ |
panelItems[a] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>(panelItems[a].Item1, panelItems[a].Item2, (int)NUM_X.Value, panelItems[a].Item4, panelItems[a].Item5, panelItems[a].Item6, panelItems[a].Item7); |
} |
} |
|
osdDraw(); |
} |
|
private void numericUpDown2_ValueChanged(object sender, EventArgs e) |
{ |
string item; |
try |
{ |
item = LIST_items.SelectedItem.ToString(); |
} |
catch { return; } |
|
for (int a = 0; a < panelItems.Length; a++) |
{ |
if (panelItems[a] != null && panelItems[a].Item1 == item) |
{ |
panelItems[a] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>(panelItems[a].Item1, panelItems[a].Item2, panelItems[a].Item3, (int)NUM_Y.Value, panelItems[a].Item5, panelItems[a].Item6, panelItems[a].Item7); |
|
} |
} |
|
osdDraw(); |
} |
|
private void BUT_WriteOSD_Click(object sender, EventArgs e) |
{ |
toolStripProgressBar1.Style = ProgressBarStyle.Continuous; |
this.toolStripStatusLabel1.Text = ""; |
|
foreach (string str in this.LIST_items.Items) |
{ |
foreach (var tuple in this.panelItems) |
{ |
if ((tuple != null) && ((tuple.Item1 == str)) && tuple.Item5 != -1) |
{ |
eeprom[tuple.Item5] = (byte)(this.LIST_items.CheckedItems.Contains(str) ? 1 : 0); |
eeprom[tuple.Item6] = (byte)tuple.Item3; // x |
eeprom[tuple.Item7] = (byte)tuple.Item4; // y |
|
Console.WriteLine(str); |
} |
} |
} |
|
ArduinoSTK sp; |
|
try |
{ |
if (comPort.IsOpen) |
comPort.Close(); |
|
sp = new ArduinoSTK(); |
sp.PortName = CMB_ComPort.Text; |
sp.BaudRate = 57600; |
sp.DtrEnable = true; |
|
sp.Open(); |
} |
catch { MessageBox.Show("Error opening com port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } |
|
if (sp.connectAP()) |
{ |
try |
{ |
if (sp.upload(eeprom, 0, 200, 0)) |
{ |
MessageBox.Show("Done!"); |
} |
else |
{ |
MessageBox.Show("Failed to upload new settings"); |
} |
} |
catch (Exception ex) { |
MessageBox.Show(ex.Message); |
} |
} |
else |
{ |
MessageBox.Show("Failed to talk to bootloader"); |
} |
|
sp.Close(); |
} |
|
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) |
{ |
|
} |
|
private void comboBox1_Click(object sender, EventArgs e) |
{ |
CMB_ComPort.Items.Clear(); |
CMB_ComPort.Items.AddRange(GetPortNames()); |
} |
|
|
|
/* *********************************************** */ |
// EEPROM Storage addresses |
|
// First of 8 panels |
const int panCenter_en_ADDR = 0; |
const int panCenter_x_ADDR = 2; |
const int panCenter_y_ADDR = 4; |
const int panPitch_en_ADDR = 6; |
const int panPitch_x_ADDR = 8; |
const int panPitch_y_ADDR = 10; |
const int panRoll_en_ADDR = 12; |
const int panRoll_x_ADDR = 14; |
const int panRoll_y_ADDR = 16; |
const int panBatt_A_en_ADDR = 18; |
const int panBatt_A_x_ADDR = 20; |
const int panBatt_A_y_ADDR = 22; |
const int panBatt_B_en_ADDR = 24; |
const int panBatt_B_x_ADDR = 26; |
const int panBatt_B_y_ADDR = 28; |
const int panGPSats_en_ADDR = 30; |
const int panGPSats_x_ADDR = 32; |
const int panGPSats_y_ADDR = 34; |
const int panGPL_en_ADDR = 36; |
const int panGPL_x_ADDR = 38; |
const int panGPL_y_ADDR = 40; |
const int panGPS_en_ADDR = 42; |
const int panGPS_x_ADDR = 44; |
const int panGPS_y_ADDR = 46; |
|
// Second set of 8 panels |
const int panRose_en_ADDR = 48; |
const int panRose_x_ADDR = 50; |
const int panRose_y_ADDR = 52; |
const int panHeading_en_ADDR = 54; |
const int panHeading_x_ADDR = 56; |
const int panHeading_y_ADDR = 58; |
const int panMavBeat_en_ADDR = 60; |
const int panMavBeat_x_ADDR = 62; |
const int panMavBeat_y_ADDR = 64; |
const int panHomeDir_en_ADDR = 66; |
const int panHomeDir_x_ADDR = 68; |
const int panHomeDir_y_ADDR = 70; |
const int panHomeDis_en_ADDR = 72; |
const int panHomeDis_x_ADDR = 74; |
const int panHomeDis_y_ADDR = 76; |
const int panWPDir_en_ADDR = 80; |
const int panWPDir_x_ADDR = 82; |
const int panWPDir_y_ADDR = 84; |
const int panWPDis_en_ADDR = 86; |
const int panWPDis_x_ADDR = 88; |
const int panWPDis_y_ADDR = 90; |
const int panRSSI_en_ADDR = 92; |
const int panRSSI_x_ADDR = 94; |
const int panRSSI_y_ADDR = 96; |
|
|
// Third set of 8 panels |
const int panCurA_en_ADDR = 98; |
const int panCurA_x_ADDR = 100; |
const int panCurA_y_ADDR = 102; |
const int panCurB_en_ADDR = 104; |
const int panCurB_x_ADDR = 106; |
const int panCurB_y_ADDR = 108; |
const int panAlt_en_ADDR = 110; |
const int panAlt_x_ADDR = 112; |
const int panAlt_y_ADDR = 114; |
const int panVel_en_ADDR = 116; |
const int panVel_x_ADDR = 118; |
const int panVel_y_ADDR = 120; |
const int panThr_en_ADDR = 122; |
const int panThr_x_ADDR = 124; |
const int panThr_y_ADDR = 126; |
const int panFMod_en_ADDR = 128; |
const int panFMod_x_ADDR = 130; |
const int panFMod_y_ADDR = 132; |
const int panHorizon_en_ADDR = 134; |
const int panHorizon_x_ADDR = 136; |
const int panHorizon_y_ADDR = 138; |
|
const int CHK1 = 1000; |
const int CHK2 = 1006; |
|
private void checkBox1_CheckedChanged(object sender, EventArgs e) |
{ |
osdDraw(); |
} |
|
private void OSD_Resize(object sender, EventArgs e) |
{ |
try |
{ |
osdDraw(); |
} |
catch { } |
} |
|
private void BUT_ReadOSD_Click(object sender, EventArgs e) |
{ |
toolStripProgressBar1.Style = ProgressBarStyle.Continuous; |
this.toolStripStatusLabel1.Text = ""; |
|
bool fail = false; |
ArduinoSTK sp; |
|
try |
{ |
if (comPort.IsOpen) |
comPort.Close(); |
|
sp = new ArduinoSTK(); |
sp.PortName = CMB_ComPort.Text; |
sp.BaudRate = 57600; |
sp.DtrEnable = true; |
|
sp.Open(); |
} |
catch { MessageBox.Show("Error opening com port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } |
|
if (sp.connectAP()) |
{ |
try |
{ |
eeprom = sp.download(1024); |
} |
catch (Exception ex) { |
fail = true; |
MessageBox.Show(ex.Message); |
} |
} |
else |
{ |
MessageBox.Show("Failed to talk to bootloader"); |
fail = true; |
} |
|
sp.Close(); |
|
if (!fail) |
{ |
|
for (int a = 0; a < panelItems.Length; a++) |
{ |
if (panelItems[a] != null) |
{ |
if (panelItems[a].Item5 >= 0) |
LIST_items.SetItemCheckState(a, eeprom[panelItems[a].Item5] == 0 ? CheckState.Unchecked : CheckState.Checked); |
|
if (panelItems[a].Item7 >= 0 || panelItems[a].Item6 >= 0) |
panelItems[a] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>(panelItems[a].Item1, panelItems[a].Item2, eeprom[panelItems[a].Item6], eeprom[panelItems[a].Item7], panelItems[a].Item5, panelItems[a].Item6, panelItems[a].Item7); |
} |
} |
} |
|
osdDraw(); |
|
if (!fail) |
MessageBox.Show("Done!"); |
} |
|
|
byte[] readIntelHEXv2(StreamReader sr) |
{ |
byte[] FLASH = new byte[1024 * 1024]; |
|
int optionoffset = 0; |
int total = 0; |
bool hitend = false; |
|
while (!sr.EndOfStream) |
{ |
toolStripProgressBar1.Value = (int)(((float)sr.BaseStream.Position / (float)sr.BaseStream.Length) * 100); |
|
string line = sr.ReadLine(); |
|
if (line.StartsWith(":")) |
{ |
int length = Convert.ToInt32(line.Substring(1, 2), 16); |
int address = Convert.ToInt32(line.Substring(3, 4), 16); |
int option = Convert.ToInt32(line.Substring(7, 2), 16); |
Console.WriteLine("len {0} add {1} opt {2}", length, address, option); |
|
if (option == 0) |
{ |
string data = line.Substring(9, length * 2); |
for (int i = 0; i < length; i++) |
{ |
byte byte1 = Convert.ToByte(data.Substring(i * 2, 2), 16); |
FLASH[optionoffset + address] = byte1; |
address++; |
if ((optionoffset + address) > total) |
total = optionoffset + address; |
} |
} |
else if (option == 2) |
{ |
optionoffset = (int)Convert.ToUInt16(line.Substring(9, 4), 16) << 4; |
} |
else if (option == 1) |
{ |
hitend = true; |
} |
int checksum = Convert.ToInt32(line.Substring(line.Length - 2, 2), 16); |
|
byte checksumact = 0; |
for (int z = 0; z < ((line.Length - 1 - 2) / 2); z++) // minus 1 for : then mins 2 for checksum itself |
{ |
checksumact += Convert.ToByte(line.Substring(z * 2 + 1, 2), 16); |
} |
checksumact = (byte)(0x100 - checksumact); |
|
if (checksumact != checksum) |
{ |
MessageBox.Show("The hex file loaded is invalid, please try again."); |
throw new Exception("Checksum Failed - Invalid Hex"); |
} |
} |
//Regex regex = new Regex(@"^:(..)(....)(..)(.*)(..)$"); // length - address - option - data - checksum |
} |
|
if (!hitend) |
{ |
MessageBox.Show("The hex file did no contain an end flag. aborting"); |
throw new Exception("No end flag in file"); |
} |
|
Array.Resize<byte>(ref FLASH, total); |
|
return FLASH; |
} |
|
void sp_Progress(int progress) |
{ |
toolStripStatusLabel1.Text = "Uploading " + progress + " %"; |
toolStripProgressBar1.Value = progress; |
|
statusStrip1.Refresh(); |
} |
|
private void CHK_pal_CheckedChanged(object sender, EventArgs e) |
{ |
changeToPal(CHK_pal.Checked); |
|
osdDraw(); |
} |
|
private void pALToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) |
{ |
nTSCToolStripMenuItem.Checked = !CHK_pal.Checked; |
} |
|
private void nTSCToolStripMenuItem_CheckStateChanged(object sender, EventArgs e) |
{ |
CHK_pal.Checked = !nTSCToolStripMenuItem.Checked; |
} |
|
private void saveToFileToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
SaveFileDialog sfd = new SaveFileDialog() { Filter = "*.osd|*.osd" }; |
|
sfd.ShowDialog(); |
|
if (sfd.FileName != "") |
{ |
try |
{ |
using (StreamWriter sw = new StreamWriter(sfd.OpenFile())) |
{ |
|
foreach (var item in panelItems) |
{ |
if (item != null) |
sw.WriteLine("{0}\t{1}\t{2}\t{3}", item.Item1, item.Item3, item.Item4, LIST_items.GetItemChecked(LIST_items.Items.IndexOf(item.Item1)).ToString()); |
} |
sw.Close(); |
} |
} |
catch |
{ |
MessageBox.Show("Error writing file"); |
} |
} |
} |
|
private void loadFromFileToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
OpenFileDialog ofd = new OpenFileDialog() { Filter = "*.osd|*.osd" }; |
|
ofd.ShowDialog(); |
|
if (ofd.FileName != "") |
{ |
try |
{ |
using (StreamReader sr = new StreamReader(ofd.OpenFile())) |
{ |
while (!sr.EndOfStream) |
{ |
string[] strings = sr.ReadLine().Split(new char[] {'\t'},StringSplitOptions.RemoveEmptyEntries); |
|
for (int a = 0; a < panelItems.Length; a++) |
{ |
if (panelItems[a] != null && panelItems[a].Item1 == strings[0]) |
{ |
// incase there is an invalid line number or to shore |
try |
{ |
panelItems[a] = new Tuple<string, Func<int, int, int>, int, int, int, int, int>(panelItems[a].Item1, panelItems[a].Item2, int.Parse(strings[1]), int.Parse(strings[2]), panelItems[a].Item5, panelItems[a].Item6, panelItems[a].Item7); |
|
LIST_items.SetItemChecked(a, strings[3] == "True"); |
} |
catch { } |
} |
} |
} |
} |
} |
catch |
{ |
MessageBox.Show("Error Reading file"); |
} |
} |
|
osdDraw(); |
} |
|
private void loadDefaultsToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
setupFunctions(); |
} |
|
private void exitToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
Application.Exit(); |
} |
|
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) |
{ |
getMouseOverItem(e.X, e.Y); |
|
mousedown = false; |
} |
|
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) |
{ |
if (e.Button == System.Windows.Forms.MouseButtons.Left && mousedown == true) |
{ |
int ansW, ansH; |
getCharLoc(e.X, e.Y, out ansW, out ansH); |
if (ansH >= getCenter() && !CHK_pal.Checked) |
{ |
ansH += 3; |
} |
|
NUM_X.Value = Constrain(ansW, 0, basesize.Width - 1); |
NUM_Y.Value = Constrain(ansH, 0, 16 - 1); |
|
pictureBox1.Focus(); |
} |
else |
{ |
mousedown = false; |
} |
} |
|
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) |
{ |
currentlyselected = getMouseOverItem(e.X, e.Y); |
|
mousedown = true; |
} |
|
private void updateFirmwareToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
toolStripProgressBar1.Style = ProgressBarStyle.Continuous; |
this.toolStripStatusLabel1.Text = ""; |
|
OpenFileDialog ofd = new OpenFileDialog(); |
ofd.Filter = "*.hex|*.hex"; |
|
ofd.ShowDialog(); |
|
if (ofd.FileName != "") |
{ |
byte[] FLASH; |
try |
{ |
toolStripStatusLabel1.Text = "Reading Hex File"; |
|
statusStrip1.Refresh(); |
|
FLASH = readIntelHEXv2(new StreamReader(ofd.FileName)); |
} |
catch { MessageBox.Show("Bad Hex File"); return; } |
|
bool fail = false; |
ArduinoSTK sp; |
|
try |
{ |
if (comPort.IsOpen) |
comPort.Close(); |
|
sp = new ArduinoSTK(); |
sp.PortName = CMB_ComPort.Text; |
sp.BaudRate = 57600; |
sp.DtrEnable = true; |
|
sp.Open(); |
} |
catch { MessageBox.Show("Error opening com port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } |
|
toolStripStatusLabel1.Text = "Connecting to Board"; |
|
if (sp.connectAP()) |
{ |
sp.Progress += new ArduinoSTK.ProgressEventHandler(sp_Progress); |
try |
{ |
if (!sp.uploadflash(FLASH, 0, FLASH.Length, 0)) |
{ |
if (sp.IsOpen) |
sp.Close(); |
|
MessageBox.Show("Upload failed. Lost sync. Try using Arduino to upload instead", |
"Error", |
MessageBoxButtons.OK, |
MessageBoxIcon.Warning); |
} |
} |
catch (Exception ex) |
{ |
fail = true; |
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); |
} |
|
} |
else |
{ |
MessageBox.Show("Failed to talk to bootloader"); |
} |
|
sp.Close(); |
|
if (!fail) |
{ |
|
toolStripStatusLabel1.Text = "Done"; |
|
MessageBox.Show("Done!"); |
} |
else |
{ |
toolStripStatusLabel1.Text = "Failed"; |
} |
} |
} |
|
private void customBGPictureToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
OpenFileDialog ofd = new OpenFileDialog(); |
ofd.Filter = "jpg or bmp|*.jpg;*.bmp"; |
|
ofd.ShowDialog(); |
|
if (ofd.FileName != "") |
{ |
try |
{ |
bgpicture = Image.FromFile(ofd.FileName); |
|
} |
catch { MessageBox.Show("Bad Image"); } |
|
osdDraw(); |
} |
} |
|
private void sendTLogToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
|
OpenFileDialog ofd = new OpenFileDialog(); |
ofd.Filter = "Tlog|*.tlog"; |
|
ofd.ShowDialog(); |
|
if (ofd.FileName != "") |
{ |
if (comPort.IsOpen) |
comPort.Close(); |
|
try |
{ |
|
comPort.PortName = CMB_ComPort.Text; |
comPort.BaudRate = 57600; |
comPort.Open(); |
|
} |
catch { MessageBox.Show("Error opening com port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } |
|
BinaryReader br = new BinaryReader(ofd.OpenFile()); |
|
this.toolStripProgressBar1.Style = ProgressBarStyle.Marquee; |
this.toolStripStatusLabel1.Text = "Sending TLOG data..."; |
|
while (br.BaseStream.Position < br.BaseStream.Length && !this.IsDisposed) |
{ |
try |
{ |
byte[] bytes = br.ReadBytes(20); |
|
comPort.Write(bytes, 0, bytes.Length); |
|
System.Threading.Thread.Sleep(5); |
|
Console.Write(comPort.ReadExisting()); |
|
} |
catch { break; } |
|
Application.DoEvents(); |
} |
|
try |
{ |
toolStripProgressBar1.Style = ProgressBarStyle.Continuous; |
toolStripStatusLabel1.Text = ""; |
|
comPort.Close(); |
} |
catch { } |
} |
} |
|
private void OSD_FormClosed(object sender, FormClosedEventArgs e) |
{ |
xmlconfig(true); |
|
} |
|
private void xmlconfig(bool write) |
{ |
if (write || !File.Exists(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml")) |
{ |
try |
{ |
XmlTextWriter xmlwriter = new XmlTextWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml", Encoding.ASCII); |
xmlwriter.Formatting = Formatting.Indented; |
|
xmlwriter.WriteStartDocument(); |
|
xmlwriter.WriteStartElement("Config"); |
|
xmlwriter.WriteElementString("comport", CMB_ComPort.Text); |
|
xmlwriter.WriteElementString("Pal", CHK_pal.Checked.ToString()); |
|
xmlwriter.WriteEndElement(); |
|
xmlwriter.WriteEndDocument(); |
xmlwriter.Close(); |
|
//appconfig.Save(); |
} |
catch (Exception ex) { MessageBox.Show(ex.ToString()); } |
} |
else |
{ |
try |
{ |
using (XmlTextReader xmlreader = new XmlTextReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"config.xml")) |
{ |
while (xmlreader.Read()) |
{ |
xmlreader.MoveToElement(); |
try |
{ |
switch (xmlreader.Name) |
{ |
case "comport": |
string temp = xmlreader.ReadString(); |
CMB_ComPort.Text = temp; |
break; |
case "Pal": |
string temp2 = xmlreader.ReadString(); |
CHK_pal.Checked = (temp2 == "True"); |
break; |
case "Config": |
break; |
case "xml": |
break; |
default: |
if (xmlreader.Name == "") // line feeds |
break; |
break; |
} |
} |
catch (Exception ee) { Console.WriteLine(ee.Message); } // silent fail on bad entry |
} |
} |
} |
catch (Exception ex) { Console.WriteLine("Bad Config File: " + ex.ToString()); } // bad config file |
} |
} |
|
private void updateFontToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
toolStripProgressBar1.Style = ProgressBarStyle.Continuous; |
toolStripStatusLabel1.Text = ""; |
|
OpenFileDialog ofd = new OpenFileDialog(); |
ofd.Filter = "mcm|*.mcm"; |
|
ofd.ShowDialog(); |
|
if (ofd.FileName != "") |
{ |
if (comPort.IsOpen) |
comPort.Close(); |
|
try |
{ |
|
comPort.PortName = CMB_ComPort.Text; |
comPort.BaudRate = 57600; |
|
comPort.Open(); |
|
comPort.DtrEnable = false; |
comPort.RtsEnable = false; |
|
System.Threading.Thread.Sleep(50); |
|
comPort.DtrEnable = true; |
comPort.RtsEnable = true; |
|
System.Threading.Thread.Sleep(2000); |
|
comPort.ReadExisting(); |
|
comPort.WriteLine(""); |
comPort.WriteLine(""); |
comPort.WriteLine(""); |
comPort.WriteLine(""); |
comPort.WriteLine(""); |
|
int timeout = 0; |
|
while (comPort.BytesToRead == 0) |
{ |
System.Threading.Thread.Sleep(500); |
Console.WriteLine("Waiting..."); |
timeout++; |
|
if (timeout > 6) |
{ |
MessageBox.Show("Error entering font mode - No Data"); |
comPort.Close(); |
return; |
} |
} |
|
if (!comPort.ReadLine().Contains("Ready for Font")) |
{ |
MessageBox.Show("Error entering CharSet upload mode - invalid data"); |
comPort.Close(); |
return; |
} |
} |
catch { MessageBox.Show("Error opening com port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } |
|
using (var stream = ofd.OpenFile()) |
{ |
|
BinaryReader br = new BinaryReader(stream); |
StreamReader sr2 = new StreamReader(br.BaseStream); |
|
string device = sr2.ReadLine(); |
|
if (device != "MAX7456") |
{ |
MessageBox.Show("Invalid MCM"); |
comPort.Close(); |
return; |
} |
|
br.BaseStream.Seek(0, SeekOrigin.Begin); |
|
long length = br.BaseStream.Length; |
|
while (br.BaseStream.Position < br.BaseStream.Length && !this.IsDisposed) |
{ |
try |
{ |
toolStripProgressBar1.Value = (int)((br.BaseStream.Position / (float)br.BaseStream.Length) * 100); |
toolStripStatusLabel1.Text = "CharSet Uploading"; |
|
|
int read = 256 * 3;// 163847 / 256 + 1; // 163,847 font file |
if ((br.BaseStream.Position + read) > br.BaseStream.Length) |
{ |
read = (int)(br.BaseStream.Length - br.BaseStream.Position); |
} |
length -= read; |
|
byte[] buffer = br.ReadBytes(read); |
|
comPort.Write(buffer, 0, buffer.Length); |
|
int timeout = 0; |
|
while (comPort.BytesToRead == 0 && read == 768) |
{ |
System.Threading.Thread.Sleep(10); |
timeout++; |
|
if (timeout > 10) |
{ |
MessageBox.Show("CharSet upload failed - no response"); |
comPort.Close(); |
return; |
} |
} |
|
Console.WriteLine(comPort.ReadExisting()); |
|
} |
catch { break; } |
|
Application.DoEvents(); |
} |
|
comPort.WriteLine("\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); |
|
comPort.DtrEnable = false; |
comPort.RtsEnable = false; |
|
System.Threading.Thread.Sleep(50); |
|
comPort.DtrEnable = true; |
comPort.RtsEnable = true; |
|
System.Threading.Thread.Sleep(50); |
|
comPort.Close(); |
|
comPort.DtrEnable = false; |
comPort.RtsEnable = false; |
|
toolStripProgressBar1.Value = 100; |
toolStripStatusLabel1.Text = "CharSet Done"; |
} |
} |
} |
|
private void helpToolStripMenuItem_Click(object sender, EventArgs e) |
{ |
try |
{ |
System.Diagnostics.Process.Start("https://code.google.com/p/arducam-osd/wiki/arducam_osd?tm=6"); |
} |
catch { MessageBox.Show("Webpage open failed... do you have a virus?"); } |
} |
} |
} |