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); /// /// the un-scaled font render image /// Bitmap screen = new Bitmap(30 * 12, 16 * 18); /// /// the scaled to size background control /// Bitmap image = new Bitmap(30 * 12, 16 * 18); /// /// Bitmaps of all the chars created from the mcm /// Bitmap[] chars; /// /// record of what panel is using what squares /// string[][] usedPostion = new string[30][]; /// /// used to track currently selected panel across calls /// string currentlyselected = ""; /// /// used to track current processing panel across calls (because i maintained the original code for panel drawing) /// string processingpanel = ""; /// /// use to draw the red outline box is currentlyselected matchs /// bool selectedrectangle = false; /// /// use to as a invalidator /// bool startup = false; /// /// 328 eeprom memory /// byte[] eeprom = new byte[1024]; /// /// background image /// Image bgpicture; bool mousedown = false; SerialPort comPort = new SerialPort(); Panels pan; Tuple, int, int, int, int, int>[] panelItems = new Tuple, 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, int, int, int, int, int>("Center", pan.panCenter, 13, 8, panCenter_en_ADDR, panCenter_x_ADDR, panCenter_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Pitch", pan.panPitch, 22, 9, panPitch_en_ADDR, panPitch_x_ADDR, panPitch_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Roll", pan.panRoll, 11, 1, panRoll_en_ADDR, panRoll_x_ADDR, panRoll_y_ADDR); panelItems[a++] = new Tuple, 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, 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, int, int, int, int, int>("Visible Sats", pan.panGPSats, 2, 13, panGPSats_en_ADDR, panGPSats_x_ADDR, panGPSats_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("GPS Lock", pan.panGPL, 5, 13, panGPL_en_ADDR, panGPL_x_ADDR, panGPL_y_ADDR); panelItems[a++] = new Tuple, 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, int, int, int, int, int>("Heading Rose", pan.panRose, 16, 14, panRose_en_ADDR, panRose_x_ADDR, panRose_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Heading", pan.panHeading, 24, 13, panHeading_en_ADDR, panHeading_x_ADDR, panHeading_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Heart Beat", pan.panMavBeat, 2, 9, panMavBeat_en_ADDR, panMavBeat_x_ADDR, panMavBeat_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Home Direction", pan.panHomeDir, 14, 3, panHomeDir_en_ADDR, panHomeDir_x_ADDR, panHomeDir_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Home Distance", pan.panHomeDis, 2, 1, panHomeDis_en_ADDR, panHomeDis_x_ADDR, panHomeDis_y_ADDR); //items[a++] = new Tuple, int, int, int, int, int>("WP Dir", pan.panWPDir, 14, 4, panWPDir_en_ADDR, panWPDir_x_ADDR, panWPDir_y_ADDR); //items[a++] = new Tuple, 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, int, int, int, int, int>("Altitude", pan.panAlt, 2, 2, panAlt_en_ADDR, panAlt_x_ADDR, panAlt_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Velocity", pan.panVel, 2, 3, panVel_en_ADDR, panVel_x_ADDR, panVel_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Throttle", pan.panThr, 2, 4, panThr_en_ADDR, panThr_x_ADDR, panThr_y_ADDR); panelItems[a++] = new Tuple, int, int, int, int, int>("Flight Mode", pan.panFlightMode, 17, 13, panFMod_en_ADDR, panFMod_x_ADDR, panFMod_y_ADDR); panelItems[a++] = new Tuple, 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 list = new List(); 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, 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, 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, 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(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, 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?"); } } } }